国际化-WordPress官方文档

国际化是开发主题的过程,因此可以轻松地将其翻译成其他语言。国际化通常缩写为i18n(因为字母i和n之间有18个字母)。

https://developer.wordpress.org/themes/functionality/internationalization/

什么是国际化?

什么是国际化?

国际化是开发主题的过程,因此可以轻松地将其翻译成其他语言。国际化通常缩写为i18n(因为字母i和n之间有18个字母)。

顶部↑

为什么国际化很重要?

为什么国际化很重要?

WordPress在英语不是主要语言的国家/地区使用。WordPress插件中的字符串需要以特殊方式编码,以便可以轻松地翻译成其他语言。作为开发人员,您可能无法为所有用户提供本地化; 但是,翻译人员可以成功地本地化主题,而无需修改源代码本身。

顶部↑

如何使您的主题国际化?

如何国际化你的主题?

为了使主题中的文本能够轻松翻译,文本不应该在主题中硬编码,而是通过WordPress中的一个本地化函数作为参数传递。

除非翻译器修改了效率不高的源代码,否则无法翻译以下示例。

1

<h1>Settings Page</h1>

通过将字符串传递给本地化函数,可以很容易地将其解析为翻译。

1

<h1><?php __( 'Settings Page' ); ?></h1>

WordPress使用  gettext库能够在PHP中添加翻译。在WordPress中,您应该使用WordPress本地化功能,而不是本机PHP gettext兼容的翻译功能。

文本域

文本域

文本域是国际化函数中使用的第二个参数。文本域是唯一标识符,允许WordPress区分所有加载的翻译。只需要为主题和插件定义文本域。

在WordPress.org上托管文本域的主题必须与主题URL(wordpress.org/themes/<slug>)的slug匹配。这是必需的,以便translate.wordpress.org的翻译  正常工作。

文本域名必须使用短划线而不是下划线并且为小写。例如,如果主题的名称My Theme 是在其中定义的,style.css 或者它包含在一个名为my-themetext domain 的文件夹中应该是my-theme

文本域用于三个不同的位置:

  1. style.css主题标题中
  2. 作为本地化功能的论据
  3. 使用load_theme_textdomain()或  加载翻译时的参数load_child_theme_textdomain()

style.css主题标题

style.css主题标题

文本域被添加到style.css标题中,以便即使未启用主题也可以翻译描述等主题元数据。文本域应与加载文本域时使用的文本域相同

例:

1

2

3

4

/*

* Theme Name: My Theme

* Author: Theme Author

* Text Domain: my-theme

*/

域路径

将翻译保存在除以外的目录中时,需要域路径languages 。这样,当主题未激活时,WordPress知道在哪里可以找到翻译。例如,如果.mo文件位于languages文件夹中,那么Domain Path将是/languages并且必须使用第一个斜杠编写。默认为languages主题中的文件夹。

例:

1

2

3

4

6

/*

* Theme Name: My Theme

* Author: Theme Author

* Text Domain: my-theme

* Domain Path: /languages

*/

顶部↑

将文本域添加到字符串

将文本域添加到字符串

应将文本域添加为所有本地化函数的参数,以使翻译正常工作。

示例

  • 1
  • __( 'Post' )
  • 应该成为
  • 1
  • __( 'Post', 'my-theme' )
  • 1
  • _e( 'Post' )
  • 应该成为
  • 1
  • _e( 'Post', 'my-theme' )
  • 1
  • _n( 'One post', '%s posts', $count )
  • 应该成为
  • 1
  • _n( 'One post', '%s posts', $count, 'my-theme' )

警告:

文本域应作为字符串传递给本地化函数而不是变量。它允许解析工具区分文本域。什么不该做的例子:

1

__( 'Translate me.' , $text_domain );

顶部↑

加载翻译

加载翻译

在WordPress中译本保存在.po.mo被加载它需要的文件。可以使用函数load_theme_textdomain()或加载它们load_child_theme_textdomain()。这{locale}.mo将从主题的基本目录或{text-domain}-{locale}.moWordPress主题语言文件夹中加载/wp-content/languages/themes/

注意:

从版本4.6开始,WordPress会自动检查语言目录中wp-content 是否有来自  translate.wordpress.org的翻译。这意味着通过translate.wordpress.org翻译的插件不再需要load_plugin_textdomain()了。

如果您不想添加load_plugin_textdomain()对插件的调用,则应将Requires at least:readme.txt中的字段设置为4.6。

要了解有关不同语言和国家/地区代码的详细信息,请参阅语言列表

小心

  • {locale}.mo如果将翻译添加到主题文件夹,则将MO文件命名为(例如de_DE.po和de_DE.mo)。
  • {text-domain}-{locale}.mo如果要将翻译添加到WordPress主题语言文件夹,请将MO文件命名为(例如my-theme-de_DE.po和my-theme-de_DE.mo)。

例:

1

2

3

4

function my_theme_load_theme_textdomain() {

load_theme_textdomain( 'my-theme', get_template_directory() . '/languages' );

}

add_action( 'after_setup_theme', 'my_theme_load_theme_textdomain' );

理想情况下,此功能应在主题中运行function.php

语言包

如果您对语言包以及translate.wordpress.org的导入工作感兴趣,请阅读有关翻译Meta手册页面

顶部↑

本地化功能

本地化功能

顶部↑

基本功能

基本功能

顶部↑

翻译和转义功能

翻译和转义功能

必须转义需要翻译并在html标记的属性中使用的字符串。

顶部↑

日期和数字功能

日期和数字功能

顶部↑

基本字符串

基本字符串

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

1

__( 'Blog Options', 'my-theme' );

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

1

echo __( 'WordPress is the best!', 'my-theme' );

你可以用更短的:

1

_e( 'WordPress is the best!', 'my-theme' );

顶部↑

变量

变量

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

1

echo 'Your city is $city.'

使用printf功能系列。特别有用的是printfsprintf。例如:

1

2

3

4

printf(

/* translators: %s: Name of a city */

__( 'Your city is %s.', 'my-theme' ),

$city

);

请注意,用于转换的字符串是模板"Your city is %s.",在源和运行时都是相同的。

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

1

2

3

4

6

printf(

/* translators: 1: Name of a city 2: ZIP code */

__( 'Your city is %1$s, and your zip code is %2$s.', 'my-theme' ),

$city,

$zipcode

);

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

1

2

3

4

6

printf(

/* translators: 1:ZIP code 2:Name of a city */

__( 'Your zip code is %2$s, and your city is %1$s.', 'my-theme' ),

$city,

$zipcode

);

以下示例告诉您不该做什么

警告:

这是不正确的。

1

2

// This is incorrect do not use.

_e( "Your city is $city.", 'my-theme' );

用于转换的字符串是从源中提取的,而不执行与之关联的PHP。例如:变量$city可能是温哥华,因此您的字符串将"Your city is Vancouver"在模板运行时读取,但gettext将不会提前知道PHP变量中的内容。

由于在翻译字符串时变量的值是未知的,因此需要翻译人员知道变量的每种情况$country。这并不理想,最好删除动态内容,并允许翻译人员专注于静态内容。

顶部↑

复数

复数

顶部↑

基本多元化

基本多元化

如果您的字符串在项目数更改时发生更改。用英语,你有"One comment""Two comments"。在其他语言中,您可以有多个复数形式。要在WordPress中处理此问题,您可以使用该_n()功能。

1

2

3

4

6

7

8

9

printf(

_n(

'%s comment',

'%s comments',

get_comments_number(),

'my-theme'

),

number_format_i18n( get_comments_number() )

);

_n() 接受4个参数:

  • 单数 – 字符串的单数形式(请注意,它可以用于某些语言中除一个以外的数字,因此'%s item'应该使用而不是'One item'
  • 复数 – 字符串的复数形式
  • count – 对象的数量,它将决定是否应该返回单数或复数形式(有语言,远远超过2种形式)
  • 文本域 – 主题的文本域

函数的返回值是正确的翻译形式,对应于给定的计数。

顶部↑

稍后完成多个化

稍后完成多个化

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

1

2

3

4

$comments_plural = _n_noop(

'%s comment.',

'%s comments.'

);

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

1

2

3

4

6

7

8

printf(

translate_nooped_plural(

$comments_plural,

get_comments_number(),

'my-theme'

),

number_format_i18n( get_comments_number() )

);

顶部↑

通过上下文消除歧义

按上下文消除歧义

有时,术语在多个上下文中使用,并且必须在其他语言中单独翻译,即使英语中的每个上下文使用相同的单词。例如,该单词Post既可以用作动词"Click here to post your comment",也可以用作名词"Edit this Post"。在这种情况下,应使用_x()_ex()功能。它类似于__()_e(),但它有一个额外的参数 – 上下文:

1

2

_x( 'Post', 'noun', 'my-theme' );

_x( 'post', 'verb', 'my-theme' );

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

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

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

1

2

_ex( 'Post', 'noun', 'my-theme' );

_ex( 'post', 'verb', 'my-theme' );

使用您认为增强易读性和易编码的那个。

顶部↑

描述

描述

您可以在源代码中添加澄清注释,以便翻译人员知道如何翻译字符串__( 'g:i:s a' )。它必须以单词开头,translators:并且是gettext调用之前的最后一个PHP注释。这是一个例子:

1

2

/* translators: draft saved date format, see http://php.net/date */

$saved_date_format = __( 'g:i:s a' );

顶部↑

换行符

换行符

Gettext不喜欢\r(ASCII代码:13)可翻译的字符串,所以请避免使用它\n

顶部↑

空字符串

空字符串

空字符串保留用于内部Gettext用法,您不能尝试国际化空字符串。它也没有任何意义,因为译者不会有上下文。

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

顶部↑

处理JavaScript文件

处理JavaScript文件

使用wp_localize_script()到翻译的字符串或其他服务器端数据添加到先前排队的脚本。

顶部↑

转义字符串

转义字符串

最好逃避所有字符串,防止翻译人员运行恶意代码。有一些与国际化功能集成的转义功能。

1

2

3

<a title="<?php esc_attr_e( 'Skip to content', 'my-theme' ); ?>" class="screen-reader-text skip-link" href="#content" >

  <?php _e( 'Skip to content', 'my-theme' ); ?>

</a>

1

2

3

<label for="nav-menu">

  <?php esc_html_e( 'Select Menu:', 'my-theme' ); ?>

</label>

顶部↑

编写字符串的最佳实践

编写字符串的最佳实践

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

  • 使用体面的英式风格 – 尽量减少俚语和缩写。
  • 使用整个句子 – 在大多数语言中,单词顺序与英语不同。
  • 在段落中拆分 – 合并相关的句子,但不要在一个字符串中包含整页文本。
  • 不要在可翻译的短语中留下前导或尾随空格。
  • 假设字符串在翻译时可以加倍。
  • 避免使用异常标记和异常控制字符 – 不要包含文本周围的标记。
  • 不要将不必要的HTML标记放入已翻译的字符串中。
  • 不要保留用于翻译的URL,除非他们可以使用其他语言版本。
  • 将变量作为占位符添加到字符串中,就像占位符更改位置的某些语言一样。

1

2

3

4

printf(

__( 'Search results for: %s', 'my-theme' ),

get_search_query()

);

  • 使用格式字符串而不是字符串连接 – 翻译短语而不是单词 –
  • 1
  • 2
  • 3
  • 4
  • printf(
  • __( 'Your city is %1$s, and your zip code is %2$s.', 'my-theme' ),
  • $city,
  • $zipcode
  • );
  • 永远比
  • 1
  • __( 'Your city is ', 'my-theme' ) . $city . __( ', and your zip code is ', 'my-theme' ) . $zipcode;
  • 尝试使用相同的单词和符号来防止翻译多个相似的字符串(例如,不要执行以下操作)
  • 1
  • __( 'Posts:', 'my-theme' ); and __( 'Posts', 'my-theme' );

 

顶部↑

资源

资源

0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论