我已经开始为一个包含大量硬编码文本的中型网站编写多语言功能。由于该网站应该被翻译成日语和韩语(多字节字符集),我正在考虑以下内容:
- 如果我使用字符串外部化,日语或韩语的字符串是否需要在语言环境文件中采用 unicode 形式(即
台北
,而不是台北作为字符串值)? - 将本地化存储在数据库(即 MySQL)中并通过 PHP 中的本地化函数检索相应的值是否更有意义?
非常感谢您的想法输入。
最好的祝福
我已经开始为一个包含大量硬编码文本的中型网站编写多语言功能。由于该网站应该被翻译成日语和韩语(多字节字符集),我正在考虑以下内容:
台北
,而不是台北作为字符串值)?非常感谢您的想法输入。
最好的祝福
0.02 美元来自对 i18n 有一定经验的人...
根据您的要求,您可能需要考虑上述的混合。
但我强烈建议您避免将代码(HTML 字符实体)与您的翻译资源混合。大多数翻译人员不会理解它们的意思,并且在翻译时可能会破坏它们。另一方面,程序员可能不明白如何正确地将代码或格式插入翻译资源,除非他们真正理解该语言。
tl;dr
- use UTF-8
- don't mix any code/formatting into the translations themselves
- how you store the translations depends upon your requirements
gettext
是一个很好的方法。我怀疑字符串外部化将是您最大的问题。但是让我给你一些建议。
字符串外化
当然,您需要将可翻译的字符串与代码分开。我建议将翻译存储在纯文本、包含键值对的 UTF-8 编码文件中:
some.key=some translation
当然,您需要编写一个帮助脚本来在运行时解决这个问题。该脚本需要检测最终用户的语言。
语言检测
Web 浏览器每次发送请求时都可以发送 AcceptLanguage 标头。您需要做的是阅读此标题的内容并检查您是否支持用户列出的任何语言。如果是这样,请阅读资源文件(如上定义)并返回给定语言的字符串,否则返回您的默认语言。下面的代码示例将为您提供最想要的语言(您支持的语言不是必需的):
<?php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>
这仍然不是您面临的最大挑战。
样式和样式表
多语言网站或 Web 应用程序的真正问题是样式。人们倾向于将样式定义串联起来,这至少可以说是有问题的。此外,设计师倾向于认为 Arial 是整个 Universe 的最佳字体,并且强调总是必须带有粗体字体。唯一的问题是,在某些情况下字体可能不可读。
我必须承认,我不知道为什么会这样,但大多数时候网络浏览器倾向于忽略亚洲脚本的粗体属性(这很好),但有时它们不会,如果它可能成为最终用户的主要挑战你的字体定义是 say font-family:Arial; font-size:10px;
。
另一个问题可能是颜色。根据您的网站设计,使用的某些颜色可能不适合目标客户。那是因为我们都倾向于根据我们的文化背景给颜色赋予意义。
包含可本地化文本的图像也可能让您头疼,您需要将此类文本外部化(并像任何其他 HTML 元素一样将它们写下来),或者准备多语言资源结构(即将所有图像放入以语言代码命名的目录(“ en”、“ja”、“ko”))。
然而,真正的挑战是硬编码的格式化标签,如<b>
, <i>
, <u>
,<strong>
等。现在没有人应该使用它们,应该使用样式类,但通常的做法是不同的。您可能需要用样式类替换它们;每个元素可以有多个样式类,令我惊讶的是这不是常识(例如<p class="main boldText">
)。
好的,一旦你的样式被外部化了,你可能会被迫实现某种CSS 本地化机制。根据我上面写的内容,这是需要的。最简单的方法是创建类似于我之前提到的目录结构——“en”用于英语基础 CSS 文件,“ja”用于日语,“ko”用于韩语,因此每种语言都有自己的独立集CSS 文件。这类似于 UI 皮肤,只是在这种情况下用户将无法选择皮肤,您将决定呈现它们的 CSS - 无论如何您都会检测语言。
至于内联样式定义 ( <p style="whatever">
),在定义 CSS L10n 机制后,您可以通过强制使用!important
关键字来覆盖任何样式。也就是说,除非有人在他非常错误的想法中将此关键字放入内联样式定义中。
串联
嗯,这是你最大的挑战。即使是了解字符串外部化需求的人也倾向于像这样连接字符串:
$result = $label + ": " + $product;
$message = "$your_basket_is + $basket_status + ".";
这给国际化带来了严重的问题(如果本地化也没有解决)。那是因为,将文本翻译成不同的语言后,句子的顺序往往会有所不同(尤其是韩语)。此外,我还向您展示了硬编码的标点符号,这对于亚洲语言来说不一定是正确的。这就是我每天必须经历的:/
您可能需要做的是删除此类连接,或使用某种消息格式化方法。PHP 示例(直接取自我引用的网页)将是:
<?php
$fmt = new MessageFormatter("en_US", "{0,number,integer} monkeys on {1,number,integer} trees make {2,number} monkeys per tree");
echo $fmt->format(array(4560, 123, 4560/123));
$fmt = new MessageFormatter("de", "{0,number,integer} Affen auf {1,number,integer} Bäumen sind {2,number} Affen pro Baum");
echo $fmt->format(array(4560, 123, 4560/123));
?>
正如您在此示例中所看到的,数字也被格式化为许多语言环境样式。这导致我们:
区域感知格式
日期、时间、数字和货币或其他类似信息需要根据用户检测到的区域设置进行格式化。这里有一个细微的差别:你应该尝试这样做,即使你不支持相关的语言资源(没有翻译)。当然对于货币符号,您可以使用您的真实货币,而不是用户的默认值,但格式应尊重最终用户的文化背景。
概括
I have just presented you with a short introduction to multilingual web site design with focus on Japanese and Korean target markets. If at some point you would need to support Chinese Simplified as well, support for GB18030 encoding would be probably needed as well. This would be very challenging...