如何开发多语种主题?

时间:2016-12-06 作者:Ollie

对于如何创建多语言WordPress主题,我还没有找到一个简洁、从头到尾的描述。

我是一个相当有能力的开发人员,在我的时间里做了一些自定义主题。对于我正在从事的一个项目,我刚刚开始将线框转换为WordPress的过程。我已经知道,这个网站将只使用这一个自定义主题,我正在创建,我知道该网站将提供大约5种不同的语言。

页面顶部将有一个语言选择器,用户只需单击其国家的国旗,它将刷新一些内部设置,从而更改整个网站的语言。据我所知,你可以使用采购订单/生产订单文件来翻译网站,但不幸的是,我无法理解。

理想的情况是我用英语开发主题,对于任何具有多个翻译的字符串,使用一些本地化功能(\\uuu()&_e()?)。开发完成后,我需要能够为每种语言的每个可翻译字符串添加翻译。我很确定解决方案是使用POEdit,但我不明白它是如何联系在一起的。

为了澄清,我并不是在寻找一个插件,它可以为不同的页面/帖子提供不同的翻译。我正在寻找一种解决方案,可以在自定义主题中翻译单个字符串。

提前感谢您提供的任何建议。

2 个回复
最合适的回答,由SO网友:Ollie 整理而成

丹尼尔的答案非常相似,但适用于插件而非主题。出于这个原因,我将解释我是如何专门为遇到这个问题的其他人的主题做这件事的。

在主题的根目录中创建一个名为“语言”的文件夹转到https://wpcentral.io/internationalization/, 搜索您的语言并复制“WordPress Locale”代码(例如捷克语的cs\\U CZ)

  • 打开Poedit文件->新建将您从wpcentral复制的代码粘贴到出现的框中,然后保存到步骤1中创建的“语言”文件夹中,按“源路径”下的“从源中提取”(或目录->属性),在“路径”框中按+选择主题文件夹(例如wp内容/主题/我的主题)
  • 在“源关键字”选项卡中,按“新建项目”键入“\\uuuu”(下划线,无引号),然后按enter键键入“\\u e”(无引号),然后按enter键按OK键按Save键按Catalogue键从源代码更新你应该会看到主题中的所有可翻译字符串出现(基本上每次使用“\\uu(\'Hello world\',\'mydomain\')”时,翻译都会出现)
  • 一旦完成翻译,按File->Compile to MO(保存在步骤1的相同语言文件夹中)
  • 将以下代码添加到主题函数文件的顶部:

    function mytheme_localisation(){
    
        function mytheme_localised( $locale ) {
            if ( isset( $_GET[\'l\'] ) ) {
                return sanitize_key( $_GET[\'l\'] );
            }
            return $locale;
        }
        add_filter( \'locale\', \'mytheme_localised\' );
    
        load_theme_textdomain( \'mytheme\', get_template_directory() . \'/languages\' );
    }
    add_action( \'after_setup_theme\', \'mytheme_localisation\' );
    
    现在要动态翻译您的站点,您只需添加URL参数l={语言代码}(例如mysite.com/?l=cs\\u CZ-这将加载我们使用poedit翻译的cs\\u CZ.mo文件)
  • 来总结:要翻译主题中的字符串,请使用以下代码:

    __( \'Hello, World!\', \'mytheme\' )
    
    其中,“mytheme”是您在步骤18的函数中设置的textdomain。将此与使用Poedit创建PO/MO文件相结合,您将能够使主题成为多语言的。在我的情况下,这是一个完美的解决方案,因为我可以在我的站点上使用标志选择器动态更改语言,并且可以将用户的首选项存储在cookie中,并在用户返回时重定向它们。

    我希望这能帮助其他有类似问题的人,因为我花了很多时间才弄明白。

    SO网友:Daniel Mulder

    我自己在最近一年里做过几次,但只针对我制作的插件。但我认为它的效果会差不多。您确实需要使用\\uuu()或类似的函数,但也总是首先需要加载文本域。我在构建顶级类之后直接加载文本域,并由前端和后端控制器子体显式启动以生成它,因此在执行进一步的函数之前,始终加载此域和常量等。

    /*
    * Init localization text domain
    */
    public static function plugin_load_textdomain(){
        load_plugin_textdomain( PLUGIN_TEXTDOMAIN, false, dirname(      
        plugin_basename( __FILE__ ) ) . \'/languages\' ); 
    }
    
    // This action hooks to WordPress init event and triggers it on init event
    add_action( \'init\', array($plugin->model, \'plugin_load_textdomain\'), 10 ); 
    
    我认为这应该与模板函数类似。然后将其与字符串一起使用以在视图层ie中进行转换

    <?php echo __( \'Translate me!\', PLUGIN_TEXTDOMAIN ); ?>
    
    要使其工作,请使用文件夹plugin\\u basename(FILE ) ) . \'/“语言”必须包含带有翻译字符串的PO文件。我使用Poedit创建文件。使用Poedit创建的文件符合WordPress翻译的原生方式,这里解释了MO如何使用WordPresshttps://codex.wordpress.org/I18n_for_WordPress_Developers.

    希望这能有所帮助,我同意关于这方面的好信息不多。如果需要,请随时询问更多!Gr公司

    相关推荐

    multi-language WordPress site

    我正在制作由WordPress支持的多语言网站。WPML 不是免费的,而且它对数据库进行了太多额外的sql查询,所以对于我的站点来说,这不是一个好的解决方案。qTranslate 将所有语言保存在一个数据库行中,以后移动到另一个多语言插件非常复杂。<?php _e( \'<!--:en-->english text<!--:--><!--:de-->german text<!--:-->\' ); ?> xLanguage 两年多没有更新