多语言PHP应用程序:最佳实践?

时间:2011-05-14 07:56:59

标签: php performance model-view-controller localization internationalization

我希望得到您对我在PHP MVC Web应用程序上实现多语言支持的方式的反馈。我就这样做了:

  • 在/ app文件夹中我创建了一个/ languages文件夹,其中包含每种语言一个文件(english.php,spanish.php等)
  • 每个文件包含一系列变量,每个文件中具有相同的名称,包含要在视图中呈现的文本
  • 然后在不同的视图中回显这些变量
  • 当用户更改语言时,“语言”cookie变量会更新
  • 在每个视图的控制器中,我包含以下格式的语言文件:

包括$ _SERVER ['DOCUMENT_ROOT']。 “/ app / languages /”。 $ _COOKIE [“语言”]。 “.PHP”;

听起来很整洁。你对这种方法有任何负面想法吗?

4 个答案:

答案 0 :(得分:4)

当你使用PHP 5.3.2时,如果可以的话,我绝对建议你查看intl扩展名。它充满了方便的功能和类,以协助i18n。例如,您可以使用以下代码段为您的访问者生成“最适合”的语言:

$langs = array('en', 'fr', 'de');
$preferences = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$locale = Locale::lookup($langs, $preferences);

除了直接的逐字逐句替换外,还有更多要思考的问题。不同的语言有不同的格式约定。这个Zend article中有很多可能有用的信息。

我的代码使用XSL进行模板化,因此在翻译时我使用XML语言文件和XPath查询,以便语言可以直接理解语言文件,但PHP也可以使用{{3}格式化字符串}。

我会避免将数据库用作商店,说实话,只是为了提高性能。

答案 1 :(得分:1)

您还可以解析接受语言标题,以帮助确定做什么。

Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
我看起来像那样。这不是万无一失的,但它可以自动设置适当的cookie。

答案 2 :(得分:1)

只是一些想法

  • 如果您的每种语言都有一个文件,并且您的网站有多个页面,那么您很快就会忽略哪个标记包含哪个文本在哪个页面上
  • 如何确保在创建新标记时,所有其他语言中都有标记并且它们已被翻译?
  • 你如何处理不同语言的格式?浪漫语言往往比英语长约30%,因此可能会增加页面流量。
  • 同样的,从右到左(RTL)的希伯来语与欧洲语言的LTR不同?或者中国人和日本人有不同的线路流,没有空格?
  • 你是如何进行翻译的?导出文件并再次导入?您是否打算使用xliff或TMX或gettext版本来使翻译人员生活更轻松,翻译成本更低?
  • 你如何质疑翻译?

答案 3 :(得分:1)

由于您只是在语言文件中包含数据,我建议您使用GetText。它是用于国际化的标准GetText C ++的一个端口,有很多工具可以构建语言文件,并且由于运行时编译的文件而非常快。

你基本上用一种INI文件格式构建你的数据文件(例如 fr.po en.po )并将这些文件编译成专门的.mo文件( fr.mo en.mo ,...)并简单地用静态函数_()回显国际化字符串,例如echo _("Hello World");将生成德语输出Hallo Welt或(如果.mo文件中没有可用的转换)默认字符串Hello World

至于选择正确的语言:这取决于您的要求。正如已经指出的那样,您应该使用浏览器的Accept-language - 标题,并且可能希望通过会话信息添加对覆盖的支持。