0

我想保持我的网站多语言。出于这个原因,我有以下用于标签等的示例 json 文件:

水果.json:

{
    "apple" : {
        "en" : "apple",
        "de" : "apfel"
    },
    "banana" : {
        "en" : "banana",
        "de" : "banane"
    },
    "cherry" : {
        "en" : "cherry",
        "de" : "kirsche"
    }
}

页面控制器从中创建一个数组:

PHP:

$lang = json_decode(file_get_contents("fruits.json"), true);

目前,我使用以下代码在页面视图中访问所需的标签:

$lang['apple']['de'];

有没有更简单的方法来实现最终结果?从页面视图中删除语言索引会很好,所以最后一个代码看起来像“$lang['apple']”。

但普遍的问题是:这对于多语言网站来说是一个好方法吗?或者我应该以不同的方式构建文件?

4

5 回答 5

1

在我看来,你的方法是一半好。可以将 i18n 存储在类似 json 的文件中。但我认为最好为每种语言提供单独的文件。因此,您将有一个单独的文件用于英语和德语 json 翻译。因此,您将拥有:

{
    "apple" : "apfel",
    "banana" : "banane",
    "cherry" : "kirsche"
}

对于德语。如果您有多种语言,则维护此类文件会更容易,因为您不会编辑 1 个巨大的文件。您改为添加一个文件。

你可以有一个 i18n 目录来存储 i18n 文件:

i18n/
    en.json
    de.json

您将创建一个类来读取所有带有 .json 扩展名的文件,并提供一个带有 2 个参数的 i18n 函数:

fun translate(lang, key)
{
    // access your i18n data here
}

此功能将直接从视图层 (MVC) 访问。

另一种方法是将 i18n 存储在数据库中,如果您希望它可以轻松编辑。这取决于您的业务需求。

于 2013-10-17T19:48:04.797 回答
1
{
  "de" : {
    "apple" : "apfel",
    "banana" : "banane",
    "cherry" : kirsche
  }
}

我认为使用语言作为顶级维度可以解决它。然后,一旦您解码了 json 文件,您只需要获取该语言的数组,它就会包含您需要的所有内容。

$lang_all = json_decode(file_get_contents("fruits.json"), true);
$lang=$lang_all['de'];

然后你可以使用 $lang['apple'] 访问。

于 2013-10-17T19:50:33.347 回答
1

最好跳过 json,因为键可能会改变。简单地将数组保存在主语言中,并将所有其他语言映射到它更有意义。这可以简单地作为一个主语言文件来完成,每行都有一个消息/单词,然后翻译成每种语言的文件,直接映射到行号。这种方式也更容易管理。要进行翻译,只需复制主文件,并将单词逐行更改为新语言,这可以由非程序员的翻译人员完成,并且可能不熟悉 JSON 等......

我见过的最好的方法是使用pot(面向人的模板)生成po(面向人的)文件,然后将其编译为mo文件(面向机器)以获得更好的性能。有许多基于 Web 和桌面的工具可用于处理 pot/po/mo 文件。我已经在 wordpress 中使用它们,使用插件来管理翻译并取得了巨大成功。

于 2013-10-17T20:00:04.280 回答
0

将 JSON 读入 后$lang,可以创建一个包含当前语言的新数组:

$words = array_map(function($word) use ($curlang) { return $word[$curlang]; }, $lang);

然后就可以访问了$words['apple']

于 2013-10-17T19:51:54.403 回答
0

JSON 并不是真正的人类可读格式。

如前所述,我还建议为每种语言使用单独的文件,此外,我建议您按语言使用单独的文件夹并按主题/插件/库/功能使用文件(但您的应用程序是插件大小的)。

许多框架可以帮助您使用良好的架构和一些工具(已经编码)。

您还可以查看 PO/MO 文件、i18n 和 gettext()。

于 2013-10-17T19:56:52.487 回答