mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[loc] add a rufus.loc validation script and fix multiple issues
This commit is contained in:
parent
0eb41e4efb
commit
0ae39f2ba3
3 changed files with 205 additions and 30 deletions
|
@ -125,6 +125,7 @@ t IDC_START "Start"
|
||||||
g IDD_ABOUTBOX
|
g IDD_ABOUTBOX
|
||||||
t IDD_ABOUTBOX "About Rufus"
|
t IDD_ABOUTBOX "About Rufus"
|
||||||
t IDC_ABOUT_LICENSE "License"
|
t IDC_ABOUT_LICENSE "License"
|
||||||
|
t IDOK "OK"
|
||||||
|
|
||||||
# About -> License dialog
|
# About -> License dialog
|
||||||
g IDD_LICENSE
|
g IDD_LICENSE
|
||||||
|
@ -2382,7 +2383,6 @@ t IDS_FORMAT_OPTIONS_TXT "選項"
|
||||||
t IDC_BAD_BLOCKS "檢查損毀磁區,測試次數"
|
t IDC_BAD_BLOCKS "檢查損毀磁區,測試次數"
|
||||||
t IDC_QUICK_FORMAT "快速格式化"
|
t IDC_QUICK_FORMAT "快速格式化"
|
||||||
t IDC_EXTENDED_LABEL "建立延伸標籤及圖示"
|
t IDC_EXTENDED_LABEL "建立延伸標籤及圖示"
|
||||||
t IDC_LOG "記錄檔"
|
|
||||||
t IDS_STATUS_TXT "狀態"
|
t IDS_STATUS_TXT "狀態"
|
||||||
t IDCANCEL "離開"
|
t IDCANCEL "離開"
|
||||||
t IDC_START "執行"
|
t IDC_START "執行"
|
||||||
|
@ -2774,11 +2774,11 @@ t MSG_298 "你選擇的 ISO 映像檔不符合它所宣告的大小: 缺少 %s !
|
||||||
t MSG_299 "時間戳記驗證錯誤"
|
t MSG_299 "時間戳記驗證錯誤"
|
||||||
t MSG_300 "Rufus 不能驗證下載的更新其時間戳記比現有的執行檔還新。\n\n"
|
t MSG_300 "Rufus 不能驗證下載的更新其時間戳記比現有的執行檔還新。\n\n"
|
||||||
"為避免可能的資安攻擊,更新流程已停止且下載的更新檔將會刪除。更多詳情請參見記錄檔。"
|
"為避免可能的資安攻擊,更新流程已停止且下載的更新檔將會刪除。更多詳情請參見記錄檔。"
|
||||||
MSG_301 "顯示應用程式設定"
|
t MSG_301 "顯示應用程式設定"
|
||||||
MSG_302 "顯示此應用程式資訊"
|
t MSG_302 "顯示此應用程式資訊"
|
||||||
MSG_303 "顯示記錄檔"
|
t MSG_303 "顯示記錄檔"
|
||||||
MSG_304 "建立選擇的裝置的磁碟映像"
|
t MSG_304 "建立選擇的裝置的磁碟映像"
|
||||||
MSG_305 "是否要使用此裝置來安裝 Windows 在另一個磁碟上,"
|
t MSG_305 "是否要使用此裝置來安裝 Windows 在另一個磁碟上,"
|
||||||
"或是要直接在此磁碟上執行 Windows (Windows To Go)。"
|
"或是要直接在此磁碟上執行 Windows (Windows To Go)。"
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -3739,7 +3739,6 @@ t IDNO "Nej"
|
||||||
|
|
||||||
# Log dialog
|
# Log dialog
|
||||||
g IDD_LOG
|
g IDD_LOG
|
||||||
t IDD_LOG "Log"
|
|
||||||
t IDC_LOG_CLEAR "Slet"
|
t IDC_LOG_CLEAR "Slet"
|
||||||
t IDC_LOG_SAVE "Gem"
|
t IDC_LOG_SAVE "Gem"
|
||||||
t IDCANCEL "Luk"
|
t IDCANCEL "Luk"
|
||||||
|
@ -4023,7 +4022,7 @@ t MSG_202 "Scanner image..."
|
||||||
t MSG_203 "Fejl opstod ved scanning af image"
|
t MSG_203 "Fejl opstod ved scanning af image"
|
||||||
t MSG_204 "Forældet %s fundet"
|
t MSG_204 "Forældet %s fundet"
|
||||||
t MSG_205 "ISO-image: %s"
|
t MSG_205 "ISO-image: %s"
|
||||||
t MSG_206 "Manglende %s fil
|
t MSG_206 "Manglende %s fil"
|
||||||
t MSG_207 "Ny disk"
|
t MSG_207 "Ny disk"
|
||||||
t MSG_208 "%d enhed fundet"
|
t MSG_208 "%d enhed fundet"
|
||||||
t MSG_209 "%d enheder fundet"
|
t MSG_209 "%d enheder fundet"
|
||||||
|
@ -5465,7 +5464,6 @@ t IDYES "Ja"
|
||||||
t IDNO "Nein"
|
t IDNO "Nein"
|
||||||
|
|
||||||
g IDD_LOG
|
g IDD_LOG
|
||||||
t IDD_LOG "Log"
|
|
||||||
t IDC_LOG_SAVE "Speichern"
|
t IDC_LOG_SAVE "Speichern"
|
||||||
t IDC_LOG_CLEAR "Löschen"
|
t IDC_LOG_CLEAR "Löschen"
|
||||||
t IDCANCEL "Schließen"
|
t IDCANCEL "Schließen"
|
||||||
|
@ -6071,7 +6069,7 @@ t MSG_109 "0x%02X (Δίσκος %d)"
|
||||||
t MSG_110 "Το MS-DOS δεν μπορεί να κάνει εκκίνηση από ένα δίσκο χρησιμοποιώντας μέγεθος συμπλέγματος 64 kilobyte.\n"
|
t MSG_110 "Το MS-DOS δεν μπορεί να κάνει εκκίνηση από ένα δίσκο χρησιμοποιώντας μέγεθος συμπλέγματος 64 kilobyte.\n"
|
||||||
"Παρακαλώ αλλάξτε το μέγεθος συμπλέγματος ή χρησιμοποιήστε το FreeDOS."
|
"Παρακαλώ αλλάξτε το μέγεθος συμπλέγματος ή χρησιμοποιήστε το FreeDOS."
|
||||||
t MSG_111 "Μη συμβατό μέγεθος συμπλέγματος"
|
t MSG_111 "Μη συμβατό μέγεθος συμπλέγματος"
|
||||||
t MSG_112 "Η διαμόρφωση μεγάλων τόμων UDF ίσως διαρκέσει αρκετά." Ο χρόνος διαμόρφωσης, στις ταχύτητες του USB 2.0 "
|
t MSG_112 "Η διαμόρφωση μεγάλων τόμων UDF ίσως διαρκέσει αρκετά. Ο χρόνος διαμόρφωσης, στις ταχύτητες του USB 2.0 "
|
||||||
"είναι %d:%02d. Κατά την διάρκεια της διαμόρφωσης η μπάρα προόδου θα είναι στατική. Παρακαλώ περιμένετε!"
|
"είναι %d:%02d. Κατά την διάρκεια της διαμόρφωσης η μπάρα προόδου θα είναι στατική. Παρακαλώ περιμένετε!"
|
||||||
t MSG_113 "Mεγάλος τόμος UDF"
|
t MSG_113 "Mεγάλος τόμος UDF"
|
||||||
t MSG_114 "Αυτό το είδωλο χρησιμοποιεί το Syslinux %s%s παρόλα αυτά η εφαρμογή(Rufus) εμπεριέχει μόνο τα αρχεία εγκατάστασης του "
|
t MSG_114 "Αυτό το είδωλο χρησιμοποιεί το Syslinux %s%s παρόλα αυτά η εφαρμογή(Rufus) εμπεριέχει μόνο τα αρχεία εγκατάστασης του "
|
||||||
|
@ -6261,7 +6259,7 @@ t MSG_281 "(Παρακαλώ επιλέξτε κάποιο είδωλο)"
|
||||||
t MSG_282 "Κλείδωμα μονάδας USB"
|
t MSG_282 "Κλείδωμα μονάδας USB"
|
||||||
t MSG_283 "Μη έγκυρη ψηφιακή υπογραφή"
|
t MSG_283 "Μη έγκυρη ψηφιακή υπογραφή"
|
||||||
t MSG_284 "Το εκτελέσιμο αρχείο που κατεβάσατε δεν περιλαμβάνει ψηφιακή υπογραφή."
|
t MSG_284 "Το εκτελέσιμο αρχείο που κατεβάσατε δεν περιλαμβάνει ψηφιακή υπογραφή."
|
||||||
τ MSG_285 "Το εκτελέσιμο αρχείο που κατεβάσατε έχει υπογραφτεί από τον/την '%s'.\nΑύτη η υπογραφή δεν "
|
t MSG_285 "Το εκτελέσιμο αρχείο που κατεβάσατε έχει υπογραφτεί από τον/την '%s'.\nΑύτη η υπογραφή δεν "
|
||||||
"αναγνωρίζεται από το Rufus. Ενδεχομένως να υπάρχει συσχέτιση με κάποια κακόβουλη προσπάθεια...\n"
|
"αναγνωρίζεται από το Rufus. Ενδεχομένως να υπάρχει συσχέτιση με κάποια κακόβουλη προσπάθεια...\n"
|
||||||
"Είστε σίγουροι ότι θέλετε να εκτελέσετε αυτό το αρχείο?"
|
"Είστε σίγουροι ότι θέλετε να εκτελέσετε αυτό το αρχείο?"
|
||||||
t MSG_286 "Άδειασμα δίσκου: %0.1f%% ολοκληρώθηκε"
|
t MSG_286 "Άδειασμα δίσκου: %0.1f%% ολοκληρώθηκε"
|
||||||
|
@ -6721,9 +6719,9 @@ t MSG_290 "מצב מיון קבצים באינדקס"
|
||||||
t MSG_291 "בחר/י/י גרסה"
|
t MSG_291 "בחר/י/י גרסה"
|
||||||
t MSG_292 "נא לבחור גרסת windows להתקנה:"
|
t MSG_292 "נא לבחור גרסת windows להתקנה:"
|
||||||
t MSG_293 "גירסת Windows לא נתמכת"
|
t MSG_293 "גירסת Windows לא נתמכת"
|
||||||
t MSG_294 "גרסת ה windows הזו לא נתמכת יותר ע"י רופוס."
|
t MSG_294 "גרסת ה windows הזו לא נתמכת יותר ע י רופוס."
|
||||||
t MSG_295 "אזהרה: גרסה לא רשמית"
|
t MSG_295 "אזהרה: גרסה לא רשמית"
|
||||||
t MSG_296 "גרסה זו של רופוס לא נוצרה ע"י מפתחה הרשמי. \n\nהאם את/ה בטוח/ה שברצונך להריץ אותה?"
|
t MSG_296 "גרסה זו של רופוס לא נוצרה ע י מפתחה הרשמי. \n\nהאם את/ה בטוח/ה שברצונך להריץ אותה?"
|
||||||
t MSG_297 "קובץ ISO קטוע זוהה"
|
t MSG_297 "קובץ ISO קטוע זוהה"
|
||||||
t MSG_298 "קובץ ה ISO שבחרת לא מתאים לגודלו המוצהר: מידע בגודל של כ %s חסר!\n\nאםהורדת "
|
t MSG_298 "קובץ ה ISO שבחרת לא מתאים לגודלו המוצהר: מידע בגודל של כ %s חסר!\n\nאםהורדת "
|
||||||
"את הקובץ הזה מהאינטרנט, את/ה צריכ/ה להוריד אותו שוב ולוודא שה checksum שלו ולוודאשביקורת ה MD5 או SHA מתאימים "
|
"את הקובץ הזה מהאינטרנט, את/ה צריכ/ה להוריד אותו שוב ולוודא שה checksum שלו ולוודאשביקורת ה MD5 או SHA מתאימים "
|
||||||
|
@ -7200,7 +7198,6 @@ t IDNO "Tidak"
|
||||||
|
|
||||||
# Log dialog
|
# Log dialog
|
||||||
g IDD_LOG
|
g IDD_LOG
|
||||||
t IDD_LOG "Log"
|
|
||||||
t IDC_LOG_CLEAR "Bersihkan"
|
t IDC_LOG_CLEAR "Bersihkan"
|
||||||
t IDC_LOG_SAVE "Simpan"
|
t IDC_LOG_SAVE "Simpan"
|
||||||
t IDCANCEL "Tutup"
|
t IDCANCEL "Tutup"
|
||||||
|
@ -9881,7 +9878,6 @@ t IDNO "Tidak"
|
||||||
|
|
||||||
# Log dialog
|
# Log dialog
|
||||||
g IDD_LOG
|
g IDD_LOG
|
||||||
t IDD_LOG "Log"
|
|
||||||
t IDC_LOG_CLEAR "Bersihkan"
|
t IDC_LOG_CLEAR "Bersihkan"
|
||||||
t IDC_LOG_SAVE "Simpan"
|
t IDC_LOG_SAVE "Simpan"
|
||||||
t IDCANCEL "Tutup"
|
t IDCANCEL "Tutup"
|
||||||
|
@ -10531,8 +10527,8 @@ t MSG_121 "Vis %s"
|
||||||
t MSG_122 "Skjul %s"
|
t MSG_122 "Skjul %s"
|
||||||
# Tooltips
|
# Tooltips
|
||||||
# Partition Scheme and Target Type
|
# Partition Scheme and Target Type
|
||||||
t MSG_150 ""Datamaskin typen du planlegger å bruke denne oppstartbare stasjonen med. Det er ditt ansvar å avgjøre om"
|
t MSG_150 "Datamaskin typen du planlegger å bruke denne oppstartbare stasjonen med. Det er ditt ansvar å avgjøre om "
|
||||||
"målet ditt er av BIOS eller UEFI-typen før du begynner å lage stasjonen, da det kan mislykkes å starte opp ellers."
|
"målet ditt er av BIOS eller UEFI-typen før du begynner å lage stasjonen, da det kan mislykkes å starte opp ellers."
|
||||||
t MSG_151 "'UEFI-CSM' betyr at enheten bare starter opp i BIOS-emuleringsmodus (også kjent som 'Legacy Mode') under UEFI, og ikke i innebygde UEFI-modus."
|
t MSG_151 "'UEFI-CSM' betyr at enheten bare starter opp i BIOS-emuleringsmodus (også kjent som 'Legacy Mode') under UEFI, og ikke i innebygde UEFI-modus."
|
||||||
t MSG_152 "'ikke-CSM' betyr at enheten bare starter opp i innebygde UEFI-modus, og ikke i BIOS-emuleringsmodus (også kjent som 'Legacy Mode')."
|
t MSG_152 "'ikke-CSM' betyr at enheten bare starter opp i innebygde UEFI-modus, og ikke i BIOS-emuleringsmodus (også kjent som 'Legacy Mode')."
|
||||||
t MSG_153 "Testmønster: 0x%02X"
|
t MSG_153 "Testmønster: 0x%02X"
|
||||||
|
@ -11296,7 +11292,6 @@ t IDNO "Nie"
|
||||||
|
|
||||||
# Log dialog
|
# Log dialog
|
||||||
g IDD_LOG
|
g IDD_LOG
|
||||||
t IDD_LOG "Log"
|
|
||||||
t IDC_LOG_CLEAR "Wyczyść"
|
t IDC_LOG_CLEAR "Wyczyść"
|
||||||
t IDC_LOG_SAVE "Zapisz"
|
t IDC_LOG_SAVE "Zapisz"
|
||||||
t IDCANCEL "Zamknij"
|
t IDCANCEL "Zamknij"
|
||||||
|
@ -12513,7 +12508,7 @@ t MSG_189 "Esta imagem ISO não é compatível com o sistema de ficheiros seleci
|
||||||
t MSG_190 "Detetada unidade incompatível"
|
t MSG_190 "Detetada unidade incompatível"
|
||||||
# See MSG_235 for where the 2 messages below are being used:
|
# See MSG_235 for where the 2 messages below are being used:
|
||||||
t MSG_191 "Escrita"
|
t MSG_191 "Escrita"
|
||||||
t MSG_192 "Leitura""
|
t MSG_192 "Leitura"
|
||||||
t MSG_193 "Transferido %s"
|
t MSG_193 "Transferido %s"
|
||||||
t MSG_194 "Não é possível transferir %s"
|
t MSG_194 "Não é possível transferir %s"
|
||||||
# eg. "Using embedded version of Grub2 file(s)"
|
# eg. "Using embedded version of Grub2 file(s)"
|
||||||
|
@ -12624,7 +12619,7 @@ t MSG_275 "A imagem selecionada é uma imagem 'ISOHybrid'. Isto significa que po
|
||||||
"No entanto, se existirem erros durante o arranque, pode tentar escrever no modo %s.\n\n"
|
"No entanto, se existirem erros durante o arranque, pode tentar escrever no modo %s.\n\n"
|
||||||
"Selecione o modo que realmente pretende para escrever esta imagem:"
|
"Selecione o modo que realmente pretende para escrever esta imagem:"
|
||||||
t MSG_276 "Escrever no modo %s (Recomendado)"
|
t MSG_276 "Escrever no modo %s (Recomendado)"
|
||||||
t MSG_277 "Escrever no modo %s
|
t MSG_277 "Escrever no modo %s"
|
||||||
t MSG_279 "Não inicializável"
|
t MSG_279 "Não inicializável"
|
||||||
t MSG_280 "Disco ou imagem ISO"
|
t MSG_280 "Disco ou imagem ISO"
|
||||||
t MSG_281 "%s (Por favor, selecione)"
|
t MSG_281 "%s (Por favor, selecione)"
|
||||||
|
@ -14386,8 +14381,8 @@ t MSG_277 "Zápis v režime %s"
|
||||||
t MSG_279 "Nie je možné bootovať"
|
t MSG_279 "Nie je možné bootovať"
|
||||||
t MSG_280 "Výber obrazu"
|
t MSG_280 "Výber obrazu"
|
||||||
t MSG_281 "(Vyberte obraz)"
|
t MSG_281 "(Vyberte obraz)"
|
||||||
t MSG_282 "Uzamknutie USB zariadenia
|
t MSG_282 "Uzamknutie USB zariadenia"
|
||||||
t MSG_283 "Neplatný podpis
|
t MSG_283 "Neplatný podpis"
|
||||||
t MSG_284 "Stiahnutému inštalátoru chýba digitálny podpis."
|
t MSG_284 "Stiahnutému inštalátoru chýba digitálny podpis."
|
||||||
t MSG_285 "Stiahnutý inštalátor podpísal '%s'.\nTento podpis nebol rozoznaný a môže znamenať "
|
t MSG_285 "Stiahnutý inštalátor podpísal '%s'.\nTento podpis nebol rozoznaný a môže znamenať "
|
||||||
"nejakú formu škodlivej aktivity...\nSte si istý, že chcete spustiť tento súbor?"
|
"nejakú formu škodlivej aktivity...\nSte si istý, že chcete spustiť tento súbor?"
|
||||||
|
@ -15719,7 +15714,7 @@ t MSG_297 "Ej komplett ISO-fil"
|
||||||
t MSG_298 "ISO-filen du har valt matchar inte den angivna storleken: %s av data saknas!\n\nOm du har hämtat den här filen från internet, "
|
t MSG_298 "ISO-filen du har valt matchar inte den angivna storleken: %s av data saknas!\n\nOm du har hämtat den här filen från internet, "
|
||||||
"prova då med att ladda ner filen igen och verifiera att checksumman MD5 eller SHA stämmer överens med den officiella filen.\n\n"
|
"prova då med att ladda ner filen igen och verifiera att checksumman MD5 eller SHA stämmer överens med den officiella filen.\n\n"
|
||||||
"Tips: Du kan beräkna MD5 eller SHA i Rufus genom att klicka på knappen '#'."
|
"Tips: Du kan beräkna MD5 eller SHA i Rufus genom att klicka på knappen '#'."
|
||||||
t MSG_299 "Valideringfel av tidsstämpeln
|
t MSG_299 "Valideringfel av tidsstämpeln"
|
||||||
t MSG_300 "Rufus kunde inte validera att tidsstämpeln på den nerladdade uppdateringen är nyare än den gamla.\n\n"
|
t MSG_300 "Rufus kunde inte validera att tidsstämpeln på den nerladdade uppdateringen är nyare än den gamla.\n\n"
|
||||||
"För att förhindra potentiella angreppsscenarier, har uppdateringsprocessen avslutats och "
|
"För att förhindra potentiella angreppsscenarier, har uppdateringsprocessen avslutats och "
|
||||||
"den nerladdade filen har tagits bort. Kontrollera loggen för mer information."
|
"den nerladdade filen har tagits bort. Kontrollera loggen för mer information."
|
||||||
|
@ -15783,7 +15778,6 @@ t IDNO "ไม่ใช่"
|
||||||
|
|
||||||
# Log dialog
|
# Log dialog
|
||||||
g IDD_LOG
|
g IDD_LOG
|
||||||
t IDD_LOG "Log"
|
|
||||||
t IDC_LOG_CLEAR "ล้าง"
|
t IDC_LOG_CLEAR "ล้าง"
|
||||||
t IDC_LOG_SAVE "บันทึก"
|
t IDC_LOG_SAVE "บันทึก"
|
||||||
t IDCANCEL "ปิด"
|
t IDCANCEL "ปิด"
|
||||||
|
@ -16194,7 +16188,7 @@ t MSG_298 "อิมเมจ ISO ที่คุณเลือกมีคุ
|
||||||
"อินเทอร์เน็ต กรุณาดาวน์โหลดไฟล์อีกครั้ง และตรวจสอบว่าไฟล์นั้นมี MD5 หรือ SHA checksums ตรงกับไฟล์จากผู้ผลิต\n\nโปรดจำไว้ว่า"
|
"อินเทอร์เน็ต กรุณาดาวน์โหลดไฟล์อีกครั้ง และตรวจสอบว่าไฟล์นั้นมี MD5 หรือ SHA checksums ตรงกับไฟล์จากผู้ผลิต\n\nโปรดจำไว้ว่า"
|
||||||
"คุณสามารถตรวจสอบ checksum ของไฟล์ดังกล่าวได้จากโปรแกรม Rufus โดยกดปุ่ม '#'"
|
"คุณสามารถตรวจสอบ checksum ของไฟล์ดังกล่าวได้จากโปรแกรม Rufus โดยกดปุ่ม '#'"
|
||||||
t MSG_299 "การตรวจสอบ Timestamp ผิดพลาด"
|
t MSG_299 "การตรวจสอบ Timestamp ผิดพลาด"
|
||||||
t MSG 300 "Rufus ไม่สามารถยืนยันความถูกต้องของ Timestamp ของโปรแกรมปรับรุ่นที่เพิ่งดาวน์โหลดมาว่าใหม่กว่า"
|
t MSG_300 "Rufus ไม่สามารถยืนยันความถูกต้องของ Timestamp ของโปรแกรมปรับรุ่นที่เพิ่งดาวน์โหลดมาว่าใหม่กว่า"
|
||||||
"รุ่นที่กำลังใช้อยู่ในปัจจุบัน.\n\nเพื่อป้องกันความเป็นไปได้ที่จะถูกโจมตี การปรับรุ่นได้ถูกยกเลิกและลบทิ้งไป"
|
"รุ่นที่กำลังใช้อยู่ในปัจจุบัน.\n\nเพื่อป้องกันความเป็นไปได้ที่จะถูกโจมตี การปรับรุ่นได้ถูกยกเลิกและลบทิ้งไป"
|
||||||
"กรุณาดู Log เพื่ออ่านรายละเอียดเพิ่มเติม"
|
"กรุณาดู Log เพื่ออ่านรายละเอียดเพิ่มเติม"
|
||||||
t MSG_301 "แสดงการตั้งค่าของโปรแกรม"
|
t MSG_301 "แสดงการตั้งค่าของโปรแกรม"
|
||||||
|
|
181
res/localization/translation_check.py
Normal file
181
res/localization/translation_check.py
Normal file
|
@ -0,0 +1,181 @@
|
||||||
|
#! /usr/bin/env python3
|
||||||
|
# -*- coding=utf-8 -*-
|
||||||
|
|
||||||
|
# LIMITATIONS
|
||||||
|
# this script was written as fast as possbile so it is broken/minimalistic:
|
||||||
|
# it assumes the first language in rufus.loc in English
|
||||||
|
# written for 1.0.23, things may have changes since then
|
||||||
|
# horrible code below
|
||||||
|
# in multiline messages checks only first one if is the same as in English (should be enough for now)
|
||||||
|
|
||||||
|
import sys
|
||||||
|
# regex
|
||||||
|
import re
|
||||||
|
# splitting by "quotes"
|
||||||
|
import shlex
|
||||||
|
# pretty print for debug
|
||||||
|
import pprint
|
||||||
|
|
||||||
|
# global variables, I'm no python expert so I'll just dump everything here
|
||||||
|
languages = []
|
||||||
|
unavailable = []
|
||||||
|
untranslated = []
|
||||||
|
version = "0.0.0"
|
||||||
|
ignored_messages = ['IDOK', 'MSG_020', 'MSG_021', 'MSG_022', 'MSG_023', 'MSG_024', 'MSG_025', 'MSG_026', 'MSG_027', 'MSG_028', 'MSG_118']
|
||||||
|
|
||||||
|
class Language:
|
||||||
|
code = "xx-XX"
|
||||||
|
name = "None"
|
||||||
|
version = "0.0.0"
|
||||||
|
base = "en-US"
|
||||||
|
groups = {}
|
||||||
|
#{ "group" => { "MNEMONIC => "transl" }, group2 = (...) }
|
||||||
|
def __init__(self):
|
||||||
|
self.groups = {}
|
||||||
|
|
||||||
|
def get_current_group(self):
|
||||||
|
if len(self.groups) > 0:
|
||||||
|
return list(self.groups.keys())[len(self.groups)-1]
|
||||||
|
else:
|
||||||
|
return "none"
|
||||||
|
def get_current_message(self):
|
||||||
|
current_group = self.get_current_group()
|
||||||
|
if len(self.groups[current_group]) > 0:
|
||||||
|
return list(self.groups[current_group].keys())[len(self.groups[current_group])-1]
|
||||||
|
else:
|
||||||
|
return "none"
|
||||||
|
|
||||||
|
|
||||||
|
def print_no_new(data):
|
||||||
|
print(data, end="")
|
||||||
|
|
||||||
|
def load_languages():
|
||||||
|
print_no_new("loading rufus.loc file...\t")
|
||||||
|
sys.stdout.flush()
|
||||||
|
#load file
|
||||||
|
lines = [line.strip() for line in open("rufus.loc", "r", encoding="utf8")]
|
||||||
|
|
||||||
|
# remove comments
|
||||||
|
#TODO properly remove comments, now it'll break messages with "#" in them, I just assumes there aren't any
|
||||||
|
#lines = [re.sub(re.compile("#(.*)?" ) ,"" ,line) for line in lines]
|
||||||
|
# remove empty lines
|
||||||
|
#lines = filter(None, lines)
|
||||||
|
|
||||||
|
i = -1
|
||||||
|
exceptions = []
|
||||||
|
for index, line in enumerate(lines):
|
||||||
|
try:
|
||||||
|
if line != "" and line[0] != "#":
|
||||||
|
if line[0] == "l":
|
||||||
|
#this is language declaration
|
||||||
|
i += 1
|
||||||
|
temp_language = Language()
|
||||||
|
temp_language.name = shlex.split(line)[2]
|
||||||
|
temp_language.code = shlex.split(line)[1]
|
||||||
|
languages.append(temp_language)
|
||||||
|
# print("current language: "+languages[i].name)
|
||||||
|
|
||||||
|
elif line[0] == "v":
|
||||||
|
#this is language declaration
|
||||||
|
version = line.split(" ")[1]
|
||||||
|
languages[i].version = line.split(" ")[1]
|
||||||
|
elif line[0] == "b":
|
||||||
|
languages[i].base = shlex.split(line)[1]
|
||||||
|
if line != "b \"en-US\"":
|
||||||
|
print(languages[i].name + " is based on another translation: " + languages[i].base)
|
||||||
|
elif line[0] == "g":
|
||||||
|
languages[i].groups[shlex.split(line)[1]] = {}
|
||||||
|
# print("current group: "+languages[i].get_current_group())
|
||||||
|
elif line[0] == "t":
|
||||||
|
pass
|
||||||
|
try:
|
||||||
|
temp_translation = shlex.split(line) #errors
|
||||||
|
except ValueError as err:
|
||||||
|
exceptions.append(str(err)+" in line "+ str(index+1)+": "+line)
|
||||||
|
languages[i].groups[languages[i].get_current_group()][temp_translation[1]] = temp_translation[2]
|
||||||
|
#print("cur transl: "+languages[i].get_current_message())
|
||||||
|
elif line[0] == "\"":
|
||||||
|
pass
|
||||||
|
elif line[0] == "a":
|
||||||
|
pass #only RTL indication as for now
|
||||||
|
else:
|
||||||
|
raise Exception("unknown line "+str(index+1)+ ": "+line)
|
||||||
|
except Exception as error:
|
||||||
|
exceptions.append("Error: "+ repr(error))
|
||||||
|
|
||||||
|
|
||||||
|
if len(exceptions) > 0:
|
||||||
|
print("[WARNING]")
|
||||||
|
print("\n".join(exceptions))
|
||||||
|
else:
|
||||||
|
print("[OK]")
|
||||||
|
print()
|
||||||
|
print ("Found " + str(len(languages)) + " languages")
|
||||||
|
version = languages[0].version
|
||||||
|
print("Assuming " + version + " is the latest version. Only languages with this version will be checked...")
|
||||||
|
#comment if you want to check every single language, not only newest versions
|
||||||
|
languages[:] = [language for language in languages if language.version==version]
|
||||||
|
print (str(len(languages)) + " languages in " + languages[0].version + " version:")
|
||||||
|
print ("\n".join(language.name for language in languages))
|
||||||
|
print()
|
||||||
|
|
||||||
|
def check_unavailable():
|
||||||
|
print_no_new("Checking for possible missing messages...\t")
|
||||||
|
sys.stdout.flush()
|
||||||
|
#for groups in english
|
||||||
|
#every lang
|
||||||
|
#does group exist
|
||||||
|
#for strings in groups
|
||||||
|
#does it exist
|
||||||
|
for group in languages[0].groups:
|
||||||
|
for language in languages[1::]:
|
||||||
|
if group not in language.groups:
|
||||||
|
unavailable.append("Language " + language.name + " is missing group '" + group + "'")
|
||||||
|
else:
|
||||||
|
for string in languages[0].groups[group]:
|
||||||
|
if string not in language.groups[group] and string not in ignored_messages:
|
||||||
|
unavailable.append("Language " + language.name + " is missing message '" + string + "'")
|
||||||
|
# print output
|
||||||
|
if len(unavailable) > 0:
|
||||||
|
print("[WARNING]")
|
||||||
|
print("Possible missing messages:")
|
||||||
|
print("\n".join(unavailable))
|
||||||
|
else:
|
||||||
|
print("[OK]")
|
||||||
|
print()
|
||||||
|
|
||||||
|
def check_untranslated():
|
||||||
|
print_no_new("Checking for possible untranslated messages...\t")
|
||||||
|
sys.stdout.flush()
|
||||||
|
#evyerything but english
|
||||||
|
#for group
|
||||||
|
#for string
|
||||||
|
#transl==english?
|
||||||
|
for language in languages[1::]:
|
||||||
|
for group in language.groups:
|
||||||
|
for string in language.groups[group]:
|
||||||
|
try:
|
||||||
|
if language.groups[group][string] == languages[0].groups[group][string] and string not in ignored_messages:
|
||||||
|
untranslated.append("Language " + language.name + ": message '" + string + "' has the same translation as English")
|
||||||
|
except KeyError as error:
|
||||||
|
untranslated.append("Language " + language.name + ": message '" + string + "' doesn't exist in English")
|
||||||
|
# print output
|
||||||
|
if len(untranslated) > 0:
|
||||||
|
print("[WARNING]")
|
||||||
|
print("Possible untranslated messages:")
|
||||||
|
print("\n".join(untranslated))
|
||||||
|
else:
|
||||||
|
print("[OK]")
|
||||||
|
print()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("Rufus translation helper tool, proof of concept/MVP")
|
||||||
|
load_languages()
|
||||||
|
#pp = pprint.PrettyPrinter(indent=4)
|
||||||
|
#pp.pprint(languages[2].groups)
|
||||||
|
check_unavailable()
|
||||||
|
check_untranslated()
|
||||||
|
|
||||||
|
#load main only in ran as stand-alone script
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 3.0.1257"
|
CAPTION "Rufus 3.0.1258"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -371,8 +371,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,0,1257,0
|
FILEVERSION 3,0,1258,0
|
||||||
PRODUCTVERSION 3,0,1257,0
|
PRODUCTVERSION 3,0,1258,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -389,13 +389,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "3.0.1257"
|
VALUE "FileVersion", "3.0.1258"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2018 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2018 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||||
VALUE "OriginalFilename", "rufus.exe"
|
VALUE "OriginalFilename", "rufus.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.0.1257"
|
VALUE "ProductVersion", "3.0.1258"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue