了解如何为您的插件和主题创建字符串包,以帮助用户使用 WPML 轻松翻译内容。
字符串包是在特定上下文中“捆绑”在一起的字符串组。其目的是通过消除逐个翻译每个字符串的需要,帮助最终用户更高效地翻译内容。
例如,以下是用户在有无字符串包的情况下翻译自定义用户字段的方式:
没有字符串包的情况

用户需要逐个翻译字符串,没有自动翻译的选项。
有字符串包的情况

用户可以一次性一起翻译多个字符串,并提供自动翻译选项。
如您所见,字符串包允许用户一次翻译多个自定义用户字段,从而简化了翻译过程。为了向您的用户提供最佳的翻译体验,请按照以下步骤创建您自己的字符串包。
如果您想查看我们在以下步骤中介绍的完整字符串包实现,请查看包含我们使用的测试插件的此 GitHub 仓库。
1. 确定可翻译内容
第一步是确定用户想要翻译的内容,例如标题、标签和用户生成的内容。
2. 声明包类型
接下来,您需要声明您的包类型。此步骤有助于 WPML 检测哪些字符串包连接到活动的插件,并仅翻译这些包。
作为比较,此过滤器对字符串包的作用就像 register_post_types 过滤器对文章类型的作用一样。
要声明包类型,请使用 wpml_active_string_package_kinds 过滤器:
define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );
define( 'FOO_USER_FIELD_PACKAGE_KIND_SLUG', 'otgs-foo-user-fields' );
add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {
$kinds[ FOO_USER_FIELD_PACKAGE_KIND_SLUG ] = [
'title' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
'slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG,
'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
];
return $kinds;
} );
参数定义
title – 类型的标题,应与包的 kind 相同。plural – 标题的复数形式。slug – 类型的别名,应与包的 kind_slug 相同。
3. 创建包并注册字符串
接下来,您需要使用 wpml_register_string 钩子创建一个包并注册其将要分组的字符串:
$userId = 123;
$user = get_user_by( 'id', $userId );
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
'title' => $user->display_name, // The title for the package entity inside the "kind" namespace.
];
$fooUserFields = get_option( 'otgs_foo_user_fields' );
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );
}
参数定义
$kind – 实体的命名空间标签(例如,Gravity Form)。$kind_slug – 实体的命名空间别名(例如,gravity-form)。如果缺失,它将是“类型”的别名版本。$name – 类型内部实体的唯一标识符,可以是字符串(例如,别名)或整数(例如,ID)。$title – 类型内部实体的标题。建议使用真实实体的标题。
虽然不是必需的,但您还可以包含两个附加参数:$edit_link – 用于编辑对象的 URL。$view_link – 用于查看对象的 URL。
4. 检索翻译
最后,要在前端显示翻译,您需要使用 wpml_translate_string 钩子:
$userId = 123;
$user = get_user_by( 'id', $userId );
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
'title' => $user->display_name, // The title for the package entity inside the "kind" namespace.
];
$fooUserFields = get_option( 'otgs_foo_user_fields' );
$translatedFieldValues = [];
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
$translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );
}
更新和删除字符串
每当用户更新内容时,WPML 都需要能够识别新字符串以及已删除的字符串。要将这些更改通知 WPML,请使用两个函数包装您的注册代码:
$userId = 123;
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
// The 'title' key is not not required in the "translate" context.
];
do_action( 'wpml_start_string_package_registration', $package );
$fooUserFields = get_option( 'otgs_foo_user_fields' );
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );
}
do_action( 'wpml_delete_unused_package_strings',$package );
删除字符串包
当用户删除内容时,您还应该删除其关联的字符串包。这包括所有相关的字符串、翻译和翻译作业。通过进行此清理,您可以确保网站保持高效,而不会有任何残留数据使数据库混乱。
要删除字符串包,请挂钩到插件或主题中的适当操作,并调用 wpml_delete_package 函数:
$userId = 123; do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_TITLE );
其他资源
- WPML 语言配置文件 – 关于使用 wpml-config.xml 的指南,该文件指示 WPML 应在插件和主题中翻译哪些文本。
- Multilingual Tools – 用于测试您的配置设置并确认与 WPML 兼容性的工具。