mirror of
https://github.com/getpaseo/paseo.git
synced 2026-07-29 12:01:31 +00:00
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:
172
README.ja.md
Normal file
172
README.ja.md
Normal file
@@ -0,0 +1,172 @@
|
||||
<p align="center">
|
||||
<img src="packages/website/public/logo.svg" width="64" height="64" alt="Paseo logo">
|
||||
</p>
|
||||
|
||||
<h1 align="center">Paseo</h1>
|
||||
|
||||
<p align="center">
|
||||
<a href="README.md">English</a> ·
|
||||
<a href="README.zh-CN.md">简体中文</a> ·
|
||||
<a href="README.ja.md">日本語</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/getpaseo/paseo/stargazers">
|
||||
<img src="https://img.shields.io/github/stars/getpaseo/paseo?style=flat&logo=github" alt="GitHub stars">
|
||||
</a>
|
||||
<a href="https://github.com/getpaseo/paseo/releases">
|
||||
<img src="https://img.shields.io/github/v/release/getpaseo/paseo?style=flat&logo=github" alt="GitHub release">
|
||||
</a>
|
||||
<a href="https://x.com/moboudra">
|
||||
<img src="https://img.shields.io/badge/%40moboudra-555?logo=x" alt="X">
|
||||
</a>
|
||||
<a href="https://discord.gg/jz8T2uahpH">
|
||||
<img src="https://img.shields.io/badge/Discord-555?logo=discord" alt="Discord">
|
||||
</a>
|
||||
<a href="https://www.reddit.com/r/PaseoAI/">
|
||||
<img src="https://img.shields.io/badge/Reddit-555?logo=reddit" alt="Reddit">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">Claude Code、Codex、Copilot、OpenCode、Pi のエージェントを、ひとつのインターフェースで。</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://paseo.sh/hero-mockup.png" alt="Paseo アプリのスクリーンショット" width="100%">
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="https://paseo.sh/mobile-mockup.png" alt="Paseo モバイルアプリ" width="100%">
|
||||
</p>
|
||||
|
||||
> [!NOTE]
|
||||
> 私はひとりでメンテナンスしているため、GitHub Issues を毎日確認できるとは限りません。
|
||||
> 急ぎの問題や作業がブロックされている場合は、[Discord](https://discord.gg/jz8T2uahpH) から連絡するのが一番早いです。
|
||||
|
||||
---
|
||||
|
||||
自分のマシンでエージェントを並列実行。スマートフォンからでもデスクからでも、開発を進めてリリースできます。
|
||||
|
||||
- **セルフホスト:** エージェントはあなたのマシン上で動作し、完全な開発環境を使用します。自分のツール・設定・スキルをそのまま活用できます。
|
||||
- **マルチプロバイダー:** Claude Code、Codex、Copilot、OpenCode、Pi を同一のインターフェースで利用。タスクに合ったモデルを選べます。
|
||||
- **音声コントロール:** 音声モードでタスクを口述したり問題を話し合ったりできます。ハンズフリーが必要なときに便利です。
|
||||
- **クロスデバイス:** iOS、Android、デスクトップ、Web、CLI に対応。机で作業を始め、スマートフォンで確認し、ターミナルから自動化できます。
|
||||
- **プライバシー優先:** Paseo にはテレメトリー・トラッキング・強制ログインは一切ありません。
|
||||
|
||||
## はじめかた
|
||||
|
||||
Paseo はコーディングエージェントを管理するローカルサーバー(デーモン)を起動します。デスクトップアプリ・モバイルアプリ・Web アプリ・CLI などのクライアントがこのデーモンに接続します。
|
||||
|
||||
### 前提条件
|
||||
|
||||
エージェント CLI をひとつ以上インストールし、認証情報を設定しておく必要があります。
|
||||
|
||||
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
|
||||
- [Codex](https://github.com/openai/codex)
|
||||
- [GitHub Copilot](https://github.com/features/copilot/cli/)
|
||||
- [OpenCode](https://github.com/anomalyco/opencode)
|
||||
- [Pi](https://pi.dev)
|
||||
|
||||
### デスクトップアプリ(推奨)
|
||||
|
||||
[paseo.sh/download](https://paseo.sh/download) または [GitHub のリリースページ](https://github.com/getpaseo/paseo/releases)からダウンロードしてください。アプリを開くとデーモンが自動的に起動します。追加のインストールは不要です。
|
||||
|
||||
スマートフォンから接続するには、Settings 画面に表示される QR コードをスキャンしてください。
|
||||
|
||||
### CLI / ヘッドレス
|
||||
|
||||
CLI をインストールして Paseo を起動します。
|
||||
|
||||
```bash
|
||||
npm install -g @getpaseo/cli
|
||||
paseo
|
||||
```
|
||||
|
||||
ターミナルに QR コードが表示されます。どのクライアントからでも接続できます。サーバーやリモートマシンでの利用に適しています。
|
||||
|
||||
詳しいセットアップと設定については以下を参照してください。
|
||||
|
||||
- [ドキュメント](https://paseo.sh/docs)
|
||||
- [設定リファレンス](https://paseo.sh/docs/configuration)
|
||||
|
||||
## CLI
|
||||
|
||||
アプリでできることはすべてターミナルからも実行できます。
|
||||
|
||||
```bash
|
||||
paseo run --provider claude/opus-4.6 "implement user authentication"
|
||||
paseo run --provider codex/gpt-5.4 --worktree feature-x "implement feature X"
|
||||
|
||||
paseo ls # 実行中のエージェントを一覧表示
|
||||
paseo attach abc123 # ライブ出力をストリーミング
|
||||
paseo send abc123 "also add tests" # 追加タスクを送信
|
||||
|
||||
# リモートデーモンで実行
|
||||
paseo --host workstation.local:6767 run "run the full test suite"
|
||||
```
|
||||
|
||||
詳細は[完全な CLI リファレンス](https://paseo.sh/docs/cli)を参照してください。
|
||||
|
||||
## スキル
|
||||
|
||||
スキルはエージェントに Paseo を使って他のエージェントをオーケストレーションする方法を教えます。
|
||||
|
||||
```bash
|
||||
npx skills add getpaseo/paseo
|
||||
```
|
||||
|
||||
どのエージェントとの会話でも使用できます。
|
||||
|
||||
- `/paseo-handoff` — エージェント間で作業を引き継ぎます。私はこれを使って Claude で計画し、Codex に実装を引き継いでいます。
|
||||
- `/paseo-loop` — 明確な受け入れ基準に沿ってエージェントをループさせます(Ralph loops とも呼ばれます)。検証役を追加することもできます。
|
||||
- `/paseo-advisor` — 単一のエージェントをアドバイザーとして起動し、作業を委任せずにセカンドオピニオンを得ます。
|
||||
- `/paseo-committee` — 対照的な2つのエージェントで委員会を構成し、一歩引いた視点で根本原因を分析して計画を作成します。
|
||||
|
||||
## 開発
|
||||
|
||||
モノレポのパッケージ構成:
|
||||
|
||||
- `packages/server`: Paseo デーモン(エージェントプロセスのオーケストレーション、WebSocket API、MCP サーバー)
|
||||
- `packages/app`: Expo クライアント(iOS、Android、Web)
|
||||
- `packages/cli`: デーモンおよびエージェントワークフロー向け `paseo` CLI
|
||||
- `packages/desktop`: Electron デスクトップアプリ
|
||||
- `packages/relay`: リモート接続用リレーパッケージ
|
||||
- `packages/website`: マーケティングサイトとドキュメント(`paseo.sh`)
|
||||
|
||||
よく使うコマンド:
|
||||
|
||||
```bash
|
||||
# すべてのローカル開発サービスを起動
|
||||
npm run dev
|
||||
|
||||
# 個別のサービスを起動
|
||||
npm run dev:server
|
||||
npm run dev:app
|
||||
npm run dev:desktop
|
||||
npm run dev:website
|
||||
|
||||
# サーバースタックをビルド
|
||||
npm run build:server
|
||||
|
||||
# リポジトリ全体のチェック
|
||||
npm run typecheck
|
||||
```
|
||||
|
||||
## コミュニティ
|
||||
|
||||
- [paseo-relay](https://github.com/zenghongtu/paseo-relay) — Go 実装のセルフホスト型リレー
|
||||
|
||||
---
|
||||
|
||||
<p align="center">
|
||||
<a href="https://star-history.com/#getpaseo/paseo&Date">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=getpaseo/paseo&type=Date&theme=dark">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=getpaseo/paseo&type=Date">
|
||||
<img src="https://api.star-history.com/svg?repos=getpaseo/paseo&type=Date" alt="getpaseo/paseo のスター履歴チャート" width="600" style="max-width: 100%;">
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## ライセンス
|
||||
|
||||
AGPL-3.0
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.md">English</a> ·
|
||||
<a href="README.zh-CN.md">简体中文</a>
|
||||
<a href="README.zh-CN.md">简体中文</a> ·
|
||||
<a href="README.ja.md">日本語</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.md">English</a> ·
|
||||
<a href="README.zh-CN.md">简体中文</a>
|
||||
<a href="README.zh-CN.md">简体中文</a> ·
|
||||
<a href="README.ja.md">日本語</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
|
||||
@@ -5,6 +5,7 @@ import { ar } from "./resources/ar";
|
||||
import { en } from "./resources/en";
|
||||
import { es } from "./resources/es";
|
||||
import { fr } from "./resources/fr";
|
||||
import { ja } from "./resources/ja";
|
||||
import { ru } from "./resources/ru";
|
||||
import { zhCN } from "./resources/zh-CN";
|
||||
|
||||
@@ -20,6 +21,7 @@ observeI18nInit(
|
||||
en: { translation: en },
|
||||
es: { translation: es },
|
||||
fr: { translation: fr },
|
||||
ja: { translation: ja },
|
||||
ru: { translation: ru },
|
||||
"zh-CN": { translation: zhCN },
|
||||
},
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export type SupportedLocale = "ar" | "en" | "es" | "fr" | "ru" | "zh-CN";
|
||||
export type SupportedLocale = "ar" | "en" | "es" | "fr" | "ja" | "ru" | "zh-CN";
|
||||
export type AppLanguage = "system" | SupportedLocale;
|
||||
|
||||
export interface LanguageOption {
|
||||
@@ -14,16 +14,27 @@ export const LANGUAGE_OPTIONS: LanguageOption[] = [
|
||||
{ value: "en", labelKey: "settings.general.language.options.en" },
|
||||
{ value: "es", labelKey: "settings.general.language.options.es" },
|
||||
{ value: "fr", labelKey: "settings.general.language.options.fr" },
|
||||
{ value: "ja", labelKey: "settings.general.language.options.ja" },
|
||||
{ value: "ru", labelKey: "settings.general.language.options.ru" },
|
||||
{ value: "zh-CN", labelKey: "settings.general.language.options.zhCN" },
|
||||
];
|
||||
|
||||
const SUPPORTED_LANGUAGES = new Set<AppLanguage>(["system", "ar", "en", "es", "fr", "ru", "zh-CN"]);
|
||||
const SUPPORTED_LANGUAGES = new Set<AppLanguage>([
|
||||
"system",
|
||||
"ar",
|
||||
"en",
|
||||
"es",
|
||||
"fr",
|
||||
"ja",
|
||||
"ru",
|
||||
"zh-CN",
|
||||
]);
|
||||
const LANGUAGE_NATIVE_NAMES: Record<SupportedLocale, string> = {
|
||||
ar: "العربية",
|
||||
en: "English",
|
||||
es: "Español",
|
||||
fr: "Français",
|
||||
ja: "日本語",
|
||||
ru: "Русский",
|
||||
"zh-CN": "简体中文",
|
||||
};
|
||||
@@ -33,6 +44,7 @@ const LANGUAGE_NAMES_BY_LOCALE: Record<SupportedLocale, Record<SupportedLocale,
|
||||
en: "الإنجليزية",
|
||||
es: "الإسبانية",
|
||||
fr: "الفرنسية",
|
||||
ja: "اليابانية",
|
||||
ru: "الروسية",
|
||||
"zh-CN": "الصينية المبسطة",
|
||||
},
|
||||
@@ -41,6 +53,7 @@ const LANGUAGE_NAMES_BY_LOCALE: Record<SupportedLocale, Record<SupportedLocale,
|
||||
en: "English",
|
||||
es: "Spanish",
|
||||
fr: "French",
|
||||
ja: "Japanese",
|
||||
ru: "Russian",
|
||||
"zh-CN": "Simplified Chinese",
|
||||
},
|
||||
@@ -49,6 +62,7 @@ const LANGUAGE_NAMES_BY_LOCALE: Record<SupportedLocale, Record<SupportedLocale,
|
||||
en: "inglés",
|
||||
es: "español",
|
||||
fr: "francés",
|
||||
ja: "japonés",
|
||||
ru: "ruso",
|
||||
"zh-CN": "chino simplificado",
|
||||
},
|
||||
@@ -57,14 +71,25 @@ const LANGUAGE_NAMES_BY_LOCALE: Record<SupportedLocale, Record<SupportedLocale,
|
||||
en: "anglais",
|
||||
es: "espagnol",
|
||||
fr: "français",
|
||||
ja: "japonais",
|
||||
ru: "russe",
|
||||
"zh-CN": "chinois simplifié",
|
||||
},
|
||||
ja: {
|
||||
ar: "アラビア語",
|
||||
en: "英語",
|
||||
es: "スペイン語",
|
||||
fr: "フランス語",
|
||||
ja: "日本語",
|
||||
ru: "ロシア語",
|
||||
"zh-CN": "簡体字中国語",
|
||||
},
|
||||
ru: {
|
||||
ar: "арабский",
|
||||
en: "английский",
|
||||
es: "испанский",
|
||||
fr: "французский",
|
||||
ja: "японский",
|
||||
ru: "русский",
|
||||
"zh-CN": "упрощенный китайский",
|
||||
},
|
||||
@@ -73,6 +98,7 @@ const LANGUAGE_NAMES_BY_LOCALE: Record<SupportedLocale, Record<SupportedLocale,
|
||||
en: "英语",
|
||||
es: "西班牙语",
|
||||
fr: "法语",
|
||||
ja: "日语",
|
||||
ru: "俄语",
|
||||
"zh-CN": "简体中文",
|
||||
},
|
||||
@@ -124,6 +150,9 @@ export function resolveSupportedLocale(
|
||||
if (normalized === "fr" || normalized.startsWith("fr-")) {
|
||||
return "fr";
|
||||
}
|
||||
if (normalized === "ja" || normalized.startsWith("ja-")) {
|
||||
return "ja";
|
||||
}
|
||||
if (normalized === "ru" || normalized.startsWith("ru-")) {
|
||||
return "ru";
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import { ar } from "./resources/ar";
|
||||
import { en } from "./resources/en";
|
||||
import { es } from "./resources/es";
|
||||
import { fr } from "./resources/fr";
|
||||
import { ja } from "./resources/ja";
|
||||
import { ru } from "./resources/ru";
|
||||
import { zhCN } from "./resources/zh-CN";
|
||||
|
||||
@@ -101,21 +102,23 @@ function findUntranslatedConnectionErrors(): string[] {
|
||||
}
|
||||
|
||||
describe("translation resources", () => {
|
||||
it("keeps UN official language keys in sync with English", () => {
|
||||
it("keeps all supported language keys in sync with English", () => {
|
||||
const englishKeys = flattenKeys(en).sort();
|
||||
expect(flattenKeys(ar).sort()).toEqual(englishKeys);
|
||||
expect(flattenKeys(es).sort()).toEqual(englishKeys);
|
||||
expect(flattenKeys(fr).sort()).toEqual(englishKeys);
|
||||
expect(flattenKeys(ja).sort()).toEqual(englishKeys);
|
||||
expect(flattenKeys(ru).sort()).toEqual(englishKeys);
|
||||
expect(flattenKeys(zhCN).sort()).toEqual(englishKeys);
|
||||
});
|
||||
|
||||
it("keeps non-English UN official languages translated beyond fallback labels", () => {
|
||||
it("keeps non-English supported languages translated beyond fallback labels", () => {
|
||||
const totalStrings = Object.keys(flattenStrings(en)).length;
|
||||
const maxFallbackStrings = Math.floor(totalStrings * 0.25);
|
||||
expect(countMatchingEnglishStrings(ar)).toBeLessThan(maxFallbackStrings);
|
||||
expect(countMatchingEnglishStrings(es)).toBeLessThan(maxFallbackStrings);
|
||||
expect(countMatchingEnglishStrings(fr)).toBeLessThan(maxFallbackStrings);
|
||||
expect(countMatchingEnglishStrings(ja)).toBeLessThan(maxFallbackStrings);
|
||||
expect(countMatchingEnglishStrings(ru)).toBeLessThan(maxFallbackStrings);
|
||||
});
|
||||
|
||||
@@ -123,6 +126,7 @@ describe("translation resources", () => {
|
||||
expect(findInterpolationMismatches(ar)).toEqual([]);
|
||||
expect(findInterpolationMismatches(es)).toEqual([]);
|
||||
expect(findInterpolationMismatches(fr)).toEqual([]);
|
||||
expect(findInterpolationMismatches(ja)).toEqual([]);
|
||||
expect(findInterpolationMismatches(ru)).toEqual([]);
|
||||
expect(findInterpolationMismatches(zhCN)).toEqual([]);
|
||||
});
|
||||
@@ -137,11 +141,13 @@ describe("translation resources", () => {
|
||||
expect(ar.modelSelector.modelCountPlural).toBe("{{count}} نماذج");
|
||||
expect(es.modelSelector.modelCountPlural).toBe("{{count}} modelos");
|
||||
expect(fr.modelSelector.modelCountPlural).toBe("{{count}} modèles");
|
||||
expect(ja.modelSelector.modelCountPlural).toBe("{{count}}つのモデル");
|
||||
expect(ru.modelSelector.modelCountPlural).toBe("{{count}} моделей");
|
||||
expect(zhCN.modelSelector.modelCountPlural).toBe("{{count}} 个模型");
|
||||
expect(ar.settings.providers.models.many).toBe("{{count}} نماذج");
|
||||
expect(es.settings.providers.models.many).toBe("{{count}} modelos");
|
||||
expect(fr.settings.providers.models.many).toBe("{{count}} modèles");
|
||||
expect(ja.settings.providers.models.many).toBe("{{count}}つのモデル");
|
||||
expect(ru.settings.providers.models.many).toBe("{{count}} моделей");
|
||||
expect(zhCN.settings.providers.models.many).toBe("{{count}} 个 Model");
|
||||
});
|
||||
|
||||
@@ -1438,6 +1438,7 @@ export const ar: TranslationResources = {
|
||||
en: "English",
|
||||
es: "Español",
|
||||
fr: "Français",
|
||||
ja: "日本語",
|
||||
ru: "Русский",
|
||||
zhCN: "中文",
|
||||
},
|
||||
|
||||
@@ -1444,6 +1444,7 @@ export const en = {
|
||||
en: "English",
|
||||
es: "Spanish",
|
||||
fr: "French",
|
||||
ja: "Japanese",
|
||||
ru: "Russian",
|
||||
zhCN: "Simplified Chinese",
|
||||
},
|
||||
|
||||
@@ -1475,6 +1475,7 @@ export const es: TranslationResources = {
|
||||
en: "English",
|
||||
es: "Español",
|
||||
fr: "Français",
|
||||
ja: "日本語",
|
||||
ru: "Русский",
|
||||
zhCN: "中文",
|
||||
},
|
||||
|
||||
@@ -1478,6 +1478,7 @@ export const fr: TranslationResources = {
|
||||
en: "English",
|
||||
es: "Español",
|
||||
fr: "Français",
|
||||
ja: "日本語",
|
||||
ru: "Русский",
|
||||
zhCN: "中文",
|
||||
},
|
||||
|
||||
1908
packages/app/src/i18n/resources/ja.ts
Normal file
1908
packages/app/src/i18n/resources/ja.ts
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1465,6 +1465,7 @@ export const ru: TranslationResources = {
|
||||
en: "English",
|
||||
es: "Español",
|
||||
fr: "Français",
|
||||
ja: "日本語",
|
||||
ru: "Русский",
|
||||
zhCN: "中文",
|
||||
},
|
||||
|
||||
@@ -1420,6 +1420,7 @@ export const zhCN: TranslationResources = {
|
||||
en: "English",
|
||||
es: "Español",
|
||||
fr: "Français",
|
||||
ja: "日本語",
|
||||
ru: "Русский",
|
||||
zhCN: "简体中文",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user