代码之家  ›  专栏  ›  技术社区  ›  Ken Ray

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

  •  3
  • Ken Ray  · 技术社区  · 5 年前

    这是处理多语言网站的最理想方法,我现在(不确定)认为它不涉及gettext、zend_translate或任何PHP插件或框架。

    我认为这是非常直接的:我有3种语言,我把它们的“内容”写在不同的文件中(以数组的形式),然后,我把这些内容称为 index.php 如下图所示:

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

    我刚开始使用PHP,我想知道我是否在破坏PHP的良好实践,代码是否容易受到XSS攻击,或者我是否在编写比需要更多的代码。

    编辑:我贴了一张图片,这样你可以看到文件树(我不是懒惰的)

    伊迪丝2:我用的是Vim,主题是Ir ou Black and Nerdtree。

    6 回复  |  直到 14 年前
        1
  •  10
  •   Pekka 웃    14 年前

    虽然我个人更喜欢创建和使用字典助手函数,但我觉得没问题:

    <?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() .

        2
  •  2
  •   codeholic    14 年前

    一般都可以。例如, 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
  •  2
  •   Adam Kiss    14 年前

    我也觉得不错, 但是 :

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

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

    我个人喜欢创造 stdClass 数组之外

    $localization = (object)$localization;
    

    所以你可以用

    $localization->module->heading;
    

    :)我的2美分

        4
  •  0
  •   rook    14 年前

    唯一可能是XSS的方法是,如果您启用了register_globals=on,并且没有设置$lang['showcase_lil']或其他$lang,但是我认为您不必担心这个问题。所以我认为你是清白的。

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

    你不必为此担心。所以我认为你是清白的。

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

        5
  •  0
  •   K4emic    14 年前

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

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

    您应该创建一个调用语言键的函数,而不是依赖数组,比如 <?php echo lang('yourKey'); ?>

        6
  •  0
  •   Matchu    14 年前

    要注意的一件事是插值;如果您的服务器设置合理,这实际上是XSS可以潜入的唯一地方。如果您在任何时候需要按照翻译“$project->name有$project->成员计数成员”这一行来做一些事情,则必须确保转义了其中的所有HTML。

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