实现多语言PHP的最佳方式


The best way to implement multi-language PHP

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

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

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

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

最好的方法是什么?我决定做些检查。我尝试了三种不同的方法,并测量了时间和内存占用:

  1. 我定义了一个数组(22个值),并从1到1,000,000运行它-通过使用%操作符来选择要使用的内容并将其设置在变量

    上,检查调用值- 3中的1。
    • 耗时:0.476591110229秒
    • 内存:6536字节
  2. 我使用相同的数组(22个值),并使用函数调用它- return $arr[$string];(只是为了方便的工作方式和改变它的能力,以不同的方式,如果我需要)

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

    • 用时:1.46953487396秒
    • 内存:848字节

那么,现在的问题是,更喜欢时间还是更喜欢记忆,哪个是正确的选择。

如果网站很大,它会占用很多内存-我不能改变它,因为它是用数组构建的-如果它与函数一起工作,我可以随时改变它。

就代码而言,这样的东西对您来说将是非常好的。它必须基于用户的选择(从按钮或菜单中选择语言)或基于浏览语言(这不是最好的方法)。

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"];

根据您在网站上的视图(例如lang_global, lang_profile, lang_something_else)将您的字符串分组,一个是全局的,另一个是全局的。包括全局文件和与当前视图对应的文件。通过这种方式,您不会加载整个翻译,而只是其中的一个子集。它更易于管理,你可以提供上下文,在同一个字符串上有不同的翻译。

这里有一些有用的答案,但如果您使用composer作为依赖管理器,我也会推荐symfony/translation。

朗/messages.fr.yaml:

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

朗/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 translator组件的信息。