【问题标题】:How to develop a webapp system which will be easy to localize?如何开发一个易于本地化的 webapp 系统?
【发布时间】:2011-10-10 13:15:55
【问题描述】:
我正在构建一些网络应用程序,我正在考虑为其添加一些本地化,这样人们就可以轻松地在语言之间切换,也许在未来 - 能够为应用程序添加自己的本地化,例如 Facebook 的语言或用户语音。
我知道我应该有一个模板,例如:
<element>[string1]</element>
基本上,[string1] 将被替换为正确的字符串,但我将它存储在哪里?数据库?静态文件?每次从数据库中获取字符串的数据不是很“昂贵”吗?我该如何处理?使用输出缓冲区,或者有一些我不知道的更好的方法。
如果有人能指导我正确的思维方式,我将不胜感激。
【问题讨论】:
标签:
php
web-applications
localization
【解决方案1】:
有许多可用的开源翻译工具包系统可以让您更好地理解该做和不该做的事情(例如pottle、poedit、virtaal)。
如果您决定按自己的方式行事 - 我建议将所有翻译键和值存储在数据库中。在编辑、搜索、丢失翻译等方面你会做得更好。
您可以每 24 小时或在每次新的/编辑的翻译后生成完整的翻译列表,然后以 JSON 或 PHP 序列化格式存储在静态文件中。这将使您免于 MYSQL 选择。
我建议的另一件事是选择 KEYS + KEY TRANSLATIONS 的格式。 KEYS 应在第一次调用时插入数据库以获取翻译。这将导致您出现“缺少翻译”,这是使用第三方或您的网站访问者进行本地化翻译的好方法。
【解决方案2】:
当我必须本地化我的应用程序时,我通常会创建一个 translations/ 目录,然后为每种文化创建一个子目录。例如,我可以在里面有以下文件夹:
-
zh-CN/ - 包含美国用户的翻译。
-
zh-CN/ - 包含英国用户的翻译。
-
zh/ - 包含备用的通用英文翻译。
然后我通过这种方式获取语言环境:
<?php
$default_locale = 'en';
$parts = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
$sub_parts = explode('-', $parts[0]);
if (is_dir("languages/{$parts[0]}")) {
$locale = $parts[0];
}
elseif (is_dir("languages/{$sub_parts[0]}")) {
$locale = $sub_parts[0];
}
else {
$locale = $default_locale;
}
请注意,您应该检查 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 变量以避免 LFI(本地文件包含)尝试。只需检查语言环境是否包含在 languages/ 目录中。
【解决方案3】:
在 PHP 中执行此操作的常用方法是将所有字符串存储在 PHP 数组中的 PHP 文件中。
【解决方案4】:
我建议你看看Gettext for PHP。 gettext 函数实现了一个 NLS(本地语言支持)API,可用于国际化您的 PHP 应用程序。
Gettext 是 linux/unix 系统本地化的事实标准,也广泛用于 PHP 应用程序(例如,Wordpress 使用它)。如需更深入的解释、示例等,请查看上述 PHP 手册中的 Gettext 部分,或者您可以访问 original gettext manual 以更广泛地讨论 gettext 工具、绑定等。