在WP插件中加载语言文件的正确方法 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

在WP插件中加载语言文件的正确方法

说到“正确方法”,当然就有“不好的方法”。

错误的方法

很多人习惯这样加载语言文件:

class My_Plugin {

    public function __construct()
    {
        load_plugin_textdomain('my-plugin', FALSE, dirname(plugin_basename(__FILE__)).'/languages/');
    }
}
new My_Plugin;

如果你看了 load_plugin_textdomain 函数的源码,就会知道这是不正确的。
此函数有三个HOOK, override_load_textdomain 、load_textdomain 和 load_textdomain_mofile .
按照上面的做法,在插件文件一加载时,便执行了load_plugin_textdomain(), 那么其它插件或主题便没办法作用于load_plugin_textdomain() 中的那三个HOOK.

正确的加载方法

正确的加载方法应该是这样的:

class My_Plugin {

    public function __construct()
    {
        add_action('init', array($this, 'load_plugin_textdomain'));
    }

    public function load_plugin_textdomain()
    {
        load_plugin_textdomain('my-plugin', FALSE, dirname(plugin_basename(__FILE__)).'/languages/');
    }
}

即让加载操作在WP初始化以后再进行。


load_textdomain()函数中的三个HOOK介绍

Filter: override_load_textdomain
此hook 可阻止加载指定的语言文件,如:

add_filter('override_load_textdomain', 'block_my_plugin_default_language_files', 10, 3);

function block_my_plugin_default_language_files($override, $domain, $mofile)
{
    if ('my-plugin' === $domain && plugin_dir_path($mofile) === WP_PLUGIN_DIR.'/my-plugin/languages/')
        return TRUE;

    return $override;
}

Filter: load_textdomain_mofile
此hook 可改变指定语言文件的mo 文件的位置,如:

add_filter('load_textdomain_mofile', 'replace_my_plugin_default_language_files', 10, 2);

function replace_my_plugin_default_language_files($mofile, $domain)
{
    if ('my-plugin' === $domain)
        return WP_LANG_DIR.'/my-plugin/'.$domain.'-'.get_locale().'.mo';

    return $mofile;
}

Action: load_textdomain
此hook 可让你在加载某语言文件时,加载一些额外的其它语言文件,如:

add_action('load_textdomain', 'load_custom_language_files_for_my_plugin', 10, 2);

function load_custom_language_files_for_my_plugin($domain, $mofile)
{
    // Note: the plugin directory check is needed to prevent endless function nesting
    // since the new load_textdomain() call will apply the same hooks again.
    if ('my-plugin' === $domain && plugin_dir_path($mofile) === WP_PLUGIN_DIR.'/my-plugin/languages/')
    {
        load_textdomain('my-plugin', WP_LANG_DIR.'/my-plugin/'.$domain.'-'.get_locale().'.mo');
    }
}

参考文档:
http://www.geertdedeckere.be/article/loading-wordpress-language-files-the-right-way
http://codex.wordpress.org/I18n_for_WordPress_Developers
http://codex.wordpress.org/Function_Reference/load_textdomain
http://codex.wordpress.org/Function_Reference/load_plugin_textdomain

Tagged in : 插件开发,语言文件,正确方法

All Comments (0)
Gravatar image
No Comments