| name: Check i18n Files and Create PR | name: Check i18n Files and Create PR | ||||
| on: | on: | ||||
| pull_request: | |||||
| types: [closed] | |||||
| push: | |||||
| branches: [main] | branches: [main] | ||||
| paths: | |||||
| - 'web/i18n/en-US/*.ts' | |||||
| permissions: | permissions: | ||||
| contents: write | contents: write | ||||
| jobs: | jobs: | ||||
| check-and-update: | check-and-update: | ||||
| if: github.event.pull_request.merged == true | |||||
| if: github.repository == 'langgenius/dify' | |||||
| runs-on: ubuntu-latest | runs-on: ubuntu-latest | ||||
| defaults: | defaults: | ||||
| run: | run: | ||||
| steps: | steps: | ||||
| - uses: actions/checkout@v4 | - uses: actions/checkout@v4 | ||||
| with: | with: | ||||
| fetch-depth: 2 # last 2 commits | |||||
| fetch-depth: 2 | |||||
| token: ${{ secrets.GITHUB_TOKEN }} | token: ${{ secrets.GITHUB_TOKEN }} | ||||
| - name: Check for file changes in i18n/en-US | - name: Check for file changes in i18n/en-US | ||||
| echo "Changed files: $changed_files" | echo "Changed files: $changed_files" | ||||
| if [ -n "$changed_files" ]; then | if [ -n "$changed_files" ]; then | ||||
| echo "FILES_CHANGED=true" >> $GITHUB_ENV | echo "FILES_CHANGED=true" >> $GITHUB_ENV | ||||
| file_args="" | |||||
| for file in $changed_files; do | |||||
| filename=$(basename "$file" .ts) | |||||
| file_args="$file_args --file=$filename" | |||||
| done | |||||
| echo "FILE_ARGS=$file_args" >> $GITHUB_ENV | |||||
| echo "File arguments: $file_args" | |||||
| else | else | ||||
| echo "FILES_CHANGED=false" >> $GITHUB_ENV | echo "FILES_CHANGED=false" >> $GITHUB_ENV | ||||
| fi | fi | ||||
| - name: Generate i18n translations | - name: Generate i18n translations | ||||
| if: env.FILES_CHANGED == 'true' | if: env.FILES_CHANGED == 'true' | ||||
| run: pnpm run auto-gen-i18n | |||||
| run: pnpm run auto-gen-i18n ${{ env.FILE_ARGS }} | |||||
| - name: Create Pull Request | - name: Create Pull Request | ||||
| if: env.FILES_CHANGED == 'true' | if: env.FILES_CHANGED == 'true' |
| // Add command line argument support | // Add command line argument support | ||||
| const isDryRun = process.argv.includes('--dry-run') | const isDryRun = process.argv.includes('--dry-run') | ||||
| const targetFile = process.argv.find(arg => arg.startsWith('--file='))?.split('=')[1] | |||||
| const targetFiles = process.argv | |||||
| .filter(arg => arg.startsWith('--file=')) | |||||
| .map(arg => arg.split('=')[1]) | |||||
| const targetLang = process.argv.find(arg => arg.startsWith('--lang='))?.split('=')[1] | const targetLang = process.argv.find(arg => arg.startsWith('--lang='))?.split('=')[1] | ||||
| // Rate limiting helper | // Rate limiting helper | ||||
| .map(file => file.replace(/\.ts$/, '')) | .map(file => file.replace(/\.ts$/, '')) | ||||
| // Removed app-debug exclusion, now only skip specific problematic keys | // Removed app-debug exclusion, now only skip specific problematic keys | ||||
| // Filter by target file if specified | |||||
| const filesToProcess = targetFile ? files.filter(f => f === targetFile) : files | |||||
| // Filter by target files if specified | |||||
| const filesToProcess = targetFiles.length > 0 ? files.filter(f => targetFiles.includes(f)) : files | |||||
| const languagesToProcess = targetLang ? [targetLang] : Object.keys(languageKeyMap) | const languagesToProcess = targetLang ? [targetLang] : Object.keys(languageKeyMap) | ||||
| console.log(`📁 Files to process: ${filesToProcess.join(', ')}`) | console.log(`📁 Files to process: ${filesToProcess.join(', ')}`) |
| needEndNode: 'Der Endknoten muss hinzugefügt werden.', | needEndNode: 'Der Endknoten muss hinzugefügt werden.', | ||||
| needAnswerNode: 'Der Antwortknoten muss hinzugefügt werden.', | needAnswerNode: 'Der Antwortknoten muss hinzugefügt werden.', | ||||
| tagBound: 'Anzahl der Apps, die dieses Tag verwenden', | tagBound: 'Anzahl der Apps, die dieses Tag verwenden', | ||||
| currentWorkflow: 'Aktueller Arbeitsablauf', | |||||
| currentView: 'Aktuelle Ansicht', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Umgebungsvariablen', | envPanelTitle: 'Umgebungsvariablen', |
| needEndNode: 'Se debe agregar el nodo Final', | needEndNode: 'Se debe agregar el nodo Final', | ||||
| addBlock: 'Agregar nodo', | addBlock: 'Agregar nodo', | ||||
| tagBound: 'Número de aplicaciones que utilizan esta etiqueta', | tagBound: 'Número de aplicaciones que utilizan esta etiqueta', | ||||
| currentView: 'Vista actual', | |||||
| currentWorkflow: 'Flujo de trabajo actual', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Variables de Entorno', | envPanelTitle: 'Variables de Entorno', |
| needAnswerNode: 'باید گره پاسخ اضافه شود', | needAnswerNode: 'باید گره پاسخ اضافه شود', | ||||
| addBlock: 'نود اضافه کنید', | addBlock: 'نود اضافه کنید', | ||||
| tagBound: 'تعداد برنامههایی که از این برچسب استفاده میکنند', | tagBound: 'تعداد برنامههایی که از این برچسب استفاده میکنند', | ||||
| currentView: 'نمای فعلی', | |||||
| currentWorkflow: 'گردش کار فعلی', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'متغیرهای محیطی', | envPanelTitle: 'متغیرهای محیطی', |
| needAnswerNode: 'Le nœud de réponse doit être ajouté.', | needAnswerNode: 'Le nœud de réponse doit être ajouté.', | ||||
| addBlock: 'Ajouter un nœud', | addBlock: 'Ajouter un nœud', | ||||
| tagBound: 'Nombre d\'applications utilisant cette étiquette', | tagBound: 'Nombre d\'applications utilisant cette étiquette', | ||||
| currentView: 'Vue actuelle', | |||||
| currentWorkflow: 'Flux de travail actuel', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Variables d\'Environnement', | envPanelTitle: 'Variables d\'Environnement', |
| addBlock: 'नोड जोड़ें', | addBlock: 'नोड जोड़ें', | ||||
| needEndNode: 'अंत नोड जोड़ा जाना चाहिए', | needEndNode: 'अंत नोड जोड़ा जाना चाहिए', | ||||
| tagBound: 'इस टैग का उपयोग करने वाले ऐप्स की संख्या', | tagBound: 'इस टैग का उपयोग करने वाले ऐप्स की संख्या', | ||||
| currentView: 'वर्तमान दृश्य', | |||||
| currentWorkflow: 'वर्तमान कार्यप्रवाह', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'पर्यावरण चर', | envPanelTitle: 'पर्यावरण चर', |
| addBlock: 'Aggiungi nodo', | addBlock: 'Aggiungi nodo', | ||||
| needAnswerNode: 'Deve essere aggiunto il nodo di risposta', | needAnswerNode: 'Deve essere aggiunto il nodo di risposta', | ||||
| tagBound: 'Numero di app che utilizzano questo tag', | tagBound: 'Numero di app che utilizzano questo tag', | ||||
| currentWorkflow: 'Flusso di lavoro corrente', | |||||
| currentView: 'Vista corrente', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Variabili d\'Ambiente', | envPanelTitle: 'Variabili d\'Ambiente', |
| needAnswerNode: '답변 노드를 추가해야 합니다.', | needAnswerNode: '답변 노드를 추가해야 합니다.', | ||||
| needEndNode: '종단 노드를 추가해야 합니다.', | needEndNode: '종단 노드를 추가해야 합니다.', | ||||
| tagBound: '이 태그를 사용하는 앱 수', | tagBound: '이 태그를 사용하는 앱 수', | ||||
| currentView: '현재 보기', | |||||
| currentWorkflow: '현재 워크플로', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: '환경 변수', | envPanelTitle: '환경 변수', |
| needEndNode: 'Należy dodać węzeł końcowy', | needEndNode: 'Należy dodać węzeł końcowy', | ||||
| needAnswerNode: 'Węzeł odpowiedzi musi zostać dodany', | needAnswerNode: 'Węzeł odpowiedzi musi zostać dodany', | ||||
| tagBound: 'Liczba aplikacji korzystających z tego tagu', | tagBound: 'Liczba aplikacji korzystających z tego tagu', | ||||
| currentWorkflow: 'Bieżący przepływ pracy', | |||||
| currentView: 'Bieżący widok', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Zmienne Środowiskowe', | envPanelTitle: 'Zmienne Środowiskowe', |
| needEndNode: 'O nó de Fim deve ser adicionado', | needEndNode: 'O nó de Fim deve ser adicionado', | ||||
| needAnswerNode: 'O nó de resposta deve ser adicionado', | needAnswerNode: 'O nó de resposta deve ser adicionado', | ||||
| tagBound: 'Número de aplicativos usando esta tag', | tagBound: 'Número de aplicativos usando esta tag', | ||||
| currentView: 'Visualização atual', | |||||
| currentWorkflow: 'Fluxo de trabalho atual', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Variáveis de Ambiente', | envPanelTitle: 'Variáveis de Ambiente', |
| needAnswerNode: 'Nodul de răspuns trebuie adăugat', | needAnswerNode: 'Nodul de răspuns trebuie adăugat', | ||||
| needEndNode: 'Nodul de sfârșit trebuie adăugat', | needEndNode: 'Nodul de sfârșit trebuie adăugat', | ||||
| tagBound: 'Numărul de aplicații care folosesc acest tag', | tagBound: 'Numărul de aplicații care folosesc acest tag', | ||||
| currentView: 'Vizualizare curentă', | |||||
| currentWorkflow: 'Flux de lucru curent', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Variabile de Mediu', | envPanelTitle: 'Variabile de Mediu', |
| needAnswerNode: 'В узел ответа необходимо добавить', | needAnswerNode: 'В узел ответа необходимо добавить', | ||||
| needEndNode: 'Узел конца должен быть добавлен', | needEndNode: 'Узел конца должен быть добавлен', | ||||
| tagBound: 'Количество приложений, использующих этот тег', | tagBound: 'Количество приложений, использующих этот тег', | ||||
| currentView: 'Текущий вид', | |||||
| currentWorkflow: 'Текущий рабочий процесс', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Переменные среды', | envPanelTitle: 'Переменные среды', |
| configure: 'Konfiguriraj', | configure: 'Konfiguriraj', | ||||
| inRunMode: 'V načinu izvajanja', | inRunMode: 'V načinu izvajanja', | ||||
| tagBound: 'Število aplikacij, ki uporabljajo to oznako', | tagBound: 'Število aplikacij, ki uporabljajo to oznako', | ||||
| currentView: 'Trenutni pogled', | |||||
| currentWorkflow: 'Trenutni potek dela', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| modal: { | modal: { |
| addBlock: 'เพิ่มโนด', | addBlock: 'เพิ่มโนด', | ||||
| needEndNode: 'ต้องเพิ่มโหนดจบ', | needEndNode: 'ต้องเพิ่มโหนดจบ', | ||||
| tagBound: 'จำนวนแอปพลิเคชันที่ใช้แท็กนี้', | tagBound: 'จำนวนแอปพลิเคชันที่ใช้แท็กนี้', | ||||
| currentWorkflow: 'เวิร์กโฟลว์ปัจจุบัน', | |||||
| currentView: 'ปัจจุบัน View', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'ตัวแปรสภาพแวดล้อม', | envPanelTitle: 'ตัวแปรสภาพแวดล้อม', |
| needAnswerNode: 'Cevap düğümü eklenmelidir.', | needAnswerNode: 'Cevap düğümü eklenmelidir.', | ||||
| needEndNode: 'Son düğüm eklenmelidir', | needEndNode: 'Son düğüm eklenmelidir', | ||||
| tagBound: 'Bu etiketi kullanan uygulama sayısı', | tagBound: 'Bu etiketi kullanan uygulama sayısı', | ||||
| currentView: 'Geçerli Görünüm', | |||||
| currentWorkflow: 'Mevcut İş Akışı', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Çevre Değişkenleri', | envPanelTitle: 'Çevre Değişkenleri', |
| needEndNode: 'Необхідно додати кінцевий вузол', | needEndNode: 'Необхідно додати кінцевий вузол', | ||||
| needAnswerNode: 'Вузол Відповіді повинен бути доданий', | needAnswerNode: 'Вузол Відповіді повинен бути доданий', | ||||
| tagBound: 'Кількість додатків, що використовують цей тег', | tagBound: 'Кількість додатків, що використовують цей тег', | ||||
| currentView: 'Поточний вигляд', | |||||
| currentWorkflow: 'Поточний робочий процес', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Змінні середовища', | envPanelTitle: 'Змінні середовища', |
| addBlock: 'Thêm Node', | addBlock: 'Thêm Node', | ||||
| needEndNode: 'Nút Kết thúc phải được thêm vào', | needEndNode: 'Nút Kết thúc phải được thêm vào', | ||||
| tagBound: 'Số lượng ứng dụng sử dụng thẻ này', | tagBound: 'Số lượng ứng dụng sử dụng thẻ này', | ||||
| currentWorkflow: 'Quy trình làm việc hiện tại', | |||||
| currentView: 'Hiện tại View', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: 'Biến Môi Trường', | envPanelTitle: 'Biến Môi Trường', |
| exportImage: '匯出圖像', | exportImage: '匯出圖像', | ||||
| exportJPEG: '匯出為 JPEG', | exportJPEG: '匯出為 JPEG', | ||||
| tagBound: '使用此標籤的應用程式數量', | tagBound: '使用此標籤的應用程式數量', | ||||
| currentView: '當前檢視', | |||||
| currentWorkflow: '當前工作流程', | |||||
| }, | }, | ||||
| env: { | env: { | ||||
| envPanelTitle: '環境變數', | envPanelTitle: '環境變數', |