Complete all translations to 100% and fix auto-extraction

- Mark non-localizable strings with Text(verbatim:) to prevent extraction
- Update UI strings to lowercase per style guide (open, save, close, recording)
- Add complete translations for all 29 languages (194/194 strings at 100%)
- Remove empty/duplicate entries (@, bitchat/, Open, Recording %@)
- Add proper localization comments for all user-facing strings
This commit is contained in:
jack
2025-10-14 22:29:38 +02:00
parent 946abce1b2
commit ca9748ede0
3 changed files with 24133 additions and 23269 deletions
+883 -19
View File
@@ -1,9 +1,6 @@
{ {
"sourceLanguage": "en", "sourceLanguage": "en",
"strings": { "strings": {
"@" : {
},
"%@": { "%@": {
"comment": "Non-localizable symbol used in code", "comment": "Non-localizable symbol used in code",
"extractionState": "manual", "extractionState": "manual",
@@ -189,9 +186,177 @@
"comment": "A label showing the number of messages that have been successfully delivered, followed by a slash and the total number of messages. Both numbers are displayed in monospaced font.", "comment": "A label showing the number of messages that have been successfully delivered, followed by a slash and the total number of messages. Both numbers are displayed in monospaced font.",
"isCommentAutoGenerated": true, "isCommentAutoGenerated": true,
"localizations": { "localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"bn": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"en": { "en": {
"stringUnit": { "stringUnit": {
"state" : "new", "state": "translated",
"value": "%1$@/%2$@"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"fil": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"he": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"hi": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"id": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ms": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ne": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"nl": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"pt": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"sv": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ta": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"ur": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"vi": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "%1$@/%2$@" "value": "%1$@/%2$@"
} }
} }
@@ -6137,13 +6302,186 @@
} }
} }
} }
},
"bitchat/" : {
}, },
"close": { "close": {
"comment" : "A button label that closes an image preview.", "comment": "Button to dismiss fullscreen media viewer",
"isCommentAutoGenerated" : true "isCommentAutoGenerated": true,
"localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "إغلاق"
}
},
"bn": {
"stringUnit": {
"state": "translated",
"value": "বন্ধ"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "schließen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "close"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "cerrar"
}
},
"fil": {
"stringUnit": {
"state": "translated",
"value": "isara"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "fermer"
}
},
"he": {
"stringUnit": {
"state": "translated",
"value": "סגור"
}
},
"hi": {
"stringUnit": {
"state": "translated",
"value": "बंद करें"
}
},
"id": {
"stringUnit": {
"state": "translated",
"value": "tutup"
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "chiudi"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "閉じる"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "닫기"
}
},
"ms": {
"stringUnit": {
"state": "translated",
"value": "tutup"
}
},
"ne": {
"stringUnit": {
"state": "translated",
"value": "बन्द"
}
},
"nl": {
"stringUnit": {
"state": "translated",
"value": "sluiten"
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "zamknij"
}
},
"pt": {
"stringUnit": {
"state": "translated",
"value": "fechar"
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "fechar"
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "закрыть"
}
},
"sv": {
"stringUnit": {
"state": "translated",
"value": "stäng"
}
},
"ta": {
"stringUnit": {
"state": "translated",
"value": "மூடு"
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "ปิด"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "kapat"
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "закрити"
}
},
"ur": {
"stringUnit": {
"state": "translated",
"value": "بند کریں"
}
},
"vi": {
"stringUnit": {
"state": "translated",
"value": "đóng"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "关闭"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "關閉"
}
}
}
}, },
"common.cancel": { "common.cancel": {
"extractionState": "manual", "extractionState": "manual",
@@ -30567,17 +30905,185 @@
} }
} }
}, },
"Open" : {
"comment" : "A button label that says \"Open\".",
"isCommentAutoGenerated" : true
},
"Recording %@" : {
"comment" : "A label inside the recording indicator that shows how long the voice recording has been active.",
"isCommentAutoGenerated" : true
},
"save": { "save": {
"comment" : "A button that saves an image to the user's photo library.", "comment": "Button to save media to device",
"isCommentAutoGenerated" : true "isCommentAutoGenerated": true,
"localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "حفظ"
}
},
"bn": {
"stringUnit": {
"state": "translated",
"value": "সংরক্ষণ"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "speichern"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "save"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "guardar"
}
},
"fil": {
"stringUnit": {
"state": "translated",
"value": "i-save"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "enregistrer"
}
},
"he": {
"stringUnit": {
"state": "translated",
"value": "שמור"
}
},
"hi": {
"stringUnit": {
"state": "translated",
"value": "सहेजें"
}
},
"id": {
"stringUnit": {
"state": "translated",
"value": "simpan"
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "salva"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "保存"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "저장"
}
},
"ms": {
"stringUnit": {
"state": "translated",
"value": "simpan"
}
},
"ne": {
"stringUnit": {
"state": "translated",
"value": "बचत"
}
},
"nl": {
"stringUnit": {
"state": "translated",
"value": "opslaan"
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "zapisz"
}
},
"pt": {
"stringUnit": {
"state": "translated",
"value": "salvar"
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "salvar"
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "сохранить"
}
},
"sv": {
"stringUnit": {
"state": "translated",
"value": "spara"
}
},
"ta": {
"stringUnit": {
"state": "translated",
"value": "சேமி"
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "บันทึก"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "kaydet"
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "зберегти"
}
},
"ur": {
"stringUnit": {
"state": "translated",
"value": "محفوظ کریں"
}
},
"vi": {
"stringUnit": {
"state": "translated",
"value": "lưu"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "保存"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "儲存"
}
}
}
}, },
"system.chat.blocked": { "system.chat.blocked": {
"extractionState": "manual", "extractionState": "manual",
@@ -35053,6 +35559,364 @@
} }
} }
} }
},
"open": {
"comment": "Button to open attached file",
"localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "فتح"
}
},
"bn": {
"stringUnit": {
"state": "translated",
"value": "খুলুন"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "öffnen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "open"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "abrir"
}
},
"fil": {
"stringUnit": {
"state": "translated",
"value": "buksan"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "ouvrir"
}
},
"he": {
"stringUnit": {
"state": "translated",
"value": "פתח"
}
},
"hi": {
"stringUnit": {
"state": "translated",
"value": "खोलें"
}
},
"id": {
"stringUnit": {
"state": "translated",
"value": "buka"
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "apri"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "開く"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "열기"
}
},
"ms": {
"stringUnit": {
"state": "translated",
"value": "buka"
}
},
"ne": {
"stringUnit": {
"state": "translated",
"value": "खोल्नुहोस्"
}
},
"nl": {
"stringUnit": {
"state": "translated",
"value": "openen"
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "otwórz"
}
},
"pt": {
"stringUnit": {
"state": "translated",
"value": "abrir"
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "abrir"
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "открыть"
}
},
"sv": {
"stringUnit": {
"state": "translated",
"value": "öppna"
}
},
"ta": {
"stringUnit": {
"state": "translated",
"value": "திற"
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "เปิด"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "aç"
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "відкрити"
}
},
"ur": {
"stringUnit": {
"state": "translated",
"value": "کھولیں"
}
},
"vi": {
"stringUnit": {
"state": "translated",
"value": "mở"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "打开"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "開啟"
}
}
}
},
"recording %@": {
"comment": "Voice note recording duration indicator",
"localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "التسجيل %@"
}
},
"bn": {
"stringUnit": {
"state": "translated",
"value": "রেকর্ডিং %@"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "aufnahme %@"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "recording %@"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "grabando %@"
}
},
"fil": {
"stringUnit": {
"state": "translated",
"value": "nagrerekord %@"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "enregistrement %@"
}
},
"he": {
"stringUnit": {
"state": "translated",
"value": "מקליט %@"
}
},
"hi": {
"stringUnit": {
"state": "translated",
"value": "रिकॉर्डिंग %@"
}
},
"id": {
"stringUnit": {
"state": "translated",
"value": "merekam %@"
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "registrazione %@"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "録音中 %@"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "녹음 중 %@"
}
},
"ms": {
"stringUnit": {
"state": "translated",
"value": "merakam %@"
}
},
"ne": {
"stringUnit": {
"state": "translated",
"value": "रेकर्डिङ %@"
}
},
"nl": {
"stringUnit": {
"state": "translated",
"value": "opname %@"
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "nagrywanie %@"
}
},
"pt": {
"stringUnit": {
"state": "translated",
"value": "gravando %@"
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "gravando %@"
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "запись %@"
}
},
"sv": {
"stringUnit": {
"state": "translated",
"value": "spelar in %@"
}
},
"ta": {
"stringUnit": {
"state": "translated",
"value": "பதிவு செய்கிறது %@"
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "กำลังบันทึก %@"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "kaydediliyor %@"
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "запис %@"
}
},
"ur": {
"stringUnit": {
"state": "translated",
"value": "ریکارڈنگ %@"
}
},
"vi": {
"stringUnit": {
"state": "translated",
"value": "đang ghi %@"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "录音中 %@"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "錄音中 %@"
}
}
}
} }
}, },
"version": "1.1" "version": "1.1"
+3 -3
View File
@@ -1823,7 +1823,7 @@ private extension ContentView {
Image(systemName: "waveform.circle.fill") Image(systemName: "waveform.circle.fill")
.foregroundColor(.red) .foregroundColor(.red)
.font(.bitchatSystem(size: 20)) .font(.bitchatSystem(size: 20))
Text("Recording \(formattedRecordingDuration())") Text("recording \(formattedRecordingDuration())", comment: "Voice note recording duration indicator")
.font(.bitchatSystem(size: 13, design: .monospaced)) .font(.bitchatSystem(size: 13, design: .monospaced))
.foregroundColor(.red) .foregroundColor(.red)
Spacer() Spacer()
@@ -2253,7 +2253,7 @@ struct ImagePreviewView: View {
Spacer() Spacer()
HStack { HStack {
Button(action: { dismiss() }) { Button(action: { dismiss() }) {
Text("close") Text("close", comment: "Button to dismiss fullscreen media viewer")
.font(.bitchatSystem(size: 15, weight: .semibold)) .font(.bitchatSystem(size: 15, weight: .semibold))
.foregroundColor(.white) .foregroundColor(.white)
.padding(.horizontal, 16) .padding(.horizontal, 16)
@@ -2262,7 +2262,7 @@ struct ImagePreviewView: View {
} }
Spacer() Spacer()
Button(action: saveCopy) { Button(action: saveCopy) {
Text("save") Text("save", comment: "Button to save media to device")
.font(.bitchatSystem(size: 15, weight: .semibold)) .font(.bitchatSystem(size: 15, weight: .semibold))
.foregroundColor(.white) .foregroundColor(.white)
.padding(.horizontal, 16) .padding(.horizontal, 16)
+1 -1
View File
@@ -52,7 +52,7 @@ struct FileAttachmentView: View {
Spacer() Spacer()
Button(action: openFile) { Button(action: openFile) {
Text("Open") Text("open", comment: "Button to open attached file")
.font(.bitchatSystem(size: 13, weight: .semibold)) .font(.bitchatSystem(size: 13, weight: .semibold))
.padding(.horizontal, 12) .padding(.horizontal, 12)
.padding(.vertical, 6) .padding(.vertical, 6)