Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本地化:Php和Javascript_Javascript_Php_Laravel_Localization_Language Translation - Fatal编程技术网

本地化:Php和Javascript

本地化:Php和Javascript,javascript,php,laravel,localization,language-translation,Javascript,Php,Laravel,Localization,Language Translation,我正在考虑将我的网站本地化的最佳方法。我正在使用Laravel,它已经有了一个php本地化类,但我还需要翻译一些javascript字符串 理想情况下,我会使用一个库或翻译文件,可以通过Poedit进行编辑,可以用于javascript和php,但我找不到解决方案。甚至不必创建一个全新的代码库也可以吗 到目前为止,我所想到的解决方案还远远不够理想: 对php字符串使用php本地化类 对javascript使用javascript本地化库 将语言存储在两端都可以读取的cookie中 保留两个单

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

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

到目前为止,我所想到的解决方案还远远不够理想:

  • 对php字符串使用php本地化类
  • 对javascript使用javascript本地化库
  • 将语言存储在两端都可以读取的cookie中
保留两个单独的语言文件(一个用于php,一个用于javascript)的想法似乎不是一个优雅的解决方案

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


您对此有何想法?

您可以始终让Javascript文件在每次请求时由PHP生成,这意味着您仍然可以使用PHP本地化库来实现这两个目的

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


我从未从事过本地化工作,但我想它涉及到一个文件,该文件匹配每种语言的单词/短语?如果是这样,您可以设置一个cron作业来检查上次更新该文件的时间,然后运行PHP脚本生成Javascript文件?这样,您就不必担心每次手动运行它了,因为我们已经面临这个问题一段时间了。如果你在Github上搜索,你会在那里找到一些项目,但是这些项目中的任何一个都可以解决问题,正如你所说的,维护两个文件根本不是一个好的选择。因此,我们找到的解决这个问题的方法是:

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

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


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

    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']
    将返回反翻译

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