首先,我知道有很多关于多语言功能的答案,我没有找到我想要的答案。
我想到了三种我可以使用的方法。我需要使用PHP创建语言文件,每次我添加一个新的值到一个web表单界面。
前两个有点类似——在特定的语言文件中使用数组或定义,并在运行开始时包含它。但在这种情况下,我可能会加载数千个定义或数组,每个页面只使用几个。
第三种方法是创建每次使用关键字或完整短语调用的函数,并使用IF
-s或switch
选择正确的术语(如果没有匹配,则返回调用的键)。
最好的方法是什么?我决定做些检查。我尝试了三种不同的方法,并测量了时间和内存占用:
-
我定义了一个数组(22个值),并从1到1,000,000运行它-通过使用
上,检查调用值- 3中的1。%
操作符来选择要使用的内容并将其设置在变量- 耗时:0.476591110229秒
- 内存:6536字节
-
我使用相同的数组(22个值),并使用函数调用它-
return $arr[$string];
(只是为了方便的工作方式和改变它的能力,以不同的方式,如果我需要)- 用时:0.960635185242秒
- 内存:6704字节
-
我创建了一个带有字符串列表的函数,并使用
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组件的信息。