# unity-i18n **Repository Path**: zengriri/unity-i18n ## Basic Information - **Project Name**: unity-i18n - **Description**: A great tool for unity i18n. - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-05-17 - **Last Updated**: 2025-05-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # unity-i18n unity/laya项目国际化工具。 ## 安装 ``` npm i unity-i18n -g ``` # 用法 分如下步骤: * 通过`-S`选项执行搜索命令,搜索工程中的所有中文文本,包括代码、预制体、非二进制配置文件。可以按照文件夹和文件类型等指定搜索哪些文件。搜索完成后将所有中文文本输出到一个Excel表格中。 * 翻译中文文本,并将翻译结果写入上述Excel表格中。 * 通过`-R`选项执行替换命令,处理所有中文文本。可以直接替换为指定语言(Hard模式,硬编码翻译),也可以按照指定格式生成对应的代码语句(Soft模式,运行时翻译)。 以上步骤的细节均可通过选项`-t`提供一个任务描述配置文件进行自定义。同时,本工具分别内置了适用于Unity项目和Laya项目的预设任务,可通过选项`-d unity`或`-d laya`使用。 本工具的各个选项含义如下: ## -v, --version 查看工具版本号。 ## -s, --src \[必须选项\]。需要处理的文件目录,通常是项目根目录。 ## -o, --output \[必须选项\]。提取中文文本的输出目录。执行`-S, --search`命令后,将提取所有中文文本,并输出一个Excel表格`language.xlsx`。表格至少包含3列,包括每个文本的ID、源文本(CN),以及对应的目标语言(默认为LOCAL)。这个表格相当于是翻译字典。 ## --langs 多语言代码,用逗号分开。比如`EN,FR`。默认为`LOCAL`。比如指定多语言代码为`EN,FR`,则上述`language.xlsx`将包含4列:ID/CN/EN/FR。 ## -t, --tasks 转换任务描述配置文件,JSON格式。需符合以下规则: ```TypeScript export interface LocalizeOption { /**指定需要处理的文件 */ includes?: { /**通过文件后缀名进行指定 */ exts?: string[], /**通过目录名进行指定,支持正则表达式 */ dirs?: (string|RegExp)[], /**通过文件路径名进行指定,支持正则表达式 */ files?: (string|RegExp)[] }; /**指定需要排除的文件,优先级高于includes */ excludes?: { /**通过文件后缀名进行排除 */ exts?: string[], /**通过目录名进行排除,支持正则表达式 */ dirs?: (string|RegExp)[], /**通过文件路径名进行排除,支持正则表达式 */ files?: (string|RegExp)[] }; /**指定跳过符合指定规则的语句,比如输出日志中的中文,可以指定不处理 */ skipPatterns?: (string|RegExp)[]; /**用于替换中文串后生成新文件,而不覆盖源文件。*/ replaceOutput?: string; /** * 用于同一个Apk支持多个语言包的情况,相对应的是Hard replace。 * Hard replace直接将资料中的中文字符串替换成指定的语言,Soft replace则替换为指定的代码语句。 */ softReplacer?: string; /**用于将相关文字输出到指定的语言包JSON文件中。 */ outputJSON?: string; } ``` 配置文件中支持以下通配符: * `$LANG` - `--langs`选项指定的语言代码,适用于`outputJSON`和`replaceOutput`字段。 * `$FILENAME` - 正在处理的文件名,适用于`replaceOutput`字段。 * `$RAWSTRING` - 原本的中文文本,包括围合的单引号或双引号,适用于`softReplacer`字段。 可参考内置的任务模板: * [laya_hard.json](bin/builtinTasks/laya_hard.json) * [unity_hard.json](bin/builtinTasks/unity_hard.json) * [unity_soft.json](bin/builtinTasks/unity_soft.json) ## -d, --default 指示按照内置的模板进行处理:`laya|laya_hard|unity|unity_hard|unity_soft`。其中`laya`和`laya_hard`相同,`unity`和`unity_hard`相同。 以下是内置的任务模板的相关定义: * [LayaHardTasks.ts](src/example/LayaHardTasks.ts) * [UnityHardTasks.ts](src/example/UnityHardTasks.ts) * [UnitySoftTasks.ts](src/example/UnitySoftTasks.ts) * [UnityTaskBase.ts](src/example/UnityTaskBase.ts) ## --task-replacer 任务描述配置中可以包含与环境相关的通配符,比如内置模板中包含`$workspace`。可以使用本选项将其替换为适当的值。本选项适用的场景是,多个项目共用一份较为复杂的描述配置,将其中可能有轻微差别之处用通配符进行设置。这样,不需要维护多份描述配置。 ## -S, --search 执行搜索命令。 ## -R, --replace 执行替换命令。 ## --soft-replace 启用Soft模式。Soft模式适用于同一个Apk支持多国语言切换的情况,通过加载对应的语言包实现运行时动态切换。 ## --silent 静默模式,不回显进度日志。默认情况下,会输出当前处理文件的信息日志。 ## -x, --xlsxstyle `languages.xlsx`排序规则,支持`prepend|append|sort-by-id`,分别表示“新文本居前”、“新文本居后”和“按id进行排序”。默认为`append`。 ## -l, --log 输出日志文件。默认不输出。 ## --pretty 以友好可读模式生成语言包json文件。 ## --strict 启用严格模式后,发现以下情况将报错: * 代码中包含拼接字符串 * 存在未翻译的字符串 ## --lockfile 启用构建锁。 ## -h, --help 查看帮助菜单。 # Hard模式 Hard模式是指直接将代码、非二进制配置文件、预制体内包含中文的文本直接替换成指定的语言文本。这种模式适用于单语言海外版本的制作,平时开发时在代码、表格中直接使用中文,构建版本时使用本工具替换成目标语言。效果如下: JSON配置文件转换前 ```JSON { "m_szName":"在线奖励拿不完" } ``` JSON配置文件转换后 ```JSON { "m_szName":"접속보상 무한증정" } ``` # Soft模式 Soft模式通常用于代码中和预制体中的中文文本的处理,通过将中文文本`"中国万岁"`转换为类似`I18N.I18NMgr.Translate("中国万岁")`的语句,实现运行时动态切换。 比如内置的`UnityTasks`中关于TypeScript代码的处理配置: ```TypeScript let tsTask: LocalizeTask = { "roots": ['TsScripts'], "option": { "excludes": { "dirs": ['protocol/new'], "files": ['TestView.ts', 'Macros.ts', 'ErrorId.ts', 'SendMsgUtil.ts', 'GameConfig.d.ts'] }, "includes": { "exts": ['.ts'] }, "skipPatterns": ["^\\s*uts\\.log", "^\\s*uts\\.assert\\(""], "softReplacer": "I18N.I18NMgr.Translate($RAWSTRING)", "outputJSON": "Assets/AssetSources/i18n/$LANG.json" } }; ``` 其中`softReplacer`字段的效果如下: TypeScript文件转换前 ```TypeScript this.dropdown.setOptions(["全 部", "1", "2", "3", "4", "5", "6"], 5) ``` TypeScript文件转换后 ```TypeScript this.dropdown.setOptions([I18N.I18NMgr.Translate("全 部"), "1", "2", "3", "4", "5", "6"], 5) ``` `outputJSON`字段的效果是将本任务(此处为所有TypeScript文件)涉及的所有中文文本及对应的语言版本的语言包以JSON格式分别输出到对应的文件中。比如指定多语言为`TW,EN`,则分别输出到`Assets/AssetSources/i18n/CN.json`、`Assets/AssetSources/i18n/TW.json`和`Assets/AssetSources/i18n/EN.json`。 语言包格式为: ```TypeScript { "strings": ["ID1", "STR1", "ID2", "STR2", ...] } ``` CN.JSON ```JSON {"strings":["3d69a6e96ef836615a4d0988950dcaa0"," (已完成)","7f4ae9a211d22e3930c9eee0b37196c2"," (进行中)","fe058bb2bc7d6eeebe567b157b968f8c","(?D天) hh:mm:ss","fe4557e1c0b4e3a09acc147e3e5675ac","(?D天)h时","7835a8a1216f025a65fb8235bd3b7d9f","(?D天)h时m分s秒"]} ``` TW.JSON ```JSON {"strings":["3d69a6e96ef836615a4d0988950dcaa0"," (已完成)","7f4ae9a211d22e3930c9eee0b37196c2"," (進行中)","fe058bb2bc7d6eeebe567b157b968f8c","(?D天) hh:mm:ss","fe4557e1c0b4e3a09acc147e3e5675ac","(?D天)h時","7835a8a1216f025a65fb8235bd3b7d9f","(?D天)h時m分s秒"]} ``` # @i18n-ignore 在代码中,使用`// @i18n-ignore`可指定下一行不进行翻译。使用`// @i18n-ignore:begin`和`// @i18n-ignore:end`可指定之间的所有行均不参与翻译。 # 使用示例 ## 搜索中文文本 使用内置unity任务配置+Soft模式+指定多国语言为简体中文、繁体中午、英文。 ``` unity-i18n -s "F:/dp/trunk/" -o "F:/dp/trunk/tools/i18n/dictionary" -d "unity_soft" -S --soft-replace --langs TW,EN ``` ## 替换中文文本 ``` unity-i18n -s "F:/dp/trunk/" -o "F:/dp/trunk/tools/i18n/dictionary" -d "unity_soft" -R --soft-replace --langs TW,EN ```