我在下面的PHP数组中打破任何“PHP良好实践”,处理3(人类)语言?

时间:2010-02-24 21:23:17

标签: php arrays multilingual

这是处理我能想到的多语言网站的最佳方式,现在(不确定)不涉及gettext,zend_translate或任何php插件或框架。

我认为它很直接:我有3种语言,我在不同的文件中写出“内容”(以数组的形式),之后,我把这些内容称为index.php,就像你可以欣赏的那样如下图:

alt text http://img31.imageshack.us/img31/1471/codew.png

我刚刚开始使用php,我想知道如果代码容易受到XSS攻击或者我编写的代码超出必要范围,我是否会破坏php良好实践。

编辑:我发布了一张图片,以便您可以看到文件树(我不是很懒)

EDIT2:我正在使用主题为ir_black和NERDTree的Vim。

6 个答案:

答案 0 :(得分:10)

对我来说没问题,虽然我个人更喜欢创建和使用字典助手功能:

<?php echo dictionary("showcase_li2"); ?>

可以让您以后轻松切换方法,并且通常可以更好地控制字典。同样使用数组,你会遇到范围问题 - 你必须使用global $language;非常烦人地将它导入每个函数。

当您必须将值插入国际化字符串时,您可能也会达到这一点:

You have %1 votes left in the next %2 hours.
Sie haben %1 stimmen übrig für die nächsten %2 stunden.
Sinulla on %1 ääntä jäljellä seuraavan %2 tunnin ajassa.

辅助函数对于以下内容非常有用:

<?php echo dictionary("xyz", $value1, $value2 ); ?> 

$value1$value2将插入字典字符串中的%1%2

使用func_get_args()可以使用无限数量的参数轻松构建这样的辅助函数。

答案 1 :(得分:2)

对我来说也很合适,但是

似乎您已经为多个模块/站点进行了本地化,那么为什么不将其分解为多维数组呢?

$localization = array(
  'module' => (object)array(
    'heading' => 'oh, no!',
    'perex'   => 'oh, yes!'
  )
);

我个人喜欢用

从数组中创建stdClass
$localization = (object)$localization;

所以你可以使用

$localization->module->heading;

:)我的2美分

答案 2 :(得分:2)

一般都没关系。例如,punBB的本地化就是这样做的。它非常快。比调用函数或对象的方法或属性更快。但我发现这种方法存在问题,因为它不容易支持语言回退。我的意思是,如果你没有中文字符串,请用英文显示。

当您升级系统并且没有时间翻译所有语言的所有内容时,此问题是热门话题。

我最好使用像

这样的东西

lang.en.php

$langs['en'] = array(
    ...
);

lang.cn.php

$langs['cn'] = array(
    ...
);

[prepend].php(一些常见的lib)

define('DEFAULT_LANG', 'en');
include_once('lang.' . DEFAULT_LANG '.php');
include_once('lang.' . $user->lang . '.php');
$lang = array_merge($langs[DEFAULT_LANG], $langs[$user->lang]);

答案 3 :(得分:0)

这可能是xss的唯一方法是,如果你有register_globals = On并且你没有设置$ lang ['showcase_lil']或其他$ lang's。但我认为你不必担心这一点。所以我认为你很清楚。

作为xss测试: http://127.0.0.1/whatever.php?lang[showcase_lil]=警报(/ XSS /)

答案 4 :(得分:0)

发布代码并简要向我们解释这个问题不是更好吗?

无论如何,将每种语言放在自己的文件中并通过某种语言组件加载它似乎没问题。我更喜欢使用某种gettext,但这也没关系,我想。

你应该创建一个函数来调用语言键而不是依赖于数组 <?php echo lang('yourKey'); ?>

答案 5 :(得分:0)

要注意的一件事是插值;如果您的服务器设置合理,这是XSS唯一可以潜入的地方。如果您在任何时候需要按照翻译“$ project-&gt; name has $ project-&gt; member_count members”的方式做一些事情,那么您必须确保转义那里的所有HTML。

但除此之外,你应该没事。