Ghi đè bản dịch chủ đề phụ huynh về chủ đề con


11

Tôi có một chủ đề gốc sử dụng chính xác load_theme_textdomain()để tải tất cả các chuỗi dịch bằng nhiều ngôn ngữ.

Sau đó, tôi đã tạo ra một chủ đề con sử dụng load_child_theme_textdomain()để đạt được điều tương tự cho chuỗi của nó.

Có một số chuỗi dịch nhất định cho một ngôn ngữ cụ thể trên chủ đề gốc mà tôi muốn thay thế / ghi đè trong chủ đề con.

Tôi biết nếu chúng nằm trên một tệp mẫu, tôi có thể thay thế tệp đó và chỉ cần thay đổi tên miền văn bản cho các chuỗi đó, nhưng không may là những chuỗi tôi đang nói đến được sử dụng ở nhiều nơi và cả trong bảng điều khiển (vì vậy bên trong một số chức năng lọc / hành động ).

Vì vậy, câu hỏi của tôi là: có cách nào để thay thế các chuỗi được dịch bên trong chủ đề con mà không phải thay thế các tệp hoặc hàm mẫu của cha mẹ không?

Tôi không biết, có thể thêm tệp Parent-theme.mo trong thư mục ngôn ngữ của chủ đề con chỉ với các chuỗi được dịch hoặc một cái gì đó tương tự.

Câu trả lời:


9

Tôi nghĩ rằng tôi đã tìm thấy một giải pháp, nhưng trước một chút

Tiền đề

load_theme_textdomain()load_child_theme_textdomain()về cơ bản là bằng nhau, sự khác biệt duy nhất là đường dẫn mặc định họ sử dụng:

  • họ lấy ngôn ngữ hiện tại (sử dụng get_locale()) và thêm tệp .mo tương đối vào đường dẫn được truyền dưới dạng đối số;
  • sau đó họ gọi load_textdomain()chuyển qua làm đối số cả tên miền văn bản và đường dẫn kết quả đến tệp .mo.

Sau đó load_textdomaintải tệp .mo vào biến văn bản toàn cầu, nhưng như chúng ta có thể đọc từ nguồn :

Nếu tên miền đã tồn tại, các bản dịch sẽ được hợp nhất.

Nếu cả hai bộ có cùng một chuỗi, bản dịch từ giá trị ban đầu sẽ được thực hiện.

Vì vậy, để ghi đè / chỉ thay thế các chuỗi của chủ đề mà chúng ta muốn, chúng ta cần tải một tệp .mo tùy chỉnh cho tên miền văn bản gốc, chỉ chứa các chuỗi đó được dịch, trước khi chủ đề gốc tải tệp .mo của nó.


Giải pháp

Cuối cùng, tôi chỉ cần tạo một thư mục có tên của chủ đề gốc (chỉ để thuận tiện) vào thư mục ngôn ngữ chủ đề con và đặt vào đó các tệp .mo tùy chỉnh của tôi cho tên miền văn bản gốc (một cho ngôn ngữ, trong xx_XX.mobiểu mẫu, nơi xx_XXlà mã ngôn ngữ).

Và sau đó tôi đã thêm một dòng trong functions.phptệp chủ đề con trong khi after_setup_themehành động, gần dòng tải tệp .mo cho miền văn bản chủ đề con tôi:

add_action( 'after_setup_theme', function () {
    // load custom translation file for the parent theme
    load_theme_textdomain( 'parent-textdomain', get_stylesheet_directory() . '/languages/parent-theme' );
    // load translation file for the child theme
    load_child_theme_textdomain( 'my-child-theme', get_stylesheet_directory() . '/languages' );
} );

functions.phptệp của chủ đề con được tải trước tệp gốc, nên chuỗi này sẽ được ưu tiên so với bản dịch chủ đề gốc (hoặc tôi có thể chỉ đặt mức độ ưu tiên bằng tham số thứ ba của add_actionhàm).


Lưu ý: Tôi có thể sử dụng load_child_theme_textdomainthay vì load_theme_textdomain, như đã nói trong tiền đề nó sẽ giống nhau.


4

Bạn có thể sử dụng các tệp ngôn ngữ trong thư mục chủ đề con của bạn. Trước tiên, bạn phải biết tên miền văn bản mà chủ đề gốc đang sử dụng. Sau đó, tạo các tệp .po và .mo chỉ bằng ngôn ngữ của bạn làm tên tệp (ví dụ: de_DE.po / de_DE.mo hoặc nl_NL.po / nl_NL.mo) và đặt chúng vào một thư mục trong thư mục chủ đề con của bạn, "ngôn ngữ" ví dụ.

Sau đó, bạn có thể khởi tạo miền văn bản bằng load_child_theme_textdomain():

load_child_theme_textdomain( 'the_text_domain', get_stylesheet_directory() . '/languages/' );

Lưu ý rằng bạn có thể tìm thấy miền văn bản bằng cách tìm kiếm các lệnh gọi như __()hoặc _e()trong tệp PHP chủ đề gốc. Tham số thứ hai là miền văn bản:__( 'Translated text string', 'text_domain' );


cảm ơn @redelschaap, cuối cùng, giải pháp của bạn sẽ hoạt động miễn là bạn sử dụng một thư mục khác cho tên miền văn bản gốc từ tên miền bạn sử dụng cho tên miền văn bản con: đó là cách bắt! :)
d79

Bạn có thể tải nhiều tên miền văn bản từ trong chủ đề con của bạn. Nhưng bạn cũng có thể chỉ sử dụng miền văn bản chủ đề gốc cho tất cả các bản dịch, vì các bản dịch được hợp nhất khi tải tệp cho cùng một miền văn bản.
redelschaap

0

Bản cập nhật 2019 cho Wordpress 5.0.1.

  1. Các tập tin KHÔNG được có sên cha hoặc con trong đó. Ví dụ: cung cấp bản dịch tiếng Tây Ban Nha tiếng Mexico nên có các tệp tên con / chủ đề / ngôn ngữ / es_MX.po và /child-theme-name/lacular/es_MX.mo
  2. Các hàm chủ đề con.php nên có đoạn mã sau. Lưu ý rằng tham số đầu tiên của hàm load_child_theme nhiệtdomain () là sên chủ đề PARENT, không phải là con:
function child_theme_slug_setup() {
    load_child_theme_textdomain( 'parent-theme-slug', get_stylesheet_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'child_theme_slug_setup' );
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.