> For the complete documentation index, see [llms.txt](https://octanta-studio.gitbook.io/zi-dong-jiao-cheng-sheng-cheng-qi-you-xi-nei-ti-shi-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://octanta-studio.gitbook.io/zi-dong-jiao-cheng-sheng-cheng-qi-you-xi-nei-ti-shi-cn/usage-guide/advanced-localization.md).

# Advanced: Localization

## 本地化系统基础

该系统涉及：

* InputStringsScriptableObject对象(TSR > TipTextData)
* 带有翻译的CSV表(TSR > TipTextData > CSVFile)
* 来自此处的文本嵌入到教程步骤和单独的文本对象中

<figure><img src="/files/64P3F5QaSJ6FFkkEe8bY" alt=""><figcaption><p>Storage</p></figcaption></figure>

## 添加翻译

要进行翻译，您需要至少有一种语言的文本提示。要添加翻译：

1. 打开TSR > TipTextData。这是存储所有场景和教程的所有文本提示的地方。
2. 按"Export current strings to CSV"按钮。
3. 编辑CSV。当前字符串的副本已在"Default"列中创建。将它们通过翻译器处理，并将翻译插入到相应的语言列中。
4. 完成。现在，在运行时或编辑模式下切换语言时，字符串会根据翻译进行更改。字符串及其翻译通过匹配文本进行搜索，不绑定到特定索引。

{% hint style="success" %}
**建议使用CSV文件中的键来获取工具提示文本。**&#x53EF;以在第一列中为每个字符串添加键。然后可以从教程步骤、Tutorial Trigger或Localized Tooltip中通过键访问文本。
{% endhint %}

<figure><img src="/files/LE53AwTjMVtrQeouAKhH" alt=""><figcaption></figcaption></figure>

## **切换语言（4 种方式）**

更改语言会在运行时和编辑模式下无缝更新所有文本提示。

{% hint style="success" %}
所选语言在运行时的会话之间保存和加载。如果不存在保存的数据，则最初设置Default Language(英语，可更改)。
{% endhint %}

* 在检视器中：通过TSR > TipTextData更改语言，只需从下拉列表中选择不同的值。
* **通过脚本(推荐)：**&#x8C03;用TSR > TipTextData > inputTextSettings.ChangeLanguage()方法。指定任何语言并直接从存储中调用翻译，无需引用场景上的ATM。 图像选项

<figure><img src="/files/MM2W0ZwTDo1FfYrXCTyo" alt=""><figcaption></figcaption></figure>

* 通过脚本：调用TSR > TranslateAllTutorial()方法。使用下拉列表中现有语言之一。`sceneReferences.TranslateAllTutorial(InputStringsScriptableObject.Language.Italian);`
* 通过脚本：调用TSR > TranslateAllTutorialByString()方法。指定在CSV文件第一行中声明的任何语言，即使该语言未在下拉菜单中列出。`sceneReferences.TranslateAllTutorialByString("Polish");`

## **添加新语言**

| Simplified (found by string)                                                                                                                                                                                  | As Enum for the list (found by column number)                                                                                        |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| <ol><li>打开CSV文件并用翻译填充任何空列</li><li>确保列中的第0行以使用的语言命名，例如"Romanian"</li><li>完成。可以通过TSR > TranslateAllTutorialByString("Romanian")方法或inputTextSettings.ChangeLanguage("Romanian")调用此语言进行翻译。例如，将其链接到国旗按钮。</li></ol> | <ol><li>打开 InputStringsScriptableObject.cs</li><li>找到 "public enum Language" > "AddCustomLanguage = 11"，将其替换为你的语言，例如 "Romanian = 11" |

</li><li>打开 CSV 文件，并在第 11 列（L 列）填写罗马尼亚语翻译</li><li>完成。要创建新语言，请使用未使用列的索引，例如 "CustomLanguage = 16"</li></ol> |

## 分配特殊字体

使用Language Special Fonts列表，以便在切换到特殊语言时，文本对象更改其字体 - 例如，这对中文和日文很有用。

<figure><img src="/files/AmhTxzVwMhQeuZrYfFqB" alt=""><figcaption></figcaption></figure>

* 向Language Special Fonts列表添加条目，指定语言的列名称，并分配相应的Font。
* 同时分配Default Font，当从特殊语言切换回默认语言时，文本将恢复为该字体。
* 设置Initial Font = true，这样即使是基本的ATM工具提示最初也会使用默认字体或专用字体。否则，它们将按原样生成，仅在翻译、切换到特殊语言以及切换回来时才会更改字体。

## Sprite Assets

{% hint style="danger" %}
在旧版本的Unity中，精灵资源可能显示不正确。
{% endhint %}

为了支持文本中的精灵资源(例如按键图标)，使用InputStringsScriptableObject中的Main Sprite Asset引用。默认情况下，它包含一个空图集key\_empty和对工作资源的回退，其中每个按键都是单独的Sprite Asset。这样做是为了便于使用和替换。

<figure><img src="/files/9cgcDLI5dtc1O2BM8BET" alt=""><figcaption></figcaption></figure>

* 要创建自己的Sprite Asset，可以从精灵创建一个(Create > TextMeshPro > Sprite Asset)，并将其添加到key\_empty资源内的Fallback Sprite Assets列表中。然后，在提示文本中，可以按名称引用它，例如：\<sprite name="key\_e">。
* 要替换现有资源之一，例如更改E键的设计，可以在相应的按键资源(key\_e)内用自己的Sprite Atlas替换。
* 使用精灵资源可能会影响性能，因此如有必要，请将文本中自动生成的标签替换为简单名称(\<sprite name="key\_e"> → E)，或在生成之前从InputStringsScriptableObject中删除Main Sprite Asset引用。

## 使用额外的可本地化文本

除了由ATM管理的工具提示外，您还可以为工具提示预制体或其他目的创建额外的文本对象。它们也可以从CSV中提取翻译。为此，使用公共方法从ScriptableObject访问它。

<figure><img src="/files/sT2TAtW83VJaMDFVBzV9" alt=""><figcaption></figcaption></figure>

查看LocalizedTooltip组件，它可以通过行号或字符串键获取值。它在Graphic Popup Skip Tutorial预制体和演示场景上的Tutorial Skipper对象中使用 - 将其作为示例查看。

<table><thead><tr><th width="200">TSR > TipTextDataMethod</th><th width="255">Description</th><th>Call Example</th></tr></thead><tbody><tr><td>InitializeLocalizator()</td><td>初始化翻译系统。建议在启动时调用它以进行后续处理所有翻译。</td><td><code>inputTextSettings.InitializeLocalizator();</code></td></tr><tr><td>ChangeLanguage()</td><td>翻译与TipTextData关联的所有文本的语言。</td><td><code>inputTextSettings.ChangeLanguage("English");</code></td></tr><tr><td>GetCurrentFont()</td><td>获取适合该语言的当前字体，如果需要将其应用于特定文本。</td><td><code>objectText.font = inputTextSettings.GetCurrentFont();</code></td></tr><tr><td>GetStringText(int rowIndex)</td><td>根据当前语言按编号从表行获取文本。</td><td><code>objectText.text = inputStrings.GetStringText(3) + "...";</code></td></tr><tr><td>GetStringTextByKey(string key)</td><td>根据当前语言使用第0列的字符串键从表行获取文本。</td><td><code>objectText.text = inputStrings.GetStringTextByKey("main_menu_play");</code></td></tr><tr><td>FillTextObject(int rowIndex, TMP_Text textToFill)</td><td>用表中找到的文本填充文本对象。缓存文本以便稍后无需手动触发即可自动翻译。</td><td><code>inputTextSettings.FillTextObject(connectedTableRow, objectText);</code></td></tr><tr><td>FillTextObjectByKey(string key, TMP_Text textToFill)</td><td>用表中找到的文本填充文本对象。缓存文本以便稍后无需手动触发即可自动翻译。</td><td><code>inputStrings.FillTextObjectByKey("settings_title", settingsText);</code></td></tr><tr><td>ReplacePlaceholders(int rowIndex, params object[] values)</td><td>获取包含{}占位符的文本并将其替换为实际变量。</td><td><code>inputStrings.ReplacePlaceholders(2, userName, coins);</code></td></tr><tr><td>FillTextObjectWithPlaceholders(int tableRow, TMP_Text textToFill, params object[] values)</td><td>获取包含{}占位符的文本并将其替换为实际变量。同时缓存文本以便稍后无需手动触发即可自动翻译。</td><td><code>inputStrings.FillTextObjectWithPlaceholders(5, myTextComponent, "John", 100);</code></td></tr></tbody></table>
