PHP之setlocale|bindtextdomain|textdomain|gettext

string setlocale ( int $category , string $locale [, string $... ] )

设置本地地区信息(地区信息是针对一个地理区域的语言、货币、时间以及其他信息。)

$category可用的常量(这些常量都是php内置,结果都是int型):

LC_ALL - 包括下面的所有选项
LC_COLLATE -排序次序
LC_CTYPE - 字符类别及转换(例如所有字符大写或小写)
LC_MESSAGES - 系统消息格式
LC_MONETARY - 货币格式	可配合money_format使用
LC_NUMERIC - 数字格式
LC_TIME - 日期/时间格式	可配合strftime、gmstrftime使用

可以通过 setlocale(LC_ALL,NULL) 把地区信息设置为系统默认。

多语言常用写法,需用到gettext扩展:

//设置语言为中文
$language = 'zh_CN';
putenv("LANG=$language");
setlocale(LC_ALL, $language);

$domain = 'lang';
//指定翻译表位置
bindtextdomain($domain, './locale');
//选择域
textdomain($domain);
//此刻便在./locale/zh_CN/LC_MESSAGES/lang.mo寻找翻译
bind_textdomain_codeset($domain, 'utf-8');
//显示翻译后的信息
return gettext('Hello');
//gettext的别名_
return _('Hello');
//生成.mo文件参考:http://www.php.net/manual/en/book.gettext.php

顺便记录一下,ecstore我偷懒做的多语言:

// /app/site/lib/controller.php
if ($_COOKIE['SITE_LANG'] == 'us' && !strpos($_SERVER['REQUEST_URI'], 'shopadmin')) {
    $html = preg_replace_callback('/[\x{4e00}-\x{9fa5}]+\s*?[\x{4e00}-\x{9fa5}]+/u', function($matchesAll){
        $languages = include $this->app->lang_dir.'/en_US/config.php';
        $languagesCus = include app::get('b2c')->lang_dir.'/languages.php';
        $languages = array_merge($languages['language'], $languagesCus);
        return $languages[$matchesAll[0]]?:$matchesAll[0];
    }, $html);
}

评论

评论正在提交中...请稍后
评论提交成功...