RmlUi 完全支持通过下面描述的接口进行本地化。

字符串编码

RmlUi 假定它给出的所有数据,无论是从 RML 读入还是通过程序提供,都是 UTF-8 编码。 这意味着如果您使用 8 位 ASCII,则无需更改任何内容,但允许您在需要时指定多字节 Unicode 字符。

翻译

RmlUi 在解析 RML 时读取的所有原始文本(即除 XML 标记之外的所有内容)都通过 系统接口 上的 TranslateString() 函数发送。 该函数被赋予读取的原始字符串,应用程序可以在将翻译后的字符串(以及所做的替换次数)返回给 RmlUi 之前进行任何必要的修改。

通过翻译器将执行以下操作:

#include <RmlUi/Core/SystemInterface.h>

class SampleSystemInterface : public Rml::SystemInterface
{
	int TranslateString(Rml::String& translated, const Rml::String& input)
	{
		translated = input;
		return 0;
	}

字符串表

TranslateString()方法可以与应用程序的字符串表结合使用,以对文档的文本进行文本替换。 例如,以 Rocket Invaders 示例中的 pause.rml 文件为例:

<rml>
	<head>
		<title>退出?</title>
	</head>
	<body>
		<p>你确定要结束游戏吗?</p>
		<button></button>
		<button>否!</button>
	</body>
</rml>

如果我们要本地化 Rocket Invaders,我们希望将所有英文字符串从 RML 中移出并放入字符串表中。 然后,RML 中的原始文本将被字符串表标签替换:

<rml>
	<head>
		<title>[退出标题]</title>
	</head>
	<body>
		<p>[退出确认]</p>
		<button>[确认]</button>
		<button>[拒绝]</button>
	</body>
</rml>

假设应用程序有一个 StringTable 类,该类已经为该语言加载了适当的字符串表,那么我们的示例翻译器将变为:

	int TranslateString(Rml::String& translated, const Rml::String& input)
	{
		// 尝试在字符串表中查找翻译。
		if (StringTable::GetString(translated, input))
			return 1;

		// 没有翻译; 返回原始输入字符串。
		translated = input;
		return 0;
	}

现在字符串对于我们指定字符串表的任何语言都是有效的。 在实践中,您可能需要更复杂的翻译器来替换字符串中的多个标记。

注意,您可以将 RML 放入已翻译的字符串中,它将被适当地解析,例如, 你可以用一个 <img> 标签做替换标签,以呈现控制器按钮的图标。