跳到主要内容

Localization

重要 注意 提醒

Coding Style wiki


LocalizationLocalizationSystem 的本地化核心 (成员皆为 static),由项目通过回调提供支持语系与语言表解析 (onAddSupportedLanguagesonParsingLanguageDataonChangeLanguage),并提供语系切换 (ChangeLanguage)系统语系检测代码取字 (GetStringByCode) API;完整初始流程可参考模块介绍

命名空间OxGKit.LocalizationSystem
类型public class Localization (成员皆为 static)
源码Localization.cs
using OxGKit.LocalizationSystem;

快速上手

using System.Collections.Generic;
using OxGKit.LocalizationSystem;

// 1. 声明支持语系
Localization.onAddSupportedLanguages = (supportedLanguages) =>
{
supportedLanguages.Add(LangType.English);
supportedLanguages.Add(LangType.ChineseTraditional);
};

// 2. 提供语言表解析 (数据来源由项目自行决定: JSON、表格导出、服务器...)
Localization.onParsingLanguageData = (langType, langData) =>
{
foreach (var pair in langSheet[langType.ToString()])
langData.TryAdd(pair.Key, pair.Value);
return true; // 解析成功返回 true
};

// 3. 语系切换成功后刷新 UI 文字
Localization.onChangeLanguage = (langType) => RefreshAllLocalizedTexts();

// 4. 首次切换 (例如使用系统语系,不支持时自动回退 English)
Localization.ChangeLanguage(Localization.systemLanguage);

// 5. UI 一律通过代码取字
string title = Localization.GetStringByCode("ui.title");

通用规则

必须实现的回调

  1. 赋值 onAddSupportedLanguages 声明支持语系。
  2. 赋值 onParsingLanguageData 提供语言表解析 (解表所需的数据来源需先准备完成)。
  3. (建议) 订阅 onChangeLanguage 刷新 UI 文字。

重要 onParsingLanguageData 未赋值或解析返回 false 时,ChangeLanguage 会直接抛出异常

缓存机制

注意 GetSupportedLanguages 与转译表 API 首次调用后即缓存结果 (不会再次触发回调),因此必须先赋值 onAddSupportedLanguages,再调用任何支持语系相关 API (含 systemLanguageIsSupportedLanguage 等)。

语系保存

提醒 模块不负责保存所选语系,由项目自行保存/还原 LangType,还原时建议先以 GetAndCheckIsSupportedLanguage 校正。


回调成员

成员总览

成员说明
onAddSupportedLanguages新增支持语系回调。
onParsingLanguageData解析语言表数据回调 (ChangeLanguage 时调用解析)。
onChangeLanguage切换语系回调 (切换成功后通知)。

onAddSupportedLanguages

public static Action<HashSet<LangType>> onAddSupportedLanguages

新增支持语系回调;于 GetSupportedLanguages 首次被调用时触发,将项目支持的语系加入 supportedLanguages 集合。

Localization.onAddSupportedLanguages = (supportedLanguages) =>
{
supportedLanguages.Add(LangType.English);
supportedLanguages.Add(LangType.ChineseTraditional);
supportedLanguages.Add(LangType.ChineseSimplified);
supportedLanguages.Add(LangType.Japanese);
supportedLanguages.Add(LangType.Korean);
};

onParsingLanguageData

public static Func<LangType, Dictionary<string, string>, bool> onParsingLanguageData

解析语言表数据回调;ChangeLanguage 时调用解析,需将指定语系的 Code -> Text 键值填入 langData (切换成功后该字典会被缓存为当前语言表),解析成功返回 true

Localization.onParsingLanguageData = (langType, langData) =>
{
// Your lang sheet (can load from json or server)
if (langSheet.ContainsKey(langType.ToString()))
{
// The ref langData will be cached by Localization
foreach (var pair in langSheet[langType.ToString()])
langData.TryAdd(pair.Key, pair.Value);
return true;
}
return false;
};

重要 未赋值或返回 false 时,ChangeLanguage 会抛出异常;解表所需的数据来源 (游戏数据库、下载的语言表等) 需在初始本地化前准备完成

onChangeLanguage

public static Action<LangType> onChangeLanguage

切换语系成功后的通知回调,参数为切换后的语系;适合在此刷新 UI 显示文字 (搭配 GetStringByCode)。

private void _InitEvents()
{
// Refresh lang text callback
Localization.onChangeLanguage += this._RefreshLanguage;
}

private void _RefreshLanguage(LangType langType)
{
this.titleText.text = Localization.GetStringByCode("ui.title");
}

提醒 每次切换成功都会触发,回调内容需可重复执行 (建议仅做文字/数据重绘,勿在其中进行一次性注册)。


属性

成员总览

成员说明
currentLanguage当前语系 (只读)。
systemLanguage系统语系 (经支持语系检测,不支持回退 English)。

currentLanguage

public static LangType currentLanguage { get; private set; }

当前语系 (只读);初始值取自 systemLanguage,仅在 ChangeLanguage 切换成功后更新。

// 保存所选语系 (模块不负责保存)
PlayerPrefs.SetInt("language", (int)Localization.currentLanguage);

systemLanguage

public static LangType systemLanguage { get; }

获取系统语系:将 OS 系统语言通过 GetSystemLanguageToLangType 对应为 LangType,再经 GetAndCheckIsSupportedLanguage 检测,不属于支持语系则一律回退 LangType.English

// 首次进入游戏无保存语系时,以系统语系作为默认
Localization.ChangeLanguage(Localization.systemLanguage);

语系切换与取字

方法总览

方法说明
ChangeLanguage切换语系与验证语系合法性。
GetStringByCode根据代码获取语言表中的对应文字。

ChangeLanguage

public static void ChangeLanguage(LangType langType)

切换语系与验证语系合法性,流程如下:

  1. 调用 onParsingLanguageData 解析指定语系的语言表。
  2. 验证 langType 是否属于支持语系:
    • :缓存语言表数据、更新 currentLanguage,并触发 onChangeLanguage
    • :输出警告 (The language type is not supported) 并维持当前语系 (不更新、不触发回调)。
Localization.ChangeLanguage(LangType.Japanese);

// 保存所选语系 (模块不负责保存)
PlayerPrefs.SetInt("language", (int)Localization.currentLanguage);

重要 onParsingLanguageData 未赋值或解析失败 (返回 false) 会抛出 Exception

注意 传入前可先以 GetAndCheckIsSupportedLanguage 校正 (避免保存的旧语系值已不受支持)。

GetStringByCode

public static string GetStringByCode(string code)

根据代码 (Code) 获取当前语言表中的对应文字;查无代码时返回 "Unknown Text"

this.titleText.text = Localization.GetStringByCode("ui.title");

注意 尚未成功执行过 ChangeLanguage (无语言表数据) 时会抛出 Exception;QA 验证时可将 "Unknown Text" 视为缺漏字符串代码的信号。


支持语系查询

方法总览

方法说明
GetSupportedLanguages获取当前支持语系集合。
IsSupportedLanguage是否属于支持语系。
GetAndCheckIsSupportedLanguage检测语系,不支持一律返回 English。
GetSystemLanguageToLangType获取系统语言对应的 LangType 定义。
GetSupportedLanguagesMappingByLangType获取语系文字对照表 (Key = LangType)。
GetSupportedLanguagesMappingByLangDesc获取语系文字对照表 (Key = LangDesc)。

GetSupportedLanguages

public static HashSet<LangType> GetSupportedLanguages()

获取当前支持语系集合;首次调用时触发 onAddSupportedLanguages 收集并缓存,之后直接返回缓存结果。

IsSupportedLanguage

public static bool IsSupportedLanguage(LangType langType)

是否属于支持语系

GetAndCheckIsSupportedLanguage

public static LangType GetAndCheckIsSupportedLanguage(LangType langType)

获取与检测是否属于支持语系类型:支持则原值返回;不支持一律返回 LangType.English。适合用于校正保存值/系统值

var savedLang = (LangType)PlayerPrefs.GetInt("language", (int)Localization.systemLanguage);
Localization.ChangeLanguage(Localization.GetAndCheckIsSupportedLanguage(savedLang));

GetSystemLanguageToLangType

public static LangType GetSystemLanguageToLangType()

获取 OS 系统语言 (UnityEngine.Application.systemLanguage) 对应的 LangType 定义 (不经支持语系检测);无法对应时返回 LangType.Unspecified

提醒 部分语言 Unity SystemLanguage 未内置 (详见 LangType 对照表的系统检测栏),系统检测无法返回,但仍可作为自定义支持语系使用;HindiUnity 2022.3 / Unity 6000.0 以上才支持检测。

GetSupportedLanguagesMappingByLangType

public static Dictionary<LangType, string> GetSupportedLanguagesMappingByLangType()

获取支持语系的语系文字对照表,Key = LangType (ex: LangType.Spanish -> "Español");适合用于生成语言菜单的显示文字 (首次调用后缓存)。

GetSupportedLanguagesMappingByLangDesc

public static Dictionary<string, LangType> GetSupportedLanguagesMappingByLangDesc()

获取支持语系的语系文字对照表,Key = LangDesc (ex: "Español" -> LangType.Spanish);适合用于语言菜单由选项文字反查语系进行切换 (首次调用后缓存)。

// 语言菜单: 以对照文字显示选项,选择后反查 LangType 进行切换
var mapping = Localization.GetSupportedLanguagesMappingByLangDesc();
Localization.ChangeLanguage(mapping["简体中文"]);

LangType

世界语言定义 (byte 枚举),共 72 个值 (Unspecified + 71 种世界语言)。

类型public enum LangType : byte
源码Languages.cs

表格符号说明:

枚举值语言对照文字系统检测
Unspecified未指定✓ (无法对应时的回退值)
Arabic阿拉伯语العربية
ChineseSimplified中文简体简体中文
ChineseTraditional中文繁体繁體中文
Dutch荷兰语Nederlands
English英语English
French法语Français
German德文Deutsch
Italian意大利语Italiano
Portuguese葡萄牙语Protuguês
Spanish西班牙语Español
Bengali孟加拉语বাংলা
Croatian克罗地亚语hrvatski
Czech捷克语čeština
Danish丹麦语Dansk
Greek希腊文ελληνικά
Hebrew希伯来文עברית
Hindi印度语हिंदी✓ (Unity 2022.3+)
Hungarian匈牙利语Magyar
Indonesian印尼语Bahasa Indonesia
Japanese日语日本語
Korean韩语한국의
Malay马来语Bahasa Melayu
Perisan波斯语فارسی
Polish波兰语Polski
Romanian罗马尼亚语româna
Russian俄语Русский
Serbian塞尔维亚语српски
Swedish瑞典语Svenska
Thai泰语ไทย
Turkish土耳其语Türkçe
Urdu乌尔都语اردو
Vietnamese越南语tiếng việt
Catalan加泰罗尼亚语 (西班牙)catalá
Latvian拉脱维亚语Latviski
Lithuanian立陶宛语Lietuvių
Norwegian挪威语Norsk bokmal
Slovak斯洛伐克语Slovenčina
Slovenian斯洛文尼亚语Slovenščina
Bulgarian保加利亚语български
Ukrainian乌克兰语українська
Filipino菲律宾语Tagalog
Finnish芬兰语Suomi
Afrikaans南非荷兰语Afrikaans
Romansh罗曼什语 (瑞士)Rumantsch
Burmese缅甸语 (官方)ဗမာ
Khmer柬埔寨语ខ្មែរ
Amharic阿姆哈拉语 (埃塞俄比亚)አማርኛ
Belarusian白俄罗斯语беларуская
Estonian爱沙尼亚语eesti
Swahili斯瓦希里语 (坦桑尼亚)Kiswahili
Zulu祖鲁语 (南非)isiZulu
Azerbaijani阿塞拜疆语azərbaycanca
Armenian亚美尼亚语 (亚美尼亚)Հայերէն
Georgian格鲁吉亚语 (格鲁吉亚)ქართული
Laotian老挝语 (老挝)ລາວ
Mongolian蒙古语Монгол
Nepali尼泊尔语नेपाली
Kazakh哈萨克语қазақ тілі
Galician加利西亚语Galego
Icelandic冰岛语íslenska
Kannada坎纳达语ಕನ್ನಡ
Kyrgyz吉尔吉斯语кыргыз тили; قىرعىز تىلى
Malayalam马拉亚拉姆语മലയാളം
Marathi马拉提语/马拉地语मराठी
Tamil泰米尔语தமிழ்
Macedonian马其顿语македонски јазик
Telugu泰卢固语తెలుగు
Uzbek乌兹别克语Ўзбек тили
Basque巴斯克语Euskara
Sinhala僧伽罗语 (斯里兰卡)සිංහල
Faroese法罗语Føroyskt

注意 波斯语的枚举值拼写为 Perisan、葡萄牙语的对照文字为 "Protuguês" (皆为源码中的实际定义,使用时请以源码为准)。


LanguageMapping

语系类型与语系显示文字的对照辅助 (静态类)。

类型public static class LanguageMapping
源码LanguageMapping.cs

GetLanguageDesc

public static string GetLanguageDesc(LangType langType)

获取对应的语系文字说明 (详见 LangType 对照表);未定义对照文字时返回 "Unknown Language"

string desc = LanguageMapping.GetLanguageDesc(LangType.Spanish); // "Español"