【问题标题】:Localization: Php and Javascript本地化:PHP 和 Javascript
【发布时间】:2014-12-05 18:08:13
【问题描述】:

我正在考虑本地化我的网站的最佳方式。我正在使用 Laravel,它已经有一个 php 本地化类,但我还需要翻译一些 javascript 字符串

理想情况下,我会使用可以通过 Poedit 编辑并且可以用于 javascript 和 php 的库或翻译文件,但我找不到解决方案。甚至可以不用创建一个全新的代码库吗?

到目前为止我想到的解决方案还远非理想:

  • 为 php 字符串使用 php 本地化类
  • 为 javascript 使用 javascript 本地化库
  • 将语言存储在两端均可读取的 cookie 中。

保留两个单独的语言文件(一个用于 php,一个用于 javascript)的想法似乎不是一个优雅的解决方案。

我看到了一些用于 laravel 的 javascript 库,但是它们要求您每次更新某些内容时将库编译为 javascript 数组文件,这将使其不是非常动态且冗余,因为大多数 php 字符串不会被使用在 javascript 中,反之亦然。

对此有什么想法吗?

【问题讨论】:

    标签: javascript php laravel localization language-translation


    【解决方案1】:

    您始终可以让您的 Javascript 文件由 PHP 根据请求生成,这意味着您仍然可以为两者使用 PHP 本地化库。

    我想这对于在浏览器中缓存 javascript 文件可能不是很好,但你总是可以有一个 PHP 脚本来生成 javascript 文件,为每种语言创建一个不同的文件,然后在任何时候你需要更新它们, 只需再次运行 PHP 脚本即可覆盖它们

    我从未从事过本地化工作,但我想它涉及一个匹配每种语言的单词/短语的文件?如果是这样,您可以设置一个 cron 作业来检查上次更新此文件的时间,然后运行 ​​PHP 脚本来生成 Javascript 文件?这样你就不用担心每次都手动运行了

    【讨论】:

      【解决方案2】:

      我们已经面临这个问题一段时间了。如果你在 Github 上搜索,你会发现那里有一些项目,但其中任何一个都可以解决问题,而且正如你所说,维护两个文件根本不是一个好的选择。所以,我们找到解决这个问题的方法是:

      1. 在每个页面上,在 javascript 上声明一个变量,您将使用 php 设置该变量,这样它也可以在 JS 端使用。它一点也不优雅,但解决了这个问题。所以它会是这样的:

        /**
         * i18n for JS
         */
        
        var i18n = (function() {
          return {
            stringOne: "{{trans('yourStringOneKeyFromPhp')}}",
            stringTwo: "{{trans('yourStringTwoKeyFromPhp')}}"
          }
        }());
        
      2. 另一方面,正如 Adi 指出的那样,更好的解决方案是创建 fake 视图,这些视图实际上用作 javascript 文件,您将在其中解决 i18n 变量在控制器上。这是一个更优雅的解决方案,但它不利于缓存,所以我认为这是一个权衡问题,您选择实现哪种方式。也许,一个好方法是使用这个plugin,并更新 json 文件,如前所述。

      【讨论】:

        【解决方案3】:

        对于中小型网站,我会创建一个翻译表,例如

        table: translations
        en_gb, de, fr
        --------------------------------
        Text, Text (in de), Text (in fr)
        

        然后您将通过您的 url 识别当前语言环境并仅获取当前语言环境的数据,例如

        if locale == de, get en_gb and de fields.
        

        然后构建你的数组:

        $translations = ['en_gb' => 'de'];
        

        获得数组后,您可以通过 php 翻译任何静态内容。

        现在您可以将数组传递给 javascript

        var translations = json_encode($translations);
        

        现在您还将拥有一个可以访问的 javascript 对象: translations['English text'] 将返回 de 翻译。

        您将只在页面加载/刷新时查询一次数据库,并且这些表将使其易于维护。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2010-10-08
          相关资源
          最近更新 更多