我正在做一个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];
}
}
最佳答案
看起来还不错。我已经看到这个被使用过很多次了。
但是,我会将每种语言的不同字符串分隔在一个文件中。至少,或者如果文件变得很大,每种语言每个模块一个文件。
然后,每次使用新语言时,您的翻译类都可以加载并缓存语言文件(如果您不依赖任何其他缓存系统)。
一个小例子来说明我的意思
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);
}
}
}
这将查找以具有此类条目的语言命名的 .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);
}
}
有时您希望翻译包含变量的字符串。我发现这种方法很简单,可以时不时地使用。
// Translate string "Fox=FOX %s %s"
$e = new Example();
// Translated string with substituted arguments
$s = printf($e->__('Fox'),'arg 1','arg 2');
为了进一步集成变量替换,可以将 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);
}
}
关于PHP简单翻译方法——你的看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1974505/