feat(i18n): add Japanese (ja) locale (#1694)

* feat(i18n): add Japanese (ja) locale

- Add packages/app/src/i18n/resources/ja.ts with 1287 keys matching en.ts
- Register ja in i18next.ts, locales.ts (SupportedLocale, LANGUAGE_OPTIONS,
  SUPPORTED_LANGUAGES, LANGUAGE_NATIVE_NAMES, LANGUAGE_NAMES_BY_LOCALE,
  resolveSupportedLocale)
- Add ja label key to all six existing locale files (ar, en, es, fr, ru, zh-CN)
- Update locales.test.ts to cover ja in all relevant assertions

Translation reviewed by Codex across four passes; terminology, placeholder
parity, and naturalness confirmed clean.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(i18n): add ja to resources.test.ts and fix test descriptions

- Import ja and add to key-parity, fallback-ratio, interpolation, and
  model-count assertions in resources.test.ts
- Update test descriptions to say "all supported language(s)" instead of
  "UN official language(s)" (ja is not a UN official language)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* docs: add Japanese README (README.ja.md)

Add README.ja.md translated from the English source, reviewed by Codex
across two passes. Link it in the language navigation of README.md and
README.zh-CN.md.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: apply oxfmt formatting to locales.ts and ja.ts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysCat64
2026-06-24 13:11:35 +00:00
committed by GitHub
co-authored by Claude Sonnet 4.6
parent 70ea960153
commit 507345dbee
14 changed files with 2139 additions and 10 deletions
+8 -4
View File
@@ -7,13 +7,14 @@ import {
} from "./locales";
describe("parseAppLanguage", () => {
it("accepts system and all UN official language locales", () => {
expect(["system", "ar", "en", "es", "fr", "ru", "zh-CN"].map(parseAppLanguage)).toEqual([
it("accepts system and all supported language locales", () => {
expect(["system", "ar", "en", "es", "fr", "ja", "ru", "zh-CN"].map(parseAppLanguage)).toEqual([
"system",
"ar",
"en",
"es",
"fr",
"ja",
"ru",
"zh-CN",
]);
@@ -24,13 +25,14 @@ describe("parseAppLanguage", () => {
expect(parseAppLanguage(null)).toBeNull();
});
it("offers system plus the six UN official languages", () => {
it("offers system plus all supported languages", () => {
expect(LANGUAGE_OPTIONS.map((option) => option.value)).toEqual([
"system",
"ar",
"en",
"es",
"fr",
"ja",
"ru",
"zh-CN",
]);
@@ -81,15 +83,17 @@ describe("resolveSupportedLocale", () => {
expect(resolveSupportedLocale("en", ["zh-CN"])).toBe("en");
expect(resolveSupportedLocale("es", ["en-US"])).toBe("es");
expect(resolveSupportedLocale("fr", ["en-US"])).toBe("fr");
expect(resolveSupportedLocale("ja", ["en-US"])).toBe("ja");
expect(resolveSupportedLocale("ru", ["en-US"])).toBe("ru");
expect(resolveSupportedLocale("zh-CN", ["en-US"])).toBe("zh-CN");
});
it("maps UN official system locales", () => {
it("maps supported system locales", () => {
expect(resolveSupportedLocale("system", ["ar-EG"])).toBe("ar");
expect(resolveSupportedLocale("system", ["en-US"])).toBe("en");
expect(resolveSupportedLocale("system", ["es-MX"])).toBe("es");
expect(resolveSupportedLocale("system", ["fr-CA"])).toBe("fr");
expect(resolveSupportedLocale("system", ["ja-JP"])).toBe("ja");
expect(resolveSupportedLocale("system", ["ru-RU"])).toBe("ru");
});