【问题标题】:internationalization on web pages [closed]网页国际化[关闭]
【发布时间】:2013-08-19 04:16:06
【问题描述】:

在一个域中支持多种语言的标准做法是什么?

在 C++ 中,我们会为每种语言创建一个资源文件,分为多个部分,然后根据本地用户,我们将加载该部分并将任何预翻译的文本应用到菜单等。

是否有类似的东西可用于通过 PHP 实现的 HTML?

是否可以有一个 xml 文件,其中包含默认元素和包含网站上常见文本的其他语言特定元素?公共领域中是否已经存在这样的“数据库”?

我希望我的网站首先检测用户所在的国家/地区,并提供一个可选的“语言”按钮。然后诸如“登录”“主页”“关于我们”之类的文本将被插入到 HTML 中。

请注意,我不希望谷歌翻译。

【问题讨论】:

  • 在尝试通过网络或其他方式确定国家/地区之前,请务必查看浏览器的语言设置。
  • @AlexNorth-Keys 感谢您的提示

标签: php html internationalization


【解决方案1】:

PHP 有一个使本地化更容易的特性,gettext。 Here 你会找到一个不错的教程。

【讨论】:

    【解决方案2】:

    这是一个非常广泛的问题,但这里有一个简短的答案和一些链接供您进一步研究:

    • 检测用户首选语言通常使用各种因素完成,包括GeoIPOS and browser language settings
    • 正如其他答案中提到的,在 PHP 中使用 gettext 是一种常见的解决方案,但它用于存储翻译内容的格式不是 XML。它的 PO 文件如下所示:

       msgid "Enter a comma separated list of user names."
       msgstr "Eine kommagetrennte Liste von Benutzernamen."
      
       msgid "Goodbye!"
       msgstr "Aufwiedersehen!"
      
    • PO 文件被格式化为 MO 文件供gettext 使用:

      msgfmt -o myPHPApp.mo myPHPApp.po

    • 这些翻译文件被放在一个目录结构下,如:

      ./locale/xx_XX/LC_MESSAGES/messages.mo.

    • 然后您需要将此文件添加到您的 PHP 代码中:

      <?php
      
      // Set language to German
      putenv('LC_ALL=de_DE.utf8');
      setlocale(LC_ALL, 'de_DE.utf8');
      
      // Specify location of translation tables
      bindtextdomain("myPHPApp", "./locale");
      
      // Choose domain
      textdomain("myPHPApp");
      
      // Translation is looking for in ./locale/de_DE.utf8/LC_MESSAGES/myPHPApp.mo now
      
      // Print a test message
      echo gettext("Welcome to My PHP Application");
      
      // Or use the alias _() for gettext()
      echo _("Goodbye!");
      
      ?>
      

    【讨论】:

    • 很抱歉听起来很愚蠢,但 setlocale() 让我感到困惑。一旦设置它会在系统范围内应用还是每次看到新语言时都需要它?我的意思是,每次点击页面都需要语言检测和区域设置吗?
    • 实际上,这是一个非常好的问题,因此它改变了LC_ALL,这是一个环境变量。 setLocale() 仅限于当前脚本和putenv()“将设置添加到服务器环境 [which] 将仅在当前请求期间存在”。一旦用户检测到或选择了语言,就可以在$_SESSION 中存储和标识符(如$_SESSION['locale']),因此当用户从一个页面导航到另一个页面时,语言选择仍然存在。
    • 感谢您解决这个问题。碰巧的是,我正在构建我的站点的Wordpress 已经内置了此支持。现在,我必须学习如何使用它。我想在我去的时候正确地格式化字符串,而不是稍后再回去做。
    【解决方案3】:

    最常见的是PO 格式。你可以使用gettext

    问候!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2010-09-10
      • 2010-12-21
      • 2011-03-13
      • 1970-01-01
      • 2016-03-28
      相关资源
      最近更新 更多