HTML bên trong chuỗi dịch ngôn ngữ __ () hoặc _e ()


24

Cách tiếp cận phù hợp để xây dựng chuỗi dịch thuật là gì?

Ví dụ,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Bạn có thể thêm các chuỗi và / hoặc HTML hay không hoặc nên thực hiện trước và sau đó chạy qua bản dịch như:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Câu trả lời:


41

Có một đối số thứ hai trong __()hàm. Nó nên được đặt thành tên miền bạn đang sử dụng cho plugin hoặc chủ đề của bạn. Trong các ví dụ dưới đây tôi sử dụng 'text_domain'. Chuỗi tên miền của bạn phải là duy nhất. Nó không nên phù hợp với bất kỳ chuỗi tên miền khác. Không sử dụng đối số miền văn bản mặc định cho 'default'tên miền WordPress. Xem các liên kết để biết thêm chi tiết.

Luôn sử dụng chuỗi ( 'text_domain'). Không bao giờ sử dụng một biến, hàm hoặc hằng với chuỗi trong đó. Hầu hết (tất cả?) Các chương trình dịch thuật sẽ không thấy nó nếu không có chuỗi ở đó.

Ma cua ban:

echo __( 'Hello ' . $first . ' you own me money.' );

Không bao gồm các biến trong chuỗi.

Một cách tốt hơn:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Hoặc chỉ:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Trình %sgiữ chỗ nói với người dịch rằng một chuỗi đang đi vào đó. Sử dụng %dcho số. Ngoài ra còn có giữ chỗ khác .

(Câu này là tiếng Anh sai ngữ pháp. Sử dụng một trong hai 'Hello %s, you owe me money.'hoặc 'Hello %s, you own my money.'tùy thuộc vào ý nghĩa bạn đang có ý định.)


Ma cua ban:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Đừng dịch HTML. Nó là như nhau trong bất kỳ ngôn ngữ.

Một cách tốt hơn:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Hoặc chia nó thành nhiều dòng:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Nếu không rõ Topbottom là gì thì bạn có thể sử dụng _x()để giải thích bối cảnh của các điều khoản này.


Bạn có thể tìm thấy các trường hợp dịch thuật khác tại đây: Quốc tế hóa: Có thể bạn đang làm sai


Bạn nói đừng dịch HTML. Tôi có thể chỉ ra rằng nó không được dịch, nó đang được tra cứu trong một bảng hiện có của các chuỗi được dịch trước. Có HTML trong chuỗi không tạo ra sự khác biệt với điều kiện người dịch không xóa chúng. Trong thực tế, trong một số trường hợp, nó làm cho hiệu suất tốt hơn so với tìm kiếm và thay thế regex.
Hai mươi

Không liên quan, nhưng lưu ý: textdomainphải là một chuỗi ký tự, nó không thể là một biến / hằng / thuộc tính.
brasofilo

@brasofilo, lời khuyên đó được viết trong câu trả lời gần đầu, nhưng gấu lặp lại. Tôi đã mắc lỗi này trong một số plugin tùy chỉnh mà tôi đã viết cho khách hàng.
Charles Clarkson

+1 cho sprintf(). Đó thực sự là cách để có HTML trong chuỗi có thể dịch.
đạp xe

Tôi không thấy cách sử dụng sprintf()trợ giúp theo bất kỳ cách nào khác hơn là có thể trông gọn gàng hơn. Nếu bạn có một câu với HTML bên trong như Some text with a <strong>strong</strong> word inside.thế nào thì có thể dịch toàn bộ câu và không dịch Some text with a, strongword insideriêng lẻ (điều này không có ý nghĩa gì).
phpheini

4

Tôi sẽ không giải quyết vấn đề về các biến trong chuỗi vì nó đã được nói.

Bạn muốn giữ cho chuỗi của bạn tĩnh, có nghĩa là nội dung sẽ không thay đổi. Bạn cũng muốn tránh HTML không cần thiết.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Ở trên sẽ chiếm hai hàng trong bảng của bạn cho những gì về cơ bản là cùng một văn bản. Chúng có thể được viết lại thành:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Giảm nó thành một hàng duy nhất.

Đôi khi HTML trong văn bản là không thể tránh khỏi. Lấy ví dụ:

__( 'You currently owe <b>%s</b> dollars' );

Vì các ngôn ngữ là ngữ pháp, việc tách văn bản sẽ gây ra vấn đề cho bất cứ ai đang dịch.

Quy tắc của ngón tay cái. Thẻ định dạng văn bản HTML giữa câu là OK. Các câu bắt đầu và kết thúc với HTML chỉ lãng phí không gian.


Trong ví dụ cuối cùng, bạn có thể bọc các thẻ in đậm xung quanh đối số được chèn "<b>$string</b>". Sau đó, bạn có thể sử dụng 'You currently owe %s dollars'. Nhưng nó có thể cần ở lại nếu bạn sử dụng nó với _n()chức năng yêu cầu %dgiữ chỗ.
Charles Clarkson

@CharlesClarkson Cuộc gọi tốt. Có lẽ tôi nên bỏ đi %sđể làm cho nó rõ ràng hơn một chút.
Hai mươi
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.