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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Added
- Localization: add native Korean language support across the app and language picker (#1460). Thanks @soohanpark!
- Localization: add German as a selectable app language (#1245). Thanks @Yuxin-Qiao!
- Devin: add daily and weekly quota tracking from the signed-in Chrome session or a manual Bearer token (#1264, fixes #800). Thanks @coygeek!
- Menu bar: add an optional reset-time display for the selected quota metric, with percent fallback when reset metadata is unavailable (#1223, fixes #1185). Thanks @Yuxin-Qiao!
- Cursor: include application data, extensions, settings, and caches in optional local storage tracking (fixes #1403). Thanks @dhruv-anand-aintech!
Expand Down
2 changes: 2 additions & 0 deletions Sources/CodexBar/PreferencesGeneralPane.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import SwiftUI
enum AppLanguage: String, CaseIterable, Identifiable {
case system = ""
case english = "en"
case german = "de"
case spanish = "es"
case catalan = "ca"
case chineseSimplified = "zh-Hans"
Expand All @@ -26,6 +27,7 @@ enum AppLanguage: String, CaseIterable, Identifiable {
switch self {
case .system: L("language_system")
case .english: L("language_english")
case .german: L("language_german")
case .spanish: L("language_spanish")
case .catalan: L("language_catalan")
case .chineseSimplified: L("language_chinese_simplified")
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/ca.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Suec";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_french" = "Francès";
"language_ukrainian" = "Ucraïnès";
"language_japanese" = "Japonès";
Expand Down
1,076 changes: 1,076 additions & 0 deletions Sources/CodexBar/Resources/de.lproj/Localizable.strings

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_swedish" = "Svenska";
"language_french" = "French";
"language_ukrainian" = "Українська";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/es.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Sueco";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_french" = "Francés";
"language_ukrainian" = "Ucraniano";
"language_japanese" = "Japonés";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/fr.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@
"language_chinese_simplified" = "Chinois simplifié";
"language_chinese_traditional" = "Chinois traditionnel";
"language_portuguese_brazilian" = "Portugais (Brésil)";
"language_german" = "Allemand";
"language_swedish" = "Suédois";
"language_french" = "Français";
"language_dutch" = "Néerlandais";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/ja.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@
"language_dutch" = "オランダ語";
"language_swedish" = "スウェーデン語";
"language_french" = "フランス語";
"language_german" = "ドイツ語";
"language_ukrainian" = "ウクライナ語";
"language_japanese" = "日本語";
"language_korean" = "韓国語";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/ko.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" = "포르투갈어(브라질)";
"language_german" = "독일어";
"language_dutch" = "네덜란드어";
"language_swedish" = "스웨덴어";
"language_french" = "프랑스어";
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 @@ -400,6 +400,7 @@
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Portugees (Brazilië)";
"language_dutch" = "Nederlands";
"language_german" = "Duits";
"language_french" = "Frans";
"language_ukrainian" = "Oekraïens";
"language_japanese" = "Japans";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/pt-BR.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "Sueco";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_french" = "Francês";
"language_ukrainian" = "Ucraniano";
"language_japanese" = "Japonês";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/sv.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@
"language_chinese_traditional" = "繁體中文";
"language_portuguese_brazilian" = "Português (Brasil)";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_swedish" = "Svenska";
"language_french" = "Franska";
"language_ukrainian" = "Ukrainska";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/uk.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_german" = "Deutsch";
"language_swedish" = "Svenska";
"language_french" = "Français";
"language_dutch" = "Нідерландська";
Expand Down
1 change: 1 addition & 0 deletions Sources/CodexBar/Resources/vi.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_german" = "Deutsch";
"language_swedish" = "Svenska";
"language_french" = "Tiếng Pháp";
"language_dutch" = "Tiếng Hà Lan";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,7 @@
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "瑞典语";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_french" = "法语";
"language_ukrainian" = "乌克兰语";
"language_japanese" = "日语";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,7 @@
"language_portuguese_brazilian" = "Português (Brasil)";
"language_swedish" = "瑞典語";
"language_dutch" = "Nederlands";
"language_german" = "Deutsch";
"language_french" = "法語";
"language_ukrainian" = "烏克蘭語";
"language_japanese" = "日語";
Expand Down
1 change: 1 addition & 0 deletions Tests/CodexBarTests/LocalizationLanguageCatalogTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ struct LocalizationLanguageCatalogTests {
private let languageKeys = [
"language_system",
"language_english",
"language_german",
"language_spanish",
"language_catalan",
"language_chinese_simplified",
Expand Down
30 changes: 30 additions & 0 deletions Tests/CodexBarTests/PreferencesPaneSmokeTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,36 @@ struct PreferencesPaneSmokeTests {
#expect(L("quit_app") == "CodexBar を終了")
}

@Test
func `german app language resolves localized labels`() {
let previousLanguage = UserDefaults.standard.object(forKey: "appLanguage")
let previousAppleLanguages = UserDefaults.standard.object(forKey: "AppleLanguages")
defer {
Comment thread
steipete marked this conversation as resolved.
if let previousLanguage {
UserDefaults.standard.set(previousLanguage, forKey: "appLanguage")
} else {
UserDefaults.standard.removeObject(forKey: "appLanguage")
}
if let previousAppleLanguages {
UserDefaults.standard.set(previousAppleLanguages, forKey: "AppleLanguages")
} else {
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
}
}

let settings = Self.makeSettingsStore(suite: "PreferencesPaneSmokeTests-language-de")
settings.appLanguage = "de"

#expect(UserDefaults.standard.string(forKey: "appLanguage") == "de")
#expect(L("tab_general") == "Allgemein")
#expect(L("language_title") == "Sprache")
#expect(L("quit_app") == "CodexBar beenden")
#expect(L("display_mode_reset_time") == "Zurücksetzungszeit")
#expect(L("display_mode_reset_time_desc").contains("↻ 15:56"))
#expect(L("vertex_ai_login_instructions").contains("\n\n1. Öffnen Sie Terminal"))
#expect(!L("vertex_ai_login_instructions").contains("\\n"))
}

private static func makeSettingsStore(suite: String) -> SettingsStore {
let defaults = UserDefaults(suiteName: suite)!
defaults.removePersistentDomain(forName: suite)
Expand Down