通过单击按钮更改语言

时间:2011-12-05 作者:kaiser

目标是提供一个按钮/选择下拉列表或类似选项,以便动态切换公共界面。

我在寻找什么

插件或主题代码

  • 想法
  • 使用load_textdomain() 请将翻译留给我。采购订单/。mo文件关于在不依赖某些textdomain函数的情况下如何将字符串解析到接口(例如ajax/普通php/ini、json、xml文件)的想法请注意:

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

    2) 我不需要代码来创建实际的下拉列表/按钮/任何东西。这只是关于为UI提供字符串的代码/系统。

    谢谢

  • 3 个回复
    最合适的回答,由SO网友:Stephen Harris 整理而成

    到目前为止,最好(最简单)的方法是使用区域设置过滤器(内部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;
    }
    
    我把它作为一个全局函数,可能很方便。。。?我将插件的其余部分封装在一个类中。

    它会创建一个下拉列表,列出您可以选择的可能语言。

    缺点搜索wp-content/languages 对于表单的文件xx_xx.mo. 如果它不是那种形式(不是所有的.mo文件都是),插件就不会接受它$locale 除了语言,你还会做什么?如果是这样的话,仍然可以获得相同的语言环境,但可以提供其他翻译。但这要混乱得多

    代码

    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();
    

    SO网友:Johannes Pille

    如果您可以接受页面刷新,请重新定义WPLANG 常量可以是一个选项。我在两个有多语言内容的网站上这样做,其中多语言插件无法触发UI翻译。

    SO网友:krembo99

    http://www.qianqin.de/qtranslate/

    是你需要的。。。

    Edit I - 评论之后。首先,感谢所有在投票洪流中做出贡献的人。(如果访问频率不够,就会出现这种情况:-))

    现在,处理交换机的函数位于qtranslate核心中。(大约从第80行开始-取决于所需的版本。)

    由于您无法查看非OOP代码,而我现在没有其他事情要做-我花了10分钟的时间来综合、解释并使用另一个非OOP代码编译该非OOP。

    (抱歉,-这里是原始的旧skool)

    假设我理解了这个问题&&;假设您希望代码用于管理(&A)&;假设您知道如何将其移植到前端(如果需要)(&&;假设您理解代码不是最佳的:

    <?php
    /*
    Plugin Name: k99 language switcher
    Plugin URI: http://www.krembo99.com
    Description: Admin Language switcher proof of concept only - do not use in production.
    Version: 0.0.0.0.0.0.0.1
    Author: Krembo99
    Author URI: http://www.krembo99.com
    */ 
    ?>
    <?php function k99_add_language_menu() {
        //  k99_load_ajax_display_functions();
    ?>  
        <div class="mgmb_help_setting">
        <?php _e(\'Language:\',\'your_text_domain\'); ?>
        <select name="mgmb_language_setting_help" id="mgmb_language_setting_help" onChange="mgmb_set_language_cookies(this.value);" >
            <option value="en_US" <?php if($_COOKIE[\'k99_userLang\']=="en_US"){echo "selected";} ?>><?php _e(\'English\',\'your_text_domain\');?></option>
            <option value="de_DE" <?php if($_COOKIE[\'k99_userLang\']=="de_DE"){echo "selected";} ?>><?php _e(\'German\',\'your_text_domain\');?></option>
            <option value="zh_CN" <?php if($_COOKIE[\'k99_userLang\']=="zh_CN"){echo "selected";} ?>><?php _e(\'Chinese\',\'your_text_domain\');?></option>
        </select>
        </div>
    <?php   
    }
    // Now we set that function up to execute when the help action is called
    add_filter(\'contextual_help\', \'k99_add_language_menu\');
    
    // I guess this is your mysterious "browser stuff"
    function k99_language_change($lang){ 
     global $locale;
     // wp_cache_set( "language", $lang, \'options\' );
        if ( isset($_COOKIE[\'k99_userLang\'])) {
          $lang = $_COOKIE[\'k99_userLang\'];
        }
        define( \'WPLANG\', $lang );
     if($locale!= $lang) {
        $locale = $lang;
        load_plugin_textdomain(\'your_text_domain\', false, dirname( plugin_basename(__FILE__) ) . \'/lang\'); // sample use for plugins textdomain
        load_plugin_textdomain(\'your_text_domain2\', false, dirname( plugin_basename(__FILE__) ) . \'/lang\');
        load_plugin_textdomain(\'your_text_domain3\', false, dirname( plugin_basename(__FILE__) ) . \'/lang\');
     }
      return $locale;
    }
    add_filter(\'locale\', \'k99_language_change\',99);
    
    ////////// +++++++++++++++  START COOKIES CREATION +++++++++++++++//////////////////
    // Javascript function set the language cookies
    // access external
    // @param lang - language code
    // @return NULL
    // or maybe this is the OP´s mysterious "browser stuff" ??
        function mgmb_print_script() {
        ?>
        <script type="text/javascript" >
        function mgmb_set_language_cookies(lang){   
            var Then = new Date(); 
            Then.setTime(Then.getTime() + 10000*60*60*1000 ); //set cookie expire to 10000 hours cookies (hour*minute*seconds*1000)
            document.cookie = "k99_userLang="+lang+";expires="+ Then.toGMTString();
            window.location.reload();
            } 
            </script>
    <?php
    } 
    add_action(\'admin_print_scripts\', \'mgmb_print_script\');  // this is not the right way to do .. but no time now.
    ?>
    
    备注:

    1-这是在机场用本地机器在10分钟内完成的。我之所以这样说,是因为我这里唯一现成的wordpress安装非常旧。(我想是2.9)。

    这意味着语言菜单可能会出现在上下文帮助div下,因为最近引入了一个新的div结构(带有选项卡),但它仍然可以工作。(如果有时间,我保证稍后再谈)

    如果我有更多的时间(这里有一个新的wordpress代码),我可能会将其集成到新的管理栏中add_action( \'admin_bar_menu\', \'k99_add_language_menu_2\', 1000 ); (我已经答应回去了)

    2-您应该在wp内容的“languages”文件夹中有列出的语言文件(更好??)或wp包括。关于这一点,代码只是概念的证明,当然,如果有更多的时间,菜单应该以动态的方式构建,而不是像这里这样。

    3-配置中的WPLANG应为空。如果已经设置了语言,我不确定它是否能在更新的wp版本上工作。

    4-这是一个基于qtranslate代码(也是旧版本)中看到的内容的简单综合和解释的概念证明-因此,大多数事情都是以“快速”的方式完成的,而不一定是“正确”的方式(如添加JS,没有专用的textdomain等)。

    EDIT II

    今天有人很幸运!(航班延误)

    由于您一直在寻找方法的“想法”,这里是另一个著名的方法。

    它不适合插件,也不适合任何其他非独占环境,但它可能会为您提供如何处理“浏览器内容”的另一个方向。

    这将使您能够通过以下方式获得语言:<a href="index.php?lang=de">German</a><a href="whatever.php?lang=ml">my Language</a>

    要使用,您可以创建一个代码(我们称之为wp-langswitch.php)

     session_start();
     if ( isset( $_GET[\'lang\'] ) ) {
        $_SESSION[\'WPLANG\'] = $_GET[\'lang\'];
        define (\'WPLANG\', $_SESSION[WPLANG]);
     } else {
        if(isset($_SESSION[\'WPLANG\'])) {
            define (\'WPLANG\', $_SESSION[\'WPLANG\']);
            $_GET[\'lang\'] = $_SESSION[\'WPLANG\'];
        } else {
            if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) {
                $languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
                 $languages = explode( ",", $languages );
                $_SESSION[\'WPLANG\'] = $languages[0];
                $_SESSION[\'WPLANG\'] = str_replace("-", "_", $_SESSION[\'WPLANG\']);
                $_GET[\'lang\'] = substr($_SESSION[\'WPLANG\'],0,2);
                define (\'WPLANG\', $_SESSION[WPLANG]);
            } else {
                define (\'WPLANG\', \'\');
            }
        }
     }
    
    现在,在wp config中,就在WPLANG常量之前,我们需要包含我们的代码。

     require_once(dirname(__FILE__).\'/wp-langswitch.php\');
     define (\'WPLANG\', \'\'); 
    
    现在,显然最好在混合中添加一些cookie来存储语言。

    EDIT III

    我答应稍后再讨论这个问题-下面是如何(以一种非常不正确和原始的方式)将其集成到管理栏中(而不是上下文帮助菜单)

     function k99_add_language_menu_bar() {
        global $wp_admin_bar, $wpdb;
        if ( !is_super_admin() || !is_admin_bar_showing() )
            return;
    // I am sure you can find a way alone to construct array from reading folder . If not , comment and I will update again.
    
    if($_COOKIE[\'k99_userLang\']=="en_US"){$sel==$_COOKIE[\'k99_userLang\'];} 
    if($_COOKIE[\'k99_userLang\']=="de_DE"){$sel==$_COOKIE[\'k99_userLang\'];}
    if($_COOKIE[\'k99_userLang\']=="zh_CN"){$sel==$_COOKIE[\'k99_userLang\'];}
    
        $k99_lang = \'\';
        $k99_lang .= \'<select name="mgmb_language_setting_help" id="mgmb_language_setting_help" onChange="mgmb_set_language_cookies(this.value);" >\';
        $k99_lang .= \'<option value="en_US" >English</option>\';
        $k99_lang .= \'<option value="de_DE" >German</option>\';
        $k99_lang .= \'<option value="zh_CN" >Chinese</option></select>\';
    
        /* Add the main siteadmin menu item */
        $wp_admin_bar->add_menu( array( \'id\' => \'Language\', \'title\' => __( \'language\', \'your_text_domain3\' ), \'href\' => FALSE ) );
        $wp_admin_bar->add_menu( array( \'parent\' => \'Language\', \'title\' => $k99_lang, \'href\' => FALSE ) );
    }
    add_action( \'admin_bar_menu\', \'k99_add_language_menu_bar\', 999 );
    
    只需将此函数替换(或添加)到旧代码(原始的非OOP非插件)中即可。

    正如我所说,我没有在本地安装一个新的wordpress,它的功能是管理栏,但它应该可以工作。

    (再说一次,它可能不起作用……但我相信如果你真的愿意,你可以解决这个问题,即使它不是面向对象的):-)

    现在得走了。希望能有所帮助。

    EDIT IV - 将管理菜单栏的edit III更改为working verion(至少在我的wp 3.4上)

    因为我没有3.4的工作安装-现在我回来了,我做了-我编辑了Edit III解决方案-它适合我。

    关于以上投票,我毫不在乎。我也不需要任何“赏金”(不管是什么)这只是为了练习,你可能会把它交给qTranslate的作者。:-)尽管它不是OOP,但它是一个很好的插件,在很多领域都有很多值得学习的地方。考虑到这个插件发布的“时间”,它甚至是惊人的。值得付出难以形容的努力来阅读非OOP代码——即使不是——OOP。即使它没有正确的缩进(上帝啊!)。

    结束

    相关推荐

    How to change language?

    很抱歉,这是一个完整的新手问题,但我在谷歌上搜索了它,找不到这个简单的信息。我今天刚安装了Wordpress。现在我的Wordpress博客上的所有文字都是英文:“Home”、“About”、“Comments”等。我怎样才能改变语言?更新:事实上,我还没有走出困境。我有:找到fr\\u fr.mo文件并将其复制到新目录“/wp content/languages/”中修改了wp配置。php文件中包含以下行:定义(\'WPLANG\',\'fr\\u fr\');不幸的是,我仍然得到英文界面。任何帮助都将