问题描述

目标是提供一个按钮/选择 drop-down 或类似的方式来切换公共接口 1) 语言。

我在寻找什么

  • 插件或主题代码…

  • … 或想法

  • 使用 work-around 与 load_textdomain()将不胜感激,将翻译留给.po /.mo 文件

  • 关于如何在不依赖于某些文本域功能的情况下将字符串解析为接口的想法 (例如 ajax /plain php /ini,json,xml 文件)


注意:

1) 不是用不同的语言出版。

2) 我不需要代码使实际的 drop-down /按钮/任何。这只是关于为 UI 传递字符串的代码/系统。

谢谢!

最佳解决方案

到目前为止,最好的 (最简单的) 方式是使用区域设置过滤器 (get_locale()内) 。

首先设置一个快速功能,用于检索在 locale 过滤器上使用的其他语言。

/**
 * A function returns with returns the user's selectd locale, if stored.
 */
function wpse35622_get_new_locale($locale=false){
$new_locale = get_user_meta(get_current_user_id(), 'wpse_locale', true);
    if($new_locale)
        return $new_locale;

    return $locale;
}

我把这作为一个全局功能,可能会方便吗?其余的 plug-in 我已经包装在一个类。

它创建一个可以选择的语言的 drop-down 。

Drawbacks

  • 搜索 wp-content/languages xx_xx.mo 形式的文件。如果它不是那种形式 (并不是所有的.mo 文件),plug-in 将不会拾起它!

  • 下拉列表中列出了可以选择的找到的区域设置,但是这些列表显示在 「xx_xx」 格式的区域设置中,而不是人性化的方式 – 任何想法?

  • $locale 是否可以做任何其他语言?如果是这样,仍然可以获得相同的语言环境,但提供替代翻译。这是一个很多 messier 虽然…

代码

class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';

    /**
     * Hook the functions
     */
    public function __construct(){

        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }

    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }

    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }

    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     *
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
         $name = self::$name;
         $locale = get_locale();
         $langs = get_available_languages();
         $langs[] = 'en_US';

         //For the labels (format_code_lang)
         require_once( ABSPATH . 'wp-admin/includes/ms.php');

         $html = "<form method='post'> ";
         $html .= "<select name='{$name}'>";
         foreach($langs as $lang){
              $label = format_code_lang( $lang );
              $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$label}</option>";
        }
         $html .= "</select>";
         $html .= get_submit_button('Change Language','secondary', 'submit', true);
         $html .= "</form >";

         return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();

次佳解决方案

如果您可以安排刷新页面,则可以选择重新定义 WPLANG 常量。我正在两个网站上进行多语言的内容,其中多重插件无法触发 UI 翻译。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。