实现多语言PHP的最佳方法

时间:2011-09-26 18:07:12

标签: php

首先,我知道有很多关于多语言功能的答案,我找不到我想要的答案。

我想到了三种可以使用的方法。每次我向Web表单界面添加新值时,我都需要使用PHP创建语言文件。

前两个类似 - 在特定语言文件中使用数组或定义,并在运行开始时包含它。 但在这种情况下,我可能会加载数千个定义或数组,只是为了在每个页面中使用一些。

第三种方法是创建每次使用关键字或完整短语调用的函数,并使用IF - s或switch选择正确的术语(或者如果没有则返回调用的键匹配)。

最好的方法是什么? 我决定做一些测试。我尝试了三种不同的方法,并测量了它的时间和记忆:

  1. 我定义了一个数组(22个值),并从1到1,000,000运行它 - 检查调用值 - 使用%运算符选择要使用的内容并将其设置为三个中的一个在变量上

    • 时间:0.476591110229秒
    • 内存:6536字节
  2. 我使用了相同的数组(22个值)并使用函数调用它 - return $arr[$string];(只是为了方便工作,并且如果我需要,可以将其更改为不同的方式)

    • 时间:0.960635185242秒
    • 内存:6704字节
  3. 我创建了一个包含字符串列表的函数并使用switch - > case我选择了返回的字符串

    • 时间:1.46953487396秒
    • 内存:848字节
  4. 嗯,现在问题是什么是正确的选择 - 更喜欢时间或更喜欢记忆。

    如果网站很大并且需要大量内存 - 我无法更改它,因为它是使用数组构建的 - 如果它与函数一起工作,我可以随时更改它。

3 个答案:

答案 0 :(得分:7)

就代码而言,这样的事情对你来说很棒。它必须基于用户的选择(从按钮或菜单中选择语言)或基于浏览语言(它不是最好的aprouch)。

<强>的index.php

<?php

// verify the user's choice
if ($_POST[lang] == "en") 
{
    include_once("en_language.php");
}

if ($_POST[lang] == "pt") 
{
    include_once("pt_language.php");
}

// calling a lable in your page
echo LABEL_MENU;


// the rest of your file
...
?>

<强> en_language.php

<?php
// ENGISH Language file
define('LABEL_MENU','Main Menu');

// the whole file with the labels of your system

?>

<强> pt_language.php

<?php
// PORTUGUESE Language file
define('LABEL_MENU','Menu Principal');

// the whole file with the labels of your system

?>

<强>互补

如果你希望使用数组类型而不是使用define()的常量值,但我不确定什么比...更快

$arrays = array("MAIN_MENU" => "Main Menu", "LEFT_MENU" => "Left Menu"); 
echo $arrays["MAIN_MENU"];

答案 1 :(得分:2)

将您的字符串分组 - 一个全局和另一个 - 对应于您在网站中的视图(例如lang_global,lang_profile,lang_something_else) 包括全局文件和当前视图对应的文件。这样您就不会加载整个翻译,而只加载它的一部分。它更易于管理,你可以提供上下文,在同一个字符串上有不同的翻译。

答案 2 :(得分:0)

这里有一些有用的答案,但是如果您使用symfony/translation作为依赖项管理器,我也建议使用composer

lang / messages.fr.yaml:

Hello, %name%!: Bonjour, %name%!
Goodbye: Goodbye!

lang / messages.en.yaml:

Hello, %name%!: Hello, %name%!

file.php:

<?php
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\Translator\Loader\YamlFileLoader;

require_once __DIR__ . '/vendor/autoload.php';

$translator = new Translator();

$translator->addLoader('yaml', new YamlFileLoader());
$translator->addResource('yaml', __DIR__ . 'lang/messages.en.yaml', 'en');
$translator->addResource('yaml', __DIR__ . 'lang/messages.fr.yaml', 'fr');

$translator->setFallbackLocales(array('en'));

$translator->setLocale('en');

echo $translator->translate('Hello, %name%!', ['name' => 'saif']); // Hello, saif!

$translator->setLocale('fr');

echo $translator->translate('Hello, %name%!', ['name' => 'saif']); // Bonjour, saif!
// Goodbye isn't set in the "fr" file, translator uses the fallback locale instead
echo $translator->translate('Goodbye'); // Goodbye !

详细了解如何使用symfony转换器组件here