我想保持我的网站多语言。出于这个原因,我有以下示例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']”。
但一般问题:这是多语言网站的好方法吗?或者我应该以不同的方式构建文件?
答案 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中使用它们,使用插件来管理翻译并取得了巨大的成功。