diff --git "a/Doc/\345\244\232\350\257\255\350\250\200\346\234\254\345\234\260\345\214\226.md" "b/Doc/\345\244\232\350\257\255\350\250\200\346\234\254\345\234\260\345\214\226.md"
new file mode 100644
index 0000000..1dc072a
--- /dev/null
+++ "b/Doc/\345\244\232\350\257\255\350\250\200\346\234\254\345\234\260\345\214\226.md"
@@ -0,0 +1,42 @@
+# 多语言本地化
+
+> 基线:NewLife.Core 12 编译期词表|运行时 11 种语言|英文为源文与兜底
+
+## 1. 语言分层
+
+本库按 NuGet 下载量分层维护运行时词表:下载量较高的核心组件对齐 NewLife.Core 的 31 种语言,其余组件维护 11 种语言(与 README 读者一致)。缺失译文在运行时自动回退英文,新增语言不需要改代码。
+
+词表文件(10 个,另有英文源文兜底):
+
+- zh-Hans
+- zh-Hant
+- es
+- de
+- ja
+- fr
+- pt
+- ru
+- ko
+- ar
+
+## 2. 词表文件
+
+- `GitCandy.Web/Locales`
+
+- 文件名即 BCP 47 语言代码;英文是源文与兜底,**不需要** `en.yml`。
+- 键为**英文原文**,必须与代码字符串逐字一致(含空格与标点);占位符 `{0}` 与格式说明符 `{1:n0}` 必须与英文一致。
+- 词表由 NewLife.Core 包内的源生成器在编译期读取并生成压缩语言表,NativeAOT 下同样可用。
+
+## 3. 新增一条消息
+
+1. 代码中写英文源文:`throw new XException("Session {0} is closed.", sessionId);`,日志直接写英文模板(`Logger.Format` 自动翻译)。
+2. 在全部语言文件的同一位置补齐该键;遗漏只回退英文,不会编译失败。
+3. 运行校验脚本确认键集合、占位符与格式说明符一致。
+
+## 4. 校验
+
+```powershell
+pwsh -File check-locales.ps1 -LocaleDir GitCandy.Web/Locales -SkipOrphan
+```
+
+CI 的 localization job 会执行同一脚本。
diff --git a/GitCandy.Web/Locales/ar.yml b/GitCandy.Web/Locales/ar.yml
new file mode 100644
index 0000000..4d22f39
--- /dev/null
+++ b/GitCandy.Web/Locales/ar.yml
@@ -0,0 +1,8 @@
+# العربية 词表(ar)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "لم يتم تهيئة مزوّد المستخدمين."
+"The owner {0} does not exist.": "المالك {0} غير موجود."
+"{0} already has a repository named {1}.": "لدى {0} مستودع باسم {1} بالفعل."
+"Invalid repository path: {0}/{1}.": "مسار مستودع غير صالح: {0}/{1}."
+"Repository path escapes the root: {0}.": "مسار المستودع يخرج عن الجذر: {0}."
+"Invalid Git service type.": "نوع خدمة Git غير صالح."
+"Unable to start the Git process: {0}.": "تعذّر بدء عملية Git: {0}."
diff --git a/GitCandy.Web/Locales/de.yml b/GitCandy.Web/Locales/de.yml
new file mode 100644
index 0000000..eb3d697
--- /dev/null
+++ b/GitCandy.Web/Locales/de.yml
@@ -0,0 +1,8 @@
+# Deutsch 词表(de)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "Der Benutzeranbieter wurde nicht initialisiert."
+"The owner {0} does not exist.": "Der Besitzer {0} existiert nicht."
+"{0} already has a repository named {1}.": "{0} hat bereits ein Repository namens {1}."
+"Invalid repository path: {0}/{1}.": "Ungültiger Repository-Pfad: {0}/{1}."
+"Repository path escapes the root: {0}.": "Der Repository-Pfad verlässt das Stammverzeichnis: {0}."
+"Invalid Git service type.": "Ungültiger Git-Diensttyp."
+"Unable to start the Git process: {0}.": "Der Git-Prozess konnte nicht gestartet werden: {0}."
diff --git a/GitCandy.Web/Locales/es.yml b/GitCandy.Web/Locales/es.yml
new file mode 100644
index 0000000..f5a1b23
--- /dev/null
+++ b/GitCandy.Web/Locales/es.yml
@@ -0,0 +1,8 @@
+# Español 词表(es)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "El proveedor de usuarios no se ha inicializado."
+"The owner {0} does not exist.": "El propietario {0} no existe."
+"{0} already has a repository named {1}.": "{0} ya tiene un repositorio llamado {1}."
+"Invalid repository path: {0}/{1}.": "Ruta de repositorio no válida: {0}/{1}."
+"Repository path escapes the root: {0}.": "La ruta del repositorio se sale del directorio raíz: {0}."
+"Invalid Git service type.": "Tipo de servicio Git no válido."
+"Unable to start the Git process: {0}.": "No se pudo iniciar el proceso de Git: {0}."
diff --git a/GitCandy.Web/Locales/fr.yml b/GitCandy.Web/Locales/fr.yml
new file mode 100644
index 0000000..24af90c
--- /dev/null
+++ b/GitCandy.Web/Locales/fr.yml
@@ -0,0 +1,8 @@
+# Français 词表(fr)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "Le fournisseur d'utilisateurs n'a pas été initialisé."
+"The owner {0} does not exist.": "Le propriétaire {0} n'existe pas."
+"{0} already has a repository named {1}.": "{0} possède déjà un référentiel nommé {1}."
+"Invalid repository path: {0}/{1}.": "Chemin de référentiel non valide : {0}/{1}."
+"Repository path escapes the root: {0}.": "Le chemin du référentiel sort de la racine : {0}."
+"Invalid Git service type.": "Type de service Git non valide."
+"Unable to start the Git process: {0}.": "Impossible de démarrer le processus Git : {0}."
diff --git a/GitCandy.Web/Locales/ja.yml b/GitCandy.Web/Locales/ja.yml
new file mode 100644
index 0000000..ecd596d
--- /dev/null
+++ b/GitCandy.Web/Locales/ja.yml
@@ -0,0 +1,8 @@
+# 日本語 词表(ja)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "ユーザー プロバイダーが初期化されていません。"
+"The owner {0} does not exist.": "オーナー {0} は存在しません。"
+"{0} already has a repository named {1}.": "{0} には既に {1} という名前のリポジトリがあります。"
+"Invalid repository path: {0}/{1}.": "無効なリポジトリ パスです: {0}/{1}。"
+"Repository path escapes the root: {0}.": "リポジトリ パスがルートの外にあります: {0}。"
+"Invalid Git service type.": "無効な Git サービスの種類です。"
+"Unable to start the Git process: {0}.": "Git プロセスを開始できません: {0}。"
diff --git a/GitCandy.Web/Locales/ko.yml b/GitCandy.Web/Locales/ko.yml
new file mode 100644
index 0000000..3249ea1
--- /dev/null
+++ b/GitCandy.Web/Locales/ko.yml
@@ -0,0 +1,8 @@
+# 한국어 词表(ko)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "사용자 공급자가 초기화되지 않았습니다."
+"The owner {0} does not exist.": "소유자 {0}이(가) 존재하지 않습니다."
+"{0} already has a repository named {1}.": "{0}에는 이미 {1} 이름의 저장소가 있습니다."
+"Invalid repository path: {0}/{1}.": "유효하지 않은 저장소 경로입니다: {0}/{1}."
+"Repository path escapes the root: {0}.": "저장소 경로가 루트를 벗어납니다: {0}."
+"Invalid Git service type.": "유효하지 않은 Git 서비스 유형입니다."
+"Unable to start the Git process: {0}.": "Git 프로세스를 시작할 수 없습니다: {0}."
diff --git a/GitCandy.Web/Locales/pt.yml b/GitCandy.Web/Locales/pt.yml
new file mode 100644
index 0000000..ceee6fc
--- /dev/null
+++ b/GitCandy.Web/Locales/pt.yml
@@ -0,0 +1,8 @@
+# Português 词表(pt)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "O provedor de usuários não foi inicializado."
+"The owner {0} does not exist.": "O proprietário {0} não existe."
+"{0} already has a repository named {1}.": "{0} já tem um repositório chamado {1}."
+"Invalid repository path: {0}/{1}.": "Caminho de repositório inválido: {0}/{1}."
+"Repository path escapes the root: {0}.": "O caminho do repositório escapa da raiz: {0}."
+"Invalid Git service type.": "Tipo de serviço Git inválido."
+"Unable to start the Git process: {0}.": "Não foi possível iniciar o processo Git: {0}."
diff --git a/GitCandy.Web/Locales/ru.yml b/GitCandy.Web/Locales/ru.yml
new file mode 100644
index 0000000..b1d7a47
--- /dev/null
+++ b/GitCandy.Web/Locales/ru.yml
@@ -0,0 +1,8 @@
+# Русский 词表(ru)。键为英文源文,与源码字符串逐字一致;缺少的键运行时回退英文。
+"The user provider has not been initialized.": "Поставщик пользователей не инициализирован."
+"The owner {0} does not exist.": "Владелец {0} не существует."
+"{0} already has a repository named {1}.": "У {0} уже есть репозиторий с именем {1}."
+"Invalid repository path: {0}/{1}.": "Недопустимый путь репозитория: {0}/{1}."
+"Repository path escapes the root: {0}.": "Путь репозитория выходит за пределы корневого каталога: {0}."
+"Invalid Git service type.": "Недопустимый тип службы Git."
+"Unable to start the Git process: {0}.": "Не удалось запустить процесс Git: {0}."
diff --git a/README.ar.md b/README.ar.md
index 2b8a42b..6035a75 100644
--- a/README.ar.md
+++ b/README.ar.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.de.md b/README.de.md
index b752d50..d9317bc 100644
--- a/README.de.md
+++ b/README.de.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.en.md b/README.en.md
index 5580ef7..e7f34e5 100644
--- a/README.en.md
+++ b/README.en.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.es.md b/README.es.md
index 3ae5ef6..678d333 100644
--- a/README.es.md
+++ b/README.es.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.fr.md b/README.fr.md
index 8d73572..3f45fb0 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.ja.md b/README.ja.md
index 57cc4b0..85c0aec 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.ko.md b/README.ko.md
index 1ff8521..7338398 100644
--- a/README.ko.md
+++ b/README.ko.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.md b/README.md
index b3f47e6..541978f 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.pt.md b/README.pt.md
index 0561ecc..30b4822 100644
--- a/README.pt.md
+++ b/README.pt.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.ru.md b/README.ru.md
index eb98429..d6d854b 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)
diff --git a/README.zh-TW.md b/README.zh-TW.md
index ec00f1f..c6dc008 100644
--- a/README.zh-TW.md
+++ b/README.zh-TW.md
@@ -2,6 +2,7 @@

[](https://github.com/NewLifeX/GitCandy/actions/workflows/test.yml)
+[](Doc/多语言本地化.md)


[](https://github.com/NewLifeX/GitCandy/graphs/contributors)