5

我想通过我在我的PHP MVC web应用程序上实现多语言支持的方式得到您的反馈。这就是我所做的:
多语言PHP应用程序:最佳实践?

    在/ app文件夹
  • 我创建了包含每种语言一个文件
  • 每个文件都包含一个意甲/语言文件夹(english.php,spanish.php等)与每个文件的同名变量,包含文本的意见
  • 那么这些变量在不同的观点呼应呈现
  • 当用户更改语言中的“语言” cookie变量更新
  • 在每个视图的控制器中,我包含以下格式的语言文件:

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

听起来很整齐。你会对这种方法有任何消极的想法吗?

+4

不要验证cookie值,cookie可以被客户端改变! – gnur 2011-05-14 08:00:52

+0

有几件事情,你可能想让语言成为URL的一部分。所以这些机器人可以索引你的网站。另外,您可能希望将内容移到数据库中,而不是将其放在文件中,因为这样可以更轻松地添加新的语言 – JohnP 2011-05-14 08:01:57

+0

好点,谢谢指出验证点!我正在考虑将它移到数据库。我最终认为通过一个文件可能会更好的表现明智......但确实可能难以保持。如果我通过数据库选项,我正在考虑通过创建一个语言字段,然后每页一个字段(index.php,home.php等)来设计它(我使用mySQL),每个字段包含一个数组在每个页面上呈现不同的文本。你怎么看? – gwendall 2011-05-14 08:13:05

回答

1

你也可以解析accept-language头来帮助决定做什么。

Accept-Language:en-GB,en-US;q=0.8,en;q=0.6 

我看起来像那样。这不是很好的证明,但它可以自动设置适当的cookie。

+0

谢谢,同意这是确定相关默认语言的好方法,但您也希望让用户在应用中更改他们的语言(想想那些不使用自己的计算机的旅行者)。 – gwendall 2011-05-14 08:16:26

+0

准确地说 - 虽然这是一种以相当高的精度猜测默认值的简单方法。 – 2011-05-14 08:19:13

+0

这是一个远离万无一失的漫长道路,大多数人从不改变语言。 – PurplePilot 2011-05-14 10:02:51

4

因为你在使用PHP 5.3.2,所以如果可以的话,我肯定会推荐检查intl扩展名。它充满了方便的功能和类,以协助国际化。例如,您可以使用下面的代码片段来为您的访问者来自那些“最适合”的语言你提供以下信息:

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

还有很多更多的思考比直字对字的替换。不同的语言有不同的格式约定。这个Zend article中有很多信息可能是有用的。

我的代码使用XSL进行模板化,所以在翻译时我使用XML语言文件和XPath查询,以便语言文件可以直接通过模板理解,但也可用于PHP格式化字符串MessageFormatter

我会避免使用数据库作为商店老实说,只是为了性能。

+0

非常丰富。 [MessageFormatter](http://www.php.net/manual/en/class.messageformatter.php)看起来真的很有趣,谢谢! – 2012-02-06 10:19:58

1

只是一些想法

  • 如果每个语言一个文件,你的网站有比你更将其标签的快速了,履带持有该文本上页
  • 您如何确保了几页当你创建一个新的标签,其中有所有其他语言的标签并且它们已被翻译?
  • 你如何处理不同语言的格式?浪漫语言往往比英语长30%左右,因此可能会导致页面流失。
  • 以同样的方式,与欧洲语言一样,左右(RTL)不是LTR的希伯来语呢?或者中国人和日本人可能有不同的线路流向,没有空白区域?
  • 你如何做翻译?导出文件并再次导入它们?您是否打算使用xliff或TMX或gettext的版本来使译者的生活更轻松,翻译成本更便宜?
  • 你如何翻译翻译?
1

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

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

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