本地化:Php 和 Javascript

Localization: Php and Javascript

本文关键字:Javascript Php 本地化      更新时间:2023-09-26

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

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

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

  • 对 php 字符串使用 php 本地化类
  • 使用 JavaScript 本地化库进行 JavaScript
  • 将语言存储在两端都可以读取的cookie中。

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

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

对此有什么想法吗?

你总是可以让你的Javascript文件是每个请求的PHP生成的,这意味着你仍然可以对两者使用PHP本地化库。

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

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

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

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

    /**
     * i18n for JS
     */
    var i18n = (function() {
      return {
        stringOne: "{{trans('yourStringOneKeyFromPhp')}}",
        stringTwo: "{{trans('yourStringTwoKeyFromPhp')}}"
      }
    }());
    
  2. 另一方面,更好的解决方案是正如 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']将返回 de 翻译。

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