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

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

错误的方法

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

1
2
3
4
5
6
7
8
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.

正确的加载方法

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

1
2
3
4
5
6
7
8
9
10
11
12
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 可阻止加载指定的语言文件,如:

1
2
3
4
5
6
7
8
9
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 文件的位置,如:

1
2
3
4
5
6
7
8
9
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 可让你在加载某语言文件时,加载一些额外的其它语言文件,如:

1
2
3
4
5
6
7
8
9
10
11
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

更多
2 Responses Post a comment
  1. 经典影视

    非常感谢,刚汉化插件,原作者就犯了这个错,改过来就OK了

Leave a Reply

Note: You may use basic HTML in your comments. Your email address will not be published.

Subscribe to this comment feed via RSS