Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
### Added
- Localization: add French as a selectable app language (#1241). Thanks @Yuxin-Qiao!
- Localization: add Ukrainian as a selectable app language (#1250). Thanks @Yuxin-Qiao!
- Localization: add Dutch as a selectable app language (#1252). Thanks @Yuxin-Qiao!
- Localization: add Vietnamese as a selectable app language (#1247). Thanks @Yuxin-Qiao!

### Fixed
- Claude: remove transient ClaudeProbe session artifacts after CLI usage polls so background refreshes no longer fill Claude Code project history with CodexBar `/usage` sessions (#1301). Thanks @LPFchan and @matthewod11-stack!
Expand Down
2 changes: 2 additions & 0 deletions Sources/CodexBar/PreferencesGeneralPane.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ enum AppLanguage: String, CaseIterable, Identifiable {
case french = "fr"
case dutch = "nl"
case ukrainian = "uk"
case vietnamese = "vi"

var id: String {
self.rawValue
Expand All @@ -32,6 +33,7 @@ enum AppLanguage: String, CaseIterable, Identifiable {
case .french: L("language_french")
case .dutch: L("language_dutch")
case .ukrainian: L("language_ukrainian")
case .vietnamese: L("language_vietnamese")
}
}
}
Expand Down
3 changes: 3 additions & 0 deletions Sources/CodexBar/Resources/ca.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@
"language_chinese_simplified" = "简体中文";
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Suec";
"language_dutch" = "Nederlands";
"language_french" = "Francès";
"language_ukrainian" = "Ucraïnès";
Expand Down Expand Up @@ -919,3 +920,5 @@
"Clear" = "Esborra";
"No matching providers" = "No hi ha proveïdors coincidents";
"Search providers" = "Cerca proveïdors";

"language_vietnamese" = "Vietnamita";
2 changes: 2 additions & 0 deletions Sources/CodexBar/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -1063,3 +1063,5 @@
"Clear" = "Clear";
"No matching providers" = "No matching providers";
"Search providers" = "Search providers";

"language_vietnamese" = "Vietnamese";
3 changes: 3 additions & 0 deletions Sources/CodexBar/Resources/es.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@
"language_chinese_simplified" = "简体中文";
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Sueco";
"language_dutch" = "Nederlands";
"language_french" = "Francés";
"language_ukrainian" = "Ucraniano";
Expand Down Expand Up @@ -919,3 +920,5 @@
"Clear" = "Borrar";
"No matching providers" = "No hay proveedores coincidentes";
"Search providers" = "Buscar proveedores";

"language_vietnamese" = "Vietnamita";
2 changes: 2 additions & 0 deletions Sources/CodexBar/Resources/fr.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,9 @@
"language_portuguese_brazilian" = "Portugais (Brésil)";
"language_swedish" = "Suédois";
"language_french" = "Français";
"language_dutch" = "Néerlandais";
"language_ukrainian" = "Ukrainien";
"language_vietnamese" = "Vietnamien";
"start_at_login_title" = "Lancer à l'ouverture de session";
"start_at_login_subtitle" = "Ouvre automatiquement CodexBar au démarrage de votre Mac.";
"show_cost_summary" = "Afficher le récapitulatif des coûts";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/nl.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,7 @@
"language_french" = "Frans";
"language_ukrainian" = "Oekraïens";
"language_swedish" = "Zweeds";
"language_vietnamese" = "Vietnamees";
"start_at_login_title" = "Begin bij Inloggen";
"start_at_login_subtitle" = "Opent automatisch CodexBar wanneer u uw Mac start.";
"show_cost_summary" = "Kostenoverzicht weergeven";
Expand Down
3 changes: 3 additions & 0 deletions Sources/CodexBar/Resources/pt-BR.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@
"language_chinese_simplified" = "Chinês simplificado";
"language_chinese_traditional" = "Chinês tradicional";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Sueco";
"language_dutch" = "Nederlands";
"language_french" = "Francês";
"language_ukrainian" = "Ucraniano";
Expand Down Expand Up @@ -1062,3 +1063,5 @@
"Clear" = "Limpar";
"No matching providers" = "Nenhum provedor correspondente";
"Search providers" = "Buscar provedores";

"language_vietnamese" = "Vietnamita";
2 changes: 2 additions & 0 deletions Sources/CodexBar/Resources/sv.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -1061,3 +1061,5 @@
"Clear" = "Rensa";
"No matching providers" = "Inga matchande leverantörer";
"Search providers" = "Sök leverantörer";

"language_vietnamese" = "Vietnamesiska";
2 changes: 2 additions & 0 deletions Sources/CodexBar/Resources/uk.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,9 @@
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Svenska";
"language_french" = "Français";
"language_dutch" = "Нідерландська";
"language_ukrainian" = "Українська";
"language_vietnamese" = "В'єтнамська";
"start_at_login_title" = "Почніть із входу";
"start_at_login_subtitle" = "Автоматично відкриває CodexBar під час запуску Mac.";
"show_cost_summary" = "Показати підсумок витрат";
Expand Down
1,067 changes: 1,067 additions & 0 deletions Sources/CodexBar/Resources/vi.lproj/Localizable.strings

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions Sources/CodexBar/Resources/zh-Hans.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@
"language_chinese_simplified" = "简体中文";
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "瑞典语";
"language_dutch" = "Nederlands";
"language_french" = "法语";
"language_ukrainian" = "乌克兰语";
Expand Down Expand Up @@ -1036,3 +1037,5 @@
"Clear" = "清除";
"No matching providers" = "没有匹配的提供商";
"Search providers" = "搜索提供商";

"language_vietnamese" = "越南语";
3 changes: 3 additions & 0 deletions Sources/CodexBar/Resources/zh-Hant.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@
"language_chinese_simplified" = "简体中文";
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "瑞典語";
"language_dutch" = "Nederlands";
"language_french" = "法語";
"language_ukrainian" = "烏克蘭語";
Expand Down Expand Up @@ -932,3 +933,5 @@
"Clear" = "清除";
"No matching providers" = "沒有相符的提供者";
"Search providers" = "搜尋提供者";

"language_vietnamese" = "越南語";
38 changes: 38 additions & 0 deletions Tests/CodexBarTests/LocalizationLanguageCatalogTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,50 @@ import Testing
@testable import CodexBar

struct LocalizationLanguageCatalogTests {
private let languageKeys = [
"language_system",
"language_english",
"language_spanish",
"language_catalan",
"language_chinese_simplified",
"language_chinese_traditional",
"language_portuguese_brazilian",
"language_swedish",
"language_french",
"language_dutch",
"language_ukrainian",
"language_vietnamese",
]

@Test
func `app language catalog includes Ukrainian`() {
#expect(AppLanguage.allCases.contains(.ukrainian))
#expect(AppLanguage.ukrainian.rawValue == "uk")
}

@Test
func `localized catalogs include every app language label`() throws {
#expect(self.languageKeys.count == AppLanguage.allCases.count)

let root = URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.deletingLastPathComponent()
.deletingLastPathComponent()
let resourcesURL = root.appendingPathComponent("Sources/CodexBar/Resources")
let catalogs = try FileManager.default.contentsOfDirectory(
at: resourcesURL,
includingPropertiesForKeys: nil)
.filter { $0.pathExtension == "lproj" }

for catalogURL in catalogs {
let stringsURL = catalogURL.appendingPathComponent("Localizable.strings")
let contents = try String(contentsOf: stringsURL, encoding: .utf8)
for key in self.languageKeys {
#expect(contents.contains("\"\(key)\""), "Missing \(key) in \(catalogURL.lastPathComponent)")
}
}
}

@Test
func `ukrainian localization bundle exists and contains key UI labels`() throws {
let root = URL(fileURLWithPath: #filePath)
Expand Down