子主题是否自动从父主题加载翻译?

时间:2013-09-08 作者:hakre

仅仅创建一个子主题就足够了吗?比如说,从技术上来说,除了最低限度之外,没有添加任何其他内容style.css - 是否将父主题的翻译也自动用于子主题?

child-theme/style.css

/**
 * Theme Name:     Child-Theme Child
 * Theme URI:      http://example.com/
 * Description:    Child theme for the Twentytwelve theme
 * Author:         Theme Author
 * Author URI:     http://example.com/
 * Template:       twentytwelve
 * Version:        0.1.0
 */
“二十一二”主题有标准语言的翻译文件。

如果我的网站上不会自动出现这种情况,那么从哪里开始解决缺失翻译的问题呢?

2 个回复
SO网友:kaiser

仅仅创建一个子主题就足够了吗?比如说,从技术上来说,除了最简单的样式之外,没有添加任何其他内容。css-让父主题的翻译也自动用于子主题?

基本上,答案是否定的。。。but... 有一个选项:

添加mu插件

这个(MU-)插件做了几件事:

它与after_setup_theme 优先级为20-假设父textdomain/i18n。mo文件以正确挂钩上的默认优先级正确加载instanceof 这个WP_Theme - 在本例中是子主题WP_Theme 对于父主题。然后检查TextDomain 标题设置,使用:$current_theme->get( \'TextDomain\' );. 因此,关键是有一个convention 进入游戏:如果父主题得到Text Domain 和(!)A.Domain Path 标题集。

<?php
/**
 * Plugin Name: (#113391) Parent Theme i18n Autoloader
 * Description: Load Twenty12 Child theme translation files automagically from Parent
 */
add_action( \'after_setup_theme\', \'wpse113391_parent_theme_i18n_autoloader\', 20 );
function wpse113391_parent_theme_i18n_autoloader()
{
    $current_theme = wp_get_theme();
    if ( is_child_theme() )
        $current_theme->parent()->load_textdomain();
}
现在问题来了:核心交付的默认/标准二十*主题不(!)拥有Domain Path 标题条目。这是我们必须做的fix 立即,作为load_theme_textdomain() else不在父主题文件夹中搜索翻译文件,但

子主题文件夹中的第一个:get_stylesheet_directory().WP_Theme::get( \'DomainPath\' ), 这意味着(A)Domain Path 需要设置and 它需要以斜杠作为前缀:/. WP_LANGUAGE_DIR.\'/themes\' 目录

    注意:我想这只是一个永远不会为“向后兼容性”修复的bug,换句话说,这意味着有一个bug,但可能已经有开发人员在解决它了:P

    然后还有另一个问题。这个WP_Theme 类方法load_textdomain() 内部通过a$pathload_theme_textdomain(). 这个参数是$this->get_stylesheet_directory(). 此方法返回$this->theme_root . \'/\' . $this->stylesheet. 所以这个函数实际上工作得很好,but 只需调用内部替换get_stylesheet_directory() (可过滤)。人们现在可能会想

    “嘿!全班同学implements ArrayAccess! 所以只需设置缺少的数组键Domain Path!“”

    Wrong. 所有类属性都已标记private 无法访问。

    那么你可能会想

    “为什么不简单extend 这个WP_Theme 类并定义set() 方法,以便手动设置缺少的标头条目?“”

    Wrong. 类本身是final 并且不可扩展。

    Result: 我们还剩下什么load_theme_textdomain() - 调用链中的最后一个函数为我们提供了。现在我们有了一个更大的插件,可以拦截load_theme_textdomain() 调用以加载正确的文件。为了不干扰其他i18n文件加载,它会立即从过滤器中删除回调以保持环境整洁。

    <?php
    /**
     * Plugin Name: (#113391) Parent Theme i18n Autoloader
     * Description: Load Twenty12 Child theme translation files automagically from Parent
     */
    
    add_action( \'muplugins_loaded\', array( \'WPSE113391Parenti18nLoader\', \'getInstance\' ) );
    class WPSE113391Parenti18nLoader
    {
        public static $instance = null;
    
        private $theme = null;
    
        public static function getInstance()
        {
            null === self::$instance AND self::$instance = new self;
            return self::$instance;
        }
    
        public function __construct()
        {
            add_action( \'after_setup_theme\', array( $this, \'i18nAutoloader\' ), 20 );
        }
    
        public function setTheme( $theme )
        {
            return $this->theme = $theme;
        }
    
        public function getTheme()
        {
            return $this->theme;
        }
    
        public function i18nAutoloader()
        {
            if ( ! is_child_theme() )
                return;
    
            $current_theme = wp_get_theme();
            if ( \'\' === $current_theme->parent()->get( \'DomainPath\' ) )
            {
                $this->setTheme( $current_theme->parent() );
                add_filter( \'override_load_textdomain\', array( $this, \'overrideI18nLoader\' ), 10, 3 );
            }
            $current_theme->parent()->load_textdomain();
        }
    
        public function overrideI18nLoader( $activate, $domain, $mofile )
        {
            // Don\'t intercept anything else: Self removing
            remove_filter( current_filter(), __FUNCTION__ );
    
            // Rebuild the internals of WP_Theme::get_stylesheet_directory() and load_theme_textdomain()
            $theme  = $this->getTheme();
            $path   = trailingslashit( $theme->get_theme_root() ).$theme->get_template();
            $locale = apply_filters( \'theme_locale\', get_locale(), $domain );
    
            load_textdomain( $domain, "{$path}/{$locale}.mo" );
    
            // Return true to abort further attempts
            return true;
        }
    }
    

SO网友:hakre

默认情况下,这只是开箱即用。如果父主题提供翻译,则由子主题接管。

如果它不起作用,就会出问题。在我的情况下,我是如何解决问题的:

我激活了父主题以查看翻译是否在那里工作-它没有Debug Translations 插件以了解尝试加载的语言文件?XDEBUG_SESSION_START=1) 并通过在此处放置断点并跨入断点来验证报告已损坏的加载位置

故事的寓意:主题中的语言文件应仅用本地名称命名,如de_DE.mo 就我而言。

<小时>

Faulty:

+ wp-content
+--+ themes
|  +--+ child-theme
|  |  `--- style.css
.  .    ...
|  `--+ twentytwelve
|     +--+ languages
|     |  `--- twentytwelve-de_DE.mo    <<<
.    ...

Working:

+ wp-content
+--+ themes
|  +--+ child-theme
|  |  `--- style.css
.  .    ...
|  `--+ twentytwelve
|     +--+ languages
|     |  `--- de_DE.mo    <<<
.    ...

结束

相关推荐

month name translation

我使用birdtips主题,它将发布日期格式化为$birdtips_posted = date(__(\'Y. F j.\', \'birdtips\'), strtotime(get_the_time(\"Y-m-d\"))); 其中Y.F.j.已经被改写以反映我的语言。据我所知,\\uuuu是翻译功能,但我如何告诉Wordpress我使用匈牙利语,它会自动翻译月份名称,或者我应该在中给出名称。采购订单文件?