PHP简单的翻译方法 - 您的意见

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)