San*_*dro 12 php translation internationalization
我正在做一个PHP网站,没有使用任何框架.我需要该网站有多种语言版本,我正在阅读它,它似乎有点令人困惑.有几种解决方案,但似乎都依赖于特定的框架.
您如何看待使用如下所示的简单翻译功能?
我的意思是,我想知道使用这些代码有什么不利之处.这是(这只是一个简单而不完整的样本):
class Translator{
private $translations;
public function __construct(){
$this->translations = array(
'Inbox' => array(
'en' => 'Inbox',
'fr' => 'the french word for this'
),
'Messages' => array(
'en' => 'Messages',
'fr' => 'the french word for this'
)
//And so on...
);
}
public function translate($word,$lang){
echo $this->translations[$word][$lang];
}
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*ist 17
它看起来并不坏.我已经看过很多次了.
但是,我会根据每种语言在一个文件中分隔不同的字符串.至少,或者如果文件变大,每种语言每个模块一个文件.
然后,每次使用新语言时,您的翻译类都可以加载和缓存语言文件(如果您不依赖任何其他缓存系统).
我的意思的一个小例子
class Translator {
private $lang = array();
private function findString($str,$lang) {
if (array_key_exists($str, $this->lang[$lang])) {
return $this->lang[$lang][$str];
}
return $str;
}
private function splitStrings($str) {
return explode('=',trim($str));
}
public function __($str,$lang) {
if (!array_key_exists($lang, $this->lang)) {
if (file_exists($lang.'.txt')) {
$strings = array_map(array($this,'splitStrings'),file($lang.'.txt'));
foreach ($strings as $k => $v) {
$this->lang[$lang][$v[0]] = $v[1];
}
return $this->findString($str, $lang);
}
else {
return $str;
}
}
else {
return $this->findString($str, $lang);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将查找以具有此类条目的语言命名的.txt文件
Foo = FOO
Bar = BAR
如果找不到任何翻译,它总是会回到原始字符串.
这是一个非常简单的例子.但是,如果您不需要更大的框架,我自己这样做是没有错的.
要以更简单的方式使用它,您始终可以执行此操作并创建名为"EN_Example.txt"的文件
class Example extends Translator {
private $lang = 'EN';
private $package = 'Example';
public function __($str) {
return parent::__($str, $this->lang . '_' . $this->package);
}
}
Run Code Online (Sandbox Code Playgroud)
有时您希望翻译包含变量的字符串.一种这样的方法是我觉得这很简单,可以不时使用.
// Translate string "Fox=FOX %s %s"
$e = new Example();
// Translated string with substituted arguments
$s = printf($e->__('Fox'),'arg 1','arg 2');
Run Code Online (Sandbox Code Playgroud)
为了进一步集成变量替换,printf功能可以放在__()这样的函数中
public function __() {
if (func_num_args() < 1) {
return false;
}
$args = func_get_args();
$str = array_shift($args);
if (count($args)) {
return vsprintf(parent::__($str, $this->lang . '_' . $this->package),$args);
}
else {
return parent::__($str, $this->lang . '_' . $this->package);
}
}
Run Code Online (Sandbox Code Playgroud)