要在WordPress中翻译字符串,就像在大多数使用PHP的CMS中一样,您必须将字符串包装在GetText翻译函数中(即\\\\()、\\u e()、\\u n()、\\u x()。。。等等)。
字符串还必须包含在PO文件中(GetText Portable Object files,PHP中多语言网站的行业标准-https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html). 此文件包含多对字符串,其中一个是原始语言中的字符串,另一个是目标语言中的翻译。
为了为我们需要翻译插件或主题的每种语言(即西班牙语的my-text-domain-es\\u es.PO、法语的my-text-domain-fr\\u fr.PO……等)构建这些PO文件,翻译人员将使用一个POT文件(PO模板),该文件包含所有要翻译的原始语言字符串,并将为每种语言添加一个翻译字符串。PO文件被编译为二进制MO文件,处理速度更快。
在运行时,要翻译的字符串通过MO文件获取并替换为其翻译。
POT文件通常使用特殊工具生成,这些工具解析源代码文件并提取可翻译字符串。
如果我们编写这样的代码:
$translated_text = __( $text, \'my_text_domain\');
当代码由专用工具解析时,要翻译的字符串(文本)的值尚未定义,因此代码中不存在。因此,自动搜索工具不会在POT文件中包含此字符串,因此不会包含在PO或MO文件中。
在运行时,当字符串$text的值可能已经定义时,翻译文件中的该值将没有对应关系,因此无法进行翻译。
然而,如果该变量的一组可能值是有限的,并且我们知道它们,那么我们有两种选择来克服这个问题:
Option 1: 手动编辑POT文件以添加可能值为$text的条目。此选项简单且易于实现。任何代码编辑器和POT格式的最低知识就足够了。但它有一个缺点。每次我们在修改代码后使用自动搜索工具更新翻译时,我们所做的修改都会丢失,我们必须再次手动包含它们。
Option 2: 在我们的代码中包含翻译函数包装的$text的所有可能值。让我们看一个例子。假设$text可以取值:苹果、橙色、香蕉、桃子和梨。我们需要编写以下代码:
// this variable is used only to include as parameters in
// translation functions all the possible values of $text
$locale = __(\'apple\', \'my_text_domain\') .
__(\'orange\', \'my_text_domain\') .
__(\'banana\', \'my_text_domain\') .
__(\'peach\', \'my_text_domain\') .
__(\'pear\', \'my_text_domain\');
$translated_text = __( $text, \'my_text_domain\');
这个选项也很容易实现,并且具有这样的优势:当我们使用自动搜索工具更新翻译时,它不会丢失。
如果我们在主题或插件中有几个要翻译的变量,并且这些变量的已知可能值有限,那么我们可以将它们全部包含在一个单独的文件中,该文件必须位于主题或插件的根文件夹或子文件夹(即“includes”或“assets”文件夹)中,如下所示:
<?php
//values of the variables to be translated
$locale_var1 = __(\'text-of-var1_val1\', \'my_text_domain\') .
__(\'text-of-var1_val2\', \'my_text_domain\') .
__(\'text-of-var1_val3\', \'my_text_domain\') .
.......
__(\'text-of-var1_valn\', \'my_text_domain\');
$locale_var2 = __(\'text-of-var2_val1\', \'my_text_domain\') .
__(\'text-of-var2_val2\', \'my_text_domain\') .
.......
__(\'text-of-var2_valn\', \'my_text_domain\');
.............
$locale_varn = __(\'text-of-varn_val1\', \'my_text_domain\') .
__(\'text-of-varn_val2\', \'my_text_domain\') .
.......
__(\'text-of-varn_valn\', \'my_text_domain\');
这是一种干净且可维护的方法,它将这些字符串的定义保存在一个单独的文件中,可以在不影响其他代码文件的情况下进行修改。