用php读json

时间:2013-10-17 19:46:20

标签: php arrays json multilingual

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

fruits.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']”。

但一般问题:这是多语言网站的好方法吗?或者我应该以不同的方式构建文件?

5 个答案:

答案 0 :(得分:1)

在我看来,你处于半好的状态。可以将i18n存储在类似json的文件中。但我认为如果为每种语言提供单独的文件会更好。所以你有一个单独的英文和德语json翻译文件。因此你有:

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

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

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

i18n/
    en.json
    de.json

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

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

可以从View层(MVC)直接访问此函数。

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

答案 1 :(得分: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']进行访问。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

JSON实际上不是一种人类可读的格式。

如前所述,我还建议为每种语言使用单独的文件,更多,我建议您使用lang单独的文件夹并使用theme / plugin / library / feature的文件(但您的应用程序是插件大小的)

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

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

答案 4 :(得分:0)

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

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