多语言网站的最佳实践

时间:2014-06-01 21:27:33

标签: php lang

我想以多种语言提供我的网站。

这两种做法的女巫会是最好的吗?

练习1:

  • 为每个lang创建一个php文件(fr.php,en.php)。
  • 在每种语言文件中,请参考:$TEXT01 = 'Hello'; $TEXT02 = 'Goodbye';
  • 在页面中调用var,如下所示:<?php echo $TEXT01; ?> Marie
  • 我是否需要创建ini文件(https://stackoverflow.com/a/8636984/3678005)?

练习2:

  • 只创建一个大函数translator,其中包含我需要翻译的每个文本的数组。
  • 在页面中调用此函数,如下所示:<?php echo translator('Hello', 'en'); ?> Marie

我的问题:

  • Witch解决方案在资源方面将是最快的?
  • 女巫解决方案最安全吗?
  • 如果我的两个解决方案不是最佳解决方案,您还有其他解决方案。

感谢。

2 个答案:

答案 0 :(得分:1)

一种快速的方法是使用内存数据库

也许首先构建您的数据文件,例如:


<强> en_US.csv

hello_customer;Hello dear customer;
special_price;Special Price;

<强> fr_FR.csv

hello_customer;Bonjour cher client;
special_price;Prix spécial;

...

然后安装并配置redis(内存数据库中的键/值)。

获取扩展名(例如php:https://code.google.com/p/phpredis/

现在构建一个脚本来填充redis数据库。也许是这些方面的东西:

<?php
$csv_path = 'path/to/csv/files';

function redis_import($f_name){
    $handle = @fopen($f_name, "r");
    $redis = new Redis();

    $lang = explode('.', basename($f_name))[0];

    if ($handle) {
        $redis->connect('127.0.0.1', 6379);

        while (($buffer = fgets($handle, 4096)) !== false) {
            list($key, $value) = explode(';', trim($buffer));
            $redis->set($lang.'.'.$key, $val);
        }
        if (!feof($handle)) {
            echo "Erreur: fgets() a échoué\n";
        }
        fclose($handle);
    }

}

if ($handle = opendir($csv_path)) {
    while (false !== ($entry = readdir($handle))) {
        if (!is_dir($entry)) {
            redis_import($csv_path.PATH_SEPARATOR.$entry);
        }
    }
    closedir($handle);
}

因此,每当修改csv文件时,请启动此脚本以填充数据库。

然后,您需要在脚本中使用一个函数来获取语言数据。

您可以使用会话来存储用户语言。假设你使用$_SESSION['user.lang']这样做,你可以制作这样的东西:

function __translate($key){
    $redis = new Redis();
    $redis->connect('127.0.0.1', 6379);
    $translation =  $redis->get($_SESSION['user.lang'] . $key);
    $redis->close();
    return $translation;
}

这个解决方案非常快,只有内存访问,并且仍然使用csv文件,真正的数据库是安全的,并且易于人工访问。

答案 1 :(得分:-1)

查看像Smarty这样的模板引擎,他们提供包含缓存的功能: http://www.smarty.net/