Do Chủ đề trẻ em tự động tải Bản dịch từ Chủ đề phụ huynh?


7

Chỉ cần tạo một chủ đề con là đủ - hãy nói về mặt kỹ thuật mà không cần thêm bất cứ điều gì khác ngoài mức tối thiểu style.css- để bản dịch của chủ đề phụ cũng được sử dụng tự động cho chủ đề con?

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
 */

Các twentytwelve theme có file dịch thuật tiêu chuẩn.

Và nếu điều đó không tự động xảy ra trên trang web của tôi, điều gì sẽ là một nơi tốt để bắt đầu xử lý sự cố mất bản dịch?

Câu trả lời:


7

Chỉ cần tạo một chủ đề con là đủ - hãy nói về mặt kỹ thuật mà không cần thêm bất cứ thứ gì ngoại trừ style.css tối thiểu - để dịch thuật chủ đề gốc cũng được sử dụng tự động cho chủ đề con?

Về cơ bản, câu trả lời là KHÔNG , ... nhưng ... có một lựa chọn:

Thêm một plugin mu.

Plugin này (MU-) thực hiện một số điều:

  1. Nó móc vào after_setup_thememức ưu tiên 20 - giả sử rằng tệp textdomain / i18n .mo được tải đúng ở mức ưu tiên mặc định trên hook chính xác.
  2. Sau đó, nó lấy một instanceofngười WP_Theme- trong trường hợp này các child theme.
  3. Sau đó, nó kiểm tra nếu thực sự một chủ đề con đang sử dụng.
  4. Nếu điều này là đúng, thì nó sẽ chỉ tải miền văn bản từ tệp cha.

Nó thực sự khá dễ dàng, vì lớp lõi thực hiện rất nhiều kiểm tra cho chúng tôi: Nó lấy ra một thể hiện khác WP_Themecho chủ đề chính. Sau đó, nó kiểm tra nếu TextDomaintiêu đề được đặt, sử dụng : $current_theme->get( 'TextDomain' );. Do đó, vấn đề là có một quy ước trong trò chơi: Plugin này sẽ chỉ hoạt động, nếu chủ đề chính có một Text Domainvà (!) Một Domain Pathbộ tiêu đề.

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

Bây giờ đến vấn đề: Các chủ đề Twenty * mặc định / tiêu chuẩn được phân phối bởi lõi không (!) Có Domain Pathmục tiêu đề. Và đây là điều mà chúng tôi phải sửa ngay lập tức, vì load_theme_textdomain()các tìm kiếm khác cho tệp dịch không nằm trong thư mục chủ đề gốc, nhưng

  • đầu tiên trong thư mục chủ đề con : get_stylesheet_directory().WP_Theme::get( 'DomainPath' ), có nghĩa là (A) các Domain Pathnhu cầu cần được đặt nó cần được thêm tiền tố bằng dấu gạch chéo : /.
  • sau đó trong thư mục chủ đề con: `get_stylesheet_directory (). '/ Languages'.
  • và cuối cùng trong WP_LANGUAGE_DIR.'/themes'thư mục.

Lưu ý: Tôi đoán đó chỉ là một lỗi sẽ không bao giờ được sửa chữa cho "khả năng tương thích ngược", mà - nói cách khác - có nghĩa là có một lỗi, nhưng có thể có các nhà phát triển đã làm việc xung quanh nó. : P

Sau đó, có một vấn đề khác. Các WP_Themephương pháp lớp load_textdomain()nội đi một $pathđể load_theme_textdomain(). Và tham số này là $this->get_stylesheet_directory(). Và phương thức này trở lại $this->theme_root . '/' . $this->stylesheet. Vì vậy, chức năng thực sự sẽ hoạt động khá tốt , nhưng nó làm rối tung nó chỉ bằng cách gọi một sự thay thế bên trong cho get_stylesheet_directory()(có thể lọc được). Bây giờ người ta có thể nghĩ

"Này! Cả lớp implements ArrayAccess! Vì vậy, chỉ cần đặt khóa mảng bị thiếu của Domain Path!"

Sai lầm. Tất cả các thuộc tính lớp được đánh dấu privatevà không thể truy cập.

Sau đó bạn có thể nghĩ

"Tại sao không chỉ đơn giản extendWP_Themelớp và định nghĩa một set()Phương thức để chúng ta có thể tự đặt các mục tiêu đề bị thiếu?"

Sai lầm. Các lớp học là finalvà không thể mở rộng.

Kết quả: Chúng tôi còn lại với những gì load_theme_textdomain()- chức năng cuối cùng trong chuỗi cuộc gọi - cung cấp cho chúng tôi. Bây giờ chúng tôi đã có một plugin lớn hơn chặn load_theme_textdomain()cuộc gọi để tải đúng tệp. Để không làm phiền các tải tập tin i18n khác, nó ngay lập tức xóa cuộc gọi lại khỏi bộ lọc để giữ cho môi trường của bạn gọn gàng.

<?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;
    }
}

Tôi đã viết một câu trả lời khi tôi nhận được thông báo về câu trả lời mới được thêm vào. Trong câu trả lời của tôi, tôi đã viết để tải tên miền văn bản gốc functions.php. Câu trả lời của bạn rất hay, nhưng không mâu thuẫn với chủ đề con xác định tên miền văn bản con của chính nó thông qua load_child_theme_textdomain? Tuy nhiên +1 chắc chắn.
gmazzap

@GM Cảm ơn. Không, nó không nên chặn cuộc gọi đó. Không có kết nối giữa những người. Nhưng tôi đã tìm thấy một số lỗi khác và những điều thú vị (hay nói cách khác: bằng cách nào đó ngu ngốc) xảy ra đằng sau hậu trường.
kaiser

1
công việc tuyệt vời Buồn là không thể +1 nữa!
gmazzap

3

Theo mặc định, điều này chỉ hoạt động ra khỏi hộp. Nếu chủ đề phụ cung cấp bản dịch, chủ đề con sẽ đảm nhận.

Nếu nó không hoạt động một cái gì đó là sai. Đây là trường hợp của tôi, đây là cách tôi đã xử lý sự cố:

  1. Tôi đã kích hoạt chủ đề chính để xem bản dịch có hoạt động ở đó không - nó không hoạt động.
  2. Sau đó, tôi đã cài đặt plugin Dịch thuật gỡ lỗi để tìm hiểu các tệp ngôn ngữ đã được thử tải.
  3. Sau đó, tôi bắt đầu một phiên gỡ lỗi Xdebug ( ?XDEBUG_SESSION_START=1) và xác minh vị trí tải được báo cáo bị hỏng bằng cách đặt một điểm dừng ở đó và bước vào đó.

Sau đó hóa ra Wordpress đang tìm kiếm một tên tệp khác. Tôi sửa tên tệp và sau đó nó hoạt động.

Tinh thần của câu chuyện: Các tệp ngôn ngữ trong các chủ đề chỉ nên được đặt tên theo địa phương, như de_DE.motrong trường hợp của tôi.


Bị lỗi:

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

Đang làm việc:

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

1
Tôi đã thử cho mười hai chủ đề và làm việc ra khỏi hộp (phiên bản tiếng địa phương được tải xuống từ it.wordpress.org). Với hai mươi mười hai thì không. Và dường như với tôi, hai chủ đề triển khai các bản dịch theo cùng một cách ( Tôi không thể hiểu tại sao.
gmazzap

@GM: Ồ đó là phản hồi thú vị mà bạn lưu ý ở đây. Có lẽ câu trả lời của tôi cho đến nay không hiển thị toàn bộ câu chuyện. Bây giờ tôi đã thêm các vị trí tệp để làm rõ hơn lỗi / lỗi của tôi ở đâu, điều đó có thể giúp so sánh mọi thứ.
hakre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.