国际化指南

在本文中,您将了解何时以及如何使用所有可用的i18n函数以及编写字符串的最佳实践。

本文中的建议适用于PHP和javascript代码。您可以在中查看每种语言的所有可用函数I18n函数第页。javascript可用的函数也将突出显示。

基本字符串

最常用的功能是__()。它返回其参数的翻译:

__(“博客选项”、“我的主题”);

另一个简单的例子是_e(),输出其参数的翻译。不要写:

echo __(“WordPress是最好的!”,“我的主题”);

您可以使用较短的:

_e(“WordPress是最好的!”,“我的主题”);
__()也可用于javascript

变量

如果您在字符串中使用变量,与下面的示例类似,则需要使用占位符。

echo“你的城市是$city。”

使用打印函数族。特别有用的是打印把格式数据写成串例如:

打印(/*翻译人员:%s:城市名称*/__('您的城市是%s,'我的主题'),$城市);

注意,用于翻译的字符串是模板“您所在的城市是%s。”,这在源代码和运行时都是相同的。

如果字符串中有多个占位符,建议使用参数交换。在这种情况下,单引号(')必须使用:双引号(")告诉php解释美元作为变量,这不是我们想要的。

打印(/*翻译:1:城市名称2:邮政编码*/__('您的城市是%1$s,邮政编码是%2$s','我的主题'),$城市,$邮政编码);

这里的邮政编码显示在城市名称之后。在某些语言中,以相反的顺序显示邮政编码和城市更合适。使用%秒如上面的示例所示,前缀允许这样做。翻译可以写在:

打印(/*翻译人员:1:邮政编码2:城市名称*/__('您的邮政编码是%2$s,您的城市是%1$s','我的主题'),$城市,$邮政编码);

把格式数据写成串也可用于javascript翻译:

const zipCodeMessage=冲刺(/*翻译人员:1:邮政编码2:城市名称*/__('您的邮政编码是%2$s,您的城市是%1$s','我的主题'),城市,邮政编码);

下面的示例告诉您不要做什么

这是不正确的。

//这是不正确的,不要使用。_e(“你的城市是$city。”,'my-theme');

用于翻译的字符串是从源代码中提取的,而不执行与其关联的PHP。例如:变量$城市可能是温哥华,所以你的字符串会显示“你的城市是温哥华”当模板运行时,gettext不会预先知道PHP变量中的内容。

由于在转换字符串时变量的值是未知的,因此需要翻译器知道变量的所有情况$国家这并不理想,最好删除动态内容,让翻译人员专注于静态内容。

复数

基本多元化

如果有一个字符串在项目数更改时发生更改。你有英语“一条评论”“两条评论”。在其他语言中,可以有多种复数形式。要在WordPress中处理此问题,可以使用_n()功能。

打印(_n个(“%s注释”,“%s评论”,获取注释编号(),“我的主题”),编号格式i18n(获取注释编号()));

_n()接受4个参数:

  • 单数–字符串的单数形式(注意,在某些语言中,它可以用于除一以外的数字,所以“%s项目”应使用,而不是'一个项目')
  • 复数–字符串的复数形式
  • count–对象的数量,这将决定返回的是单数形式还是复数形式(有些语言有两种以上的形式)
  • 文本域–主题的文本域

函数的返回值是与给定计数相对应的正确转换形式。

`_n()也可用于javascript

多元化稍后完成

首先用设置复数字符串_n_noop()(无)_nx_noop().

$comments_pullary=_n_noop(“%s注释”,“%s条评论。”);

在代码的后面,您可以使用translate_nooped_plural()以加载字符串。

打印(translate_nooped_plural($评论_复数,获取注释编号(),“我的主题”),编号格式i18n(获取注释编号()));

根据上下文消除歧义

有时,一个术语在多个上下文中使用,必须单独翻译为其他语言,即使英语中的每个上下文使用相同的单词。例如,单词岗位两者都可用作动词“单击此处发表评论”作为名词“编辑此帖子”在这种情况下_x()_除价()应该使用函数。它类似于__()_e(),但它还有一个额外的参数-上下文:

_x(“帖子”,“名词”,“我的主题”);_x('post','verb','my-theme');

在这两种情况下都使用此方法,我们将获得原始版本的字符串Comment。然而,翻译人员将看到两个用于翻译的注释字符串,每个字符串位于不同的上下文中。

以德语版WordPress为例:Post is Beiträge。德语中对应的动词形式是beitragen。

注意,类似于__(),_x()有一个回声版本:_ex()。前面的示例可以写成:

_ex(“帖子”、“名词”、“我的主题”);_ex('post','verb','my-theme');

使用您觉得更容易理解的代码。

_x()和_nx()也可用于javascript

描述

您可以在源代码中添加澄清注释,这样翻译人员就知道如何翻译这样的字符串__(“g:i:s a”).必须以单词开头翻译人员:,全部小写,并且是gettext调用之前的最后一个PHP注释。下面是一个示例:

/*转换器:草稿保存的日期格式,请参见http://php.net/date */$saved_date_format=__('g:i:s a');

多线示例:

/**翻译:替换为与您所在地区相关的城市。*测试它是否与预期位置匹配,并且是否即将*如果没有城市与您的*区域设置有事件,然后使用与您的区域设置相关的城市*这对大多数用户来说都是可以识别的。*/?><input placeholder=“<?php esc_attr_e('辛辛那提');?>”id=“location”type=“text”name=“location“/>

换行符

Gettext不喜欢第页(ASCII码:13),所以避免使用n个而不是。

空字符串

空字符串是为内部Gettext使用而保留的,您不能尝试国际化空字符串。它也没有任何意义,因为转换器没有上下文。

如果您有将空字符串国际化的有效用法,请将上下文添加到两个帮助翻译器中,并与Gettext系统保持一致。

转义字符串

逃逸所有字符串很好,可以防止转换器运行恶意代码。有一些转义函数与国际化函数集成。

<a title=“<?php esc_attr_e('跳转到内容','我的主题');?>”class=“屏幕阅读器文本跳过链接”href=“#content”><?php_e('跳到内容','我的主题');?></a>
<label for=“nav-menu”><?php esc_html_e('选择菜单:','我的主题');?></label>

写入字符串的最佳实践

以下是编写字符串的最佳实践

  • 使用得体的英语风格——尽量减少俚语和缩写。
  • 使用完整的句子——在大多数语言中,词序与英语不同。
  • 分段–合并相关句子,但不要在一个字符串中包含整页文本。
  • 不要在可翻译短语中留下前导或尾随空格。
  • 假设字符串在转换时长度可以加倍。
  • 避免不寻常的标记和不寻常的控制字符–不要包含环绕文本的标记。
  • 不要将不必要的HTML标记放入翻译后的字符串中。
  • 不要将URL留作翻译,除非它们可以有另一种语言的版本。
  • 将变量作为占位符添加到字符串中,因为在某些语言中占位符会更改位置。
打印(__('搜索结果:%s','我的主题'),获取搜索查询());
  • 使用格式字符串而不是字符串串联-翻译短语而不是单词-
打印(__('您的城市是%1$s,邮政编码是%2$s','我的主题'),$城市,$邮政编码);

总是比

__(“你的城市是”,“我的主题”)$城市__(',您的邮政编码是','我的主题')$邮政编码;
  • 尽量使用相同的单词和符号,以避免翻译多个类似的字符串(例如,不要做以下操作)
__('帖子:','我的主题');和__(“帖子”,“我的主题”);