如果您正在了解如何注册主题和插件硬编码文本以便翻译,请参阅主题和插件本地化文章。 另一方面,如果您想了解如何注册主题或插件选项以便翻译,您将使用语言配置文件



下面这篇文章针对的是由主题和插件存储在数据库中的所有其他用户输入的文本。注意:如果您的主题或插件正在创建适合按组翻译的内容(例如以表格形式),请查看字符串包翻译



让我们以一个示例开始。



您已创建了一个包含标题输入字段和一些其他选项的自定义小部件。 您可以使用『apply_filters』注册用于翻译的小部件标题,但您还想注册您可以在所有其他选项字段中保存的输入文本。



如果所有的文本被硬编码到插件/小部件中,可以使用gettext(插件的.mo文件)对它们进行本地化。 但是,您如何处理用户输入的文本?

WPML 中的字符串翻译


WPML包括字符串翻译模块,该模块可翻译该类文本。 默认情况下,它帮助用户翻译博客的标题、标签行、文本小工具和 WordPress 生成的其他文本。 其他插件和主题也可以使用该机制来为它们需要显示的文本提供翻译。

1. 注册需要翻译的字符串


当用户创建新字符串或更新已有字符串时,需要将这些字符串注册到 WPML 的字符串表中。 要进行此调用:

icl_register_string ( string $context, string $name, string $value );



  • $context


    • (字符串)(必需)插件的名称,为人类可读格式



  • $name


    • (字符串)(必需)字符串名称,有助于译者理解要翻译的内容。



  • $value


    • (字符串)(必需)需要被翻译的字符串。




在我们自定义的小部件示例中,保存或更新小部件选项时,我们需要调用『icl_register_string()』。这是在我们的自定义小部件『update』函数内完成的。



这是其类似示例之一。 我们自定义的小部件有一个标题、一个单行输入字段和一个文本区域。

function update($new_instance, $old_instance){

$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['custom_input'] = strip_tags($new_instance['custom_input']);
$instance['custom_textarea'] = $new_instance['custom_textarea'];

//WMPL
/**
* register strings for translation
*/
if (function_exists ( 'icl_register_string' )){
icl_register_string('Widgets', 'Custom Widget - input field', $instance['custom_input']);
icl_register_string('Widgets', 'Custom Widget - textarea field', $instance['custom_textarea']);
}
//WMPL


return $instance;
}


这告诉WPML需要翻译输入字段和文本区域的用户输入文本。 分别使用“Custom Widget – input field(自定义小部件 – 输入字段)”和“Custom Widget – textarea field(自定义小部件 – 文本区域字段)”名称在“Widgets(小部件)”字符串上下文中注册它们。



要知道的有用信息:如果插件不再需要翻译特定文本(例如,如果用户删除了插件),可以使用该调用从翻译表中删除该字符串:

icl_unregister_string ( string $context, string $name );


2. 在显示时使用译文


在前端显示自定义小部件时,需要获取翻译并使用它们。 为此,它会使用icl_translate函数:

icl_translate ( string $context, string $name, string $value );


WPML查找匹配$context$name的字符串。如果找到了符合条件的字符串,它将查找当前语言(显示该网站的语言)的翻译。如果存在翻译,它会将其返回。否则,它将返回原始字符串。



$value参数提供给『icl_translate()』调用,那样如果创建字符串时WPML未激活,则不会进行注册,仍返回正常的字符串值。



再次,在我们自定义小部件示例中,我们需要在输出函数中调用『icl_translate()』



这是其类似示例之一。 需要注意的是小部件标题经过」apply_filters」

function widget($args, $instance){

        extract($args);
        $title               = apply_filters('widget_title', $instance['title'] );
        $custom_input        = $instance['custom_input'];
        $custom_textarea     = $instance['custom_textarea'];
        
        # Before the widget
        echo $before_widget;

        # The title
        if ( $title )
        echo $before_title . $title . $after_title;

        # Output
        //WMPL
        /**
         * retreive translations
         */
        if (function_exists ( 'icl_translate' )){
            $custom_input    = icl_translate('Widgets', 'Custom Widget - input field', $instance['custom_input']);
            $custom_textarea = icl_translate('Widgets', 'Custom Widget - textarea field', $instance['custom_textarea']);
        }
        //WMPL
        
        
        ?>
        <ul class="a_custom_widget clearfix">
            <li>
                <span><?php echo $custom_input;?></span>
                <p>
                    <?php echo $custom_textarea;?>
                </p>
            </li>
        </ul>
    
        <?php
        # After the widget
        echo $after_widget;
    }


WPML 内部的字符串翻译方式


WPML 包含一个字符串翻译界面,该界面列出字符串,允许用户管理它们的译文。



WPML 字符串翻译界面
WPML 字符串翻译界面




当用户单击翻译一个字符串时,会打开一个多语言翻译面板,允许他们编辑每种语言的翻译。 每个翻译都包括一个完成标志。 如果所有的语言翻译都完成了,字符串本身也被标记完成



当字符串改变时,其所有译文将被标记为未完成, 以便让用户知道需要修订译文。



所有字符串都是在同一 WordPress 管理员界面中进行编辑的,无需外部调用任何外部服务。

如何将 WPML 字符串翻译与插件和主题相整合


当将字符串翻译整合到插件或主题中时,务必确保调用存在。



WPML字符串翻译函数的调用应当包含在if_function_exists()语句中。 这样,如果WPML被激活,它就会被调用。 否则,保持正常的操作。



另外,插件开发者应当考虑这样情况:用户在开始使用他们的插件很久以后才激活 WPML。 在此情况下,当创建新字符串时,不会调用 icl_register_string,因此这些字符串绝不会被翻译。 要克服此问题,最好是管理员屏幕每次载入插件时注册所有用户字符串。



这将增加可忽略不计的执行时间,但会保证始终将所有字符串送交翻译并保持最新。 可以测试一次该代码,以了解icl_register_string是否存在,然后调用它注册用户输入的所有字符串。



如果使用空或NULL值调用该函数,WPML会忽略该次调用。如果字符串已经存在且没有修改,会再次忽略该调用。仅当注册了新的或经修改的字符串时才有效。



整个翻译表被缓存到内存,因此重复调用只占用很少的处理能力。

哪些内容需要被送交翻译


让我们从哪些内容无需使用 icl_register() 进行注册开始说起。



WPML 为不同的语言使用不同的文章、页面、标签和分类。 这意味着,如果网站包含这两个页面:example.com/about/example.com/es/sobre/,它们将是不同的 WordPress 页面。



按页面添加的任何文本已经以多语言显示,同时用户只需以撰写该页面所用语言输入正确的文本。



需要使用 WPML 的字符串翻译功能进行翻译的内容是不属于任何文章、页面、标签或分类的文本。 例如,搜索引擎优化插件允许输入首页标题的文本、关键字和描述。 此文本需要使用 WPML 的字符串翻译功能进行翻译。 这样,它将为不同语言的首页显示翻译后的内容。