PHP-在PHP项目中如何简易、高效的实现网站多语言

意见反馈 意见反馈 主题:991 回复:2082

PHP-在PHP项目中如何简易、高效的实现网站多语言

清晨说ぺ晚安 发布于 2017-01-19 字数 151 浏览 1081 回复 7

请大家谈谈在项目中如何实现多语化,要求对语言包维护方便、智能识别用户语种等,另外方法需简易,高效,便于管理,特别是面对语言种类较多(10种以上)。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(7

夜无邪 2017-10-02 7 楼

我喜欢使用数组的方式来实现...

有点: 我觉得很好修改,也能使用左右值的表结果将其存储到数据库中,然后实现个数据字典 管理
功能来 维护这种东西 加上缓存 应该能实现大部分的需要.

与 gettext 相比 可以做到 按需加载的目的,能多层次嵌套

<?php
/**

  • 国际化多语言组件

  • // 获取翻译 xser::translate('ui/admin/title')
    */
    class xser_languages {

    const g_conf_key = '__xser#i18n_multi_languages' ;
    protected $_dict_files ;

    public function __construct(){
    xser::replaceIni(g_conf_key,array());
    $this->_dict_files = array();
    }
    public function load($dict_name,$language='',$fdict_extname='.php'){
    $language = $this->get_language($language);
    $abs_fpath = "{$language}/{$dict_name}{$fdict_extname}" ;
    $fdict = xser::ini('application_dir') . "/language/{$abs_fpath}";
    // 预防重复加载
    if (in_array($abs_fpath,$this->_dict_files)) return ;
    if (file_exists($fdict) && is_readable($fdict)){
    $dict = include($fdict) ;
    if (!is_array($dict)) $dict = array();

          // 定义数据结构
          xser::changeIni(g_conf_key,array(
              $language =&gt; array(
                  $dict_name =&gt; $dict 
              )
          ));
    
          // 将已经加载的字典文件储存
          $this-&gt;_dict_files[] = $abs_fpath ; 
          return ;
      }
      throw new Exception("cannot read language dict file:{$abs_fpath}");

    }

    protected function get_language($language = ''){
    if (!xser::varify_provider()->not_null_string($language))
    $language = xser::ini('i18n_default_language') ;
    return strtolower($language) ;
    }

    // 只接受字符串格式的key,对于层次化的key,可以在 $key 中使用/符号来指定
    public function get($key, $language=''){
    if (!xser::varify_provider()->not_null_string($key))
    return null ;
    $language = $this->get_language($language);
    $_key = g_conf_key . "/{$language}/{$key}" ;
    $value = xser::ini($_key,'xser#null');
    if ($value === '
    xser#null')
    return htmlspecialchars("{{$key}}");
    return $value ;
    }
    }

language/utf8-zh/ui.php
<?php
/**

  • 中文版 国际化资源文件
    */

// xser::translate('ui/admin/title');
return array(
'admin' => array(
'title' => 'Time In China 后台管理系统' ,
'welmsg' => ' 您好,感谢登陆使用!',
'logout' => '您已经成功退出了登录。',

    'invalid' =&gt; array(
        'imgcode' =&gt; '您输入的验证码无效,或者验证码已经过期。请重新登录。',
        'username' =&gt; '您输入的用户名不存在,请检查后重新登录。',
        'password' =&gt; '您输入的密码不正确,请检查后重新登录。',
    )   
) ,  
'site' =&gt; 'http://www.timeinchina.com' ,
'version' =&gt; 'Copyright &copy; 2009-2011 www.timeinchina.com' ,
'username' =&gt; '管理员:',

'password' => '密码:',
'imgcode' => '验证码:',
'submit' => ' 登 陆 ',
'cancel' => ' 取 消 ',

'languages' => '界面语言:',
);

可参见我博客

瑾兮 2017-09-30 6 楼

我在我的项目中是这样子做的:
1、建立多个语言包,放于language文件夹;
比如:
language/zh_cn.php
language/zh_hk.php
language/en.php

2、网站中访问的地址为:
http://domain.com/zh_cn/
http://domain.com/zh_hk/
http://domain.com/en/
用urlrewrite把这些访问地址解析成为
http://domain.com/index.php?lang=zh_cn
http://domain.com/index.php?lang=zh_hk
http://domain.com/index.php?lang=en

3、在index.php引入:require('language/'.$lang.'.php');
即可以引入相应的语言包。
当然这个 $lang 需要过滤下,因为安全问题。

泛泛之交 2017-09-10 5 楼

php中最常见的就是gettext了,效率高(二进制mo,有缓存),语言包易于管理(poedit工具)。如果需要根据用户浏览器语言动态判断输出的语言的话,需要根据浏览器传递的值来判断下语言包的选择:$_SERVER['HTTP_ACCEPT_LANGUAGE']

但是使用中有一点需要注意,运行过程中更新了语言包的话,需要重启web服务,否则会随机出现未翻译的内容,似乎是缓存造成的。
之前发现wordpress更新语言包后不需要重启web即时生效,查看了下它的源代码,发现他是用php直接解析的mo二进制串,这种方法效率应该不如gettext扩展。

归属感 2017-08-22 4 楼

如果是我做话我的思路大概是这样的,先分析一下问题,要求多语言可能就是页面的功能导航与提示等实现多语言,如果说是内容也多语言那只能是在数据库存多份内容了,如果只是导航与提示多语言的话可以把这些内容写成配置文件,程序里用变量代替,至于判断用户的语言环境可以根据http请求头$_SERVER['HTTP_ACCEPT_LANGUAGE']判断,或是ip就进地区判断,也可以让用记自行选择记cookie,是注册用户的话可以按用户注册时候选择的语言进行显示。

偏爱自由 2017-07-19 3 楼

用zend的translate组件, 把翻译的原文和译文放在数据库里。自己写个方法生成CSV,PHP有现成的函数。然后用zend_translate读取CSV文件

夜无邪 2017-07-09 2 楼

判断方面愚见
优先级如下
1 已经登录用户所设置语种
2 用js 判断浏览器语种
3 客户端IPwhois记录。

请补充!

甜柠檬 2017-03-03 1 楼

说下我们项目现在使用的基本流程。

1.创建各个语种语言包,放在i18n目录下:
i18n/en.inc.php
i18n/fr.inc.php
i18n/zh.inc.php
i18n/tw.inc.php

2.创建个配置文件config.inc.php,对这些语言包的管理。
$language = array(
'en' => 'en.inc.php', // English (en)
'en-gb' => 'en.inc.php', // English (en)
'fr' => 'fr.inc.php', // French (fr)
);

3.对获取语种的优先级:
用户选择(会写cookie)> cookie > $_SERVER['HTTP_ACCEPT_LANGUAGE'] > 默认语种

4.根据获取到的语种在config.inc.php查找到对应的语言包。