PHP简单翻译方法——你的看法

标签 php internationalization translation

我正在做一个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/

相关文章:

php - 提交表格给自己

PHP 父子类数据库操作

javascript - 用于 Javascript/JQuery 文件的 NodeJS i18n

web-applications - 有人知道开源协作翻译应用程序吗?

php - 由于 GDPR,阻止所有欧盟访客

php - 如果记录存在则删除,否则退出 MySQL

ruby-on-rails - 同时使用yaml和数据库来存储翻译

php - 索引您网站的蜘蛛(谷歌机器人...)是否有 "culture"?

locale - 什么叫像 "en-US"这样的语言国家前缀?

symfony - 如何从Symfony2/Silex项目生成翻译文件(.po,.xliff,.yml等)?