Điểm trên cú pháp gettext là gì?


9

Cho đến nay tôi đã xử lý một số bản dịch trong Wordpress và cố gắng đọc tài liệu chính thức của gettext nhưng sẽ không hiểu được điều gì có thể đơn giản: sự khác biệt giữa những khởi đầu như __ (, _e (, v.v?) nhiều hơn: những người khác đang ở bên cạnh? Cảm ơn trước!

Frank


Cảm ơn tất cả các bạn cho câu trả lời công phu của bạn! Tôi thực sự đánh giá cao điều này ở đây!
Mạch xiếc

... Có thể một câu hỏi nữa cho vấn đề này: Có thể bỏ mục nhập của miền văn bản không? Tôi ngay lập tức bắt đầu mang nó đến mọi chuỗi tôi muốn dịch nhưng sau đó nhận ra một số ví dụ trong bộ mã Wordpress không chứa nó ...
Circuit Circus

... Được rồi, bây giờ tôi đã xem qua nó trong trang codex này - xin lỗi vì câu hỏi dư thừa này :-)
Circuit Circus

Câu trả lời:


12

__(gạch dưới kép) là chức năng dịch cơ sở. Nó dịch một chuỗi và trả về nó dưới dạng một chuỗi.

_elàm như vậy __, nhưng kết quả ngay lập tức.

_xlà chức năng dịch theo ngữ cảnh. Nó có một tùy chọn thứ hai để cung cấp ngữ cảnh cho những người thực hiện dịch thuật.

_exlà giống như _x, nhưng kết quả của echo.

Ví dụ về việc sử dụng _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Đôi khi cùng một chuỗi có thể khác nhau trong các ngôn ngữ khác. Cung cấp ngữ cảnh cho người dịch có thể giúp họ chọn từ đúng.

Chức năng phím tắt:

  • esc_attr__: Tương đương __nhưng cũng chạy kết quả qua esc_attr.
  • esc_html__: Tương đương __nhưng cũng chạy kết quả qua esc_html.
  • esc_attr_e: Tương đương _enhưng cũng chạy kết quả qua esc_attr.
  • esc_html_e: Tương đương _enhưng cũng chạy kết quả qua esc_html.
  • esc_attr_x: Tương đương _xnhưng cũng chạy kết quả qua esc_attr.
  • esc_html_x: Tương đương _xnhưng cũng chạy kết quả qua esc_html.

_nlà xử lý số nhiều. Thí dụ:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

Trong ví dụ đó, có hai cách để nói số lượng tacos, tùy thuộc vào việc nó có phải là số ít hay không. Việc sử dụng đầu tiên của số $ cho biết _nchức năng sẽ sử dụng phiên bản nào. Việc sử dụng số $ thứ hai xảy ra trong sprintf, để thay thế% d bằng số thực trong chuỗi.

Không có chức năng echo tương đương _n, nhưng có một chức năng được đặt tên _nx. Đó là sự kết hợp của _n_x. Số nhiều và bối cảnh.

_n_nooplà một người đặc biệt Nó được sử dụng để dịch các chuỗi số nhiều, nhưng không thực sự thực hiện dịch ngay lập tức. Điều này rất hữu ích nếu bạn muốn làm cho các chuỗi tập trung nhưng thực sự làm việc ở nơi khác. Các chức năng thực sự làm việc ở nơi khác là translate_nooped_plural.

Thí dụ:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Điều này không được sử dụng nhiều, nhưng có thể có ích cho tổ chức. Ví dụ, nếu bạn đặt tất cả các chuỗi của mình vào một tệp, sau đó tham chiếu chúng ở nơi khác, điều này sẽ không thể thực hiện được _n, bạn cần một cái gì đó giống như _n_noopđể làm điều đó.

_nx_nooplà giống như _n_noop, nhưng cũng có thể có một bối cảnh cho các dịch giả, giống như _x.

Lưu ý rằng bạn có thể đặt tên miền vào lệnh gọi hàm noop hoặc vào lệnh gọi hàm transl_nooped_plural. Bất cứ điều gì có ý nghĩa hơn cho tổ chức của bạn. Nếu cả hai đều có một miền, thì một cuộc gọi được chuyển đến cuộc gọi noop sẽ thắng.

number_format_i18nlà tương đương với PHP tích hợp trong number_format , nhưng nó cho biết thêm trong việc xử lý đối với những thứ như số thập phân và như vậy, mà là khác nhau ở những nơi khác.

date_i18nlà tương đương với PHP tích hợp trong ngày , với tất cả các thích hợp xử lý đó là tốt. Tên tháng, tên ngày, v.v.

Ngoài ra, không bao giờ vi phạm pháp luật . Chỉ là một lời nhắc nhở. :)


Wow, đây thực sự là một lời giải thích tốt về nó! Cảm ơn bạn rất nhiều vì đã giúp đỡ! Bây giờ tôi thấy rõ ràng.
Mạch xiếc

6

__ (), _e () và _x (), _ex ()

__()_e()về cơ bản là cả một trình bao bọc translate()(không sử dụng trực tiếp) và gần như giống nhau.

Sự khác biệt nằm ở chỗ __()trả về chuỗi dịch và _e()lặp lại. Cả hai cần được cung cấp một chuỗi như một tham số bắt buộc và thông thường, mặc dù là tùy chọn, cũng là một tên miền văn bản.

Tương tự, có _x()_ex(), cho phép bạn chỉ định một bối cảnh có thể mô tả nơi chuỗi xuất hiện. Nếu dự án của bạn bao gồm hơn một vài chục chuỗi có thể dịch, sử dụng ngữ cảnh có ý nghĩa rất lớn.

Ngoài ra, lưu ý sự tồn tại của _n()_nx()cho số nhiều.

Ví dụ về sử dụng phổ biến

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Thông số

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Tất cả các tham số nhưng $numberlà chuỗi. Tất cả nhưng $domainđược yêu cầu.

Linh hoạt hơn nữa với các biến và sprintf ()

Nếu chuỗi của bạn sẽ chứa số hoặc từ biến, hãy sử dụng sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Tài nguyên bổ sung

Một số tài nguyên bổ sung cho Ninja I18n WordPress sắp tới:


Ngoài ra, hãy kiểm tra "Bản địa hóa" trong "Khác" trong bộ mã để biết toàn bộ chức năng và giải thích chi tiết.
TheDeadMote


@Johannes Pille: Tôi đã không nhận thấy câu trả lời của bạn cho đến khi tôi đăng bài của mình, tôi có nên xóa bài viết của mình không?
Jeremy Jared

@JeremyJared Không, tại sao? Thông tin thêm không thể là một điều xấu, phải không?! Tôi nghĩ rằng câu trả lời của bạn cũng được suy nghĩ thông qua. +1 từ tôi.
Julian Pille

@TheDeadMedic Đã chỉnh sửa thành "tài nguyên bổ sung".
Julian Pille

3

Tôi không phải là chuyên gia về dịch thuật, nhưng Trang Codex WordPress có tài liệu tốt và giải thích lý do sử dụng từng phiên bản.

Từ các trang codex:

__()

Được sử dụng khi thông điệp được truyền dưới dạng đối số cho hàm khác; _e()được sử dụng để viết tin nhắn trực tiếp vào trang. Chi tiết hơn về hai chức năng này:

__('message')

Tìm kiếm mô-đun bản địa hóa để dịch 'thông điệp' và chuyển bản dịch sang câu lệnh trả về PHP. Nếu không tìm thấy bản dịch cho 'tin nhắn', nó chỉ trả về 'tin nhắn'.

_e('message')

Tìm kiếm mô-đun bản địa hóa để dịch 'thông điệp' và chuyển bản dịch sang câu lệnh echo PHP. Nếu không tìm thấy bản dịch cho 'tin nhắn', nó chỉ lặp lại 'tin nhắn'.

Lưu ý rằng nếu bạn đang quốc tế hóa một Theme hoặc Plugin, bạn nên sử dụng một "Text Domain" .

Khung gettext chăm sóc hầu hết WordPress. Tuy nhiên, có một vài nơi trong bản phân phối WordPress nơi gettext không thể được sử dụng:

  • Tệp README chính của WordPress - đó là tệp HTML tĩnh, không phải tệp PHP, do đó không thể chạy qua các hàm gettext.
  • Một vài thông báo lỗi được tạo ra rất sớm trong chu kỳ tải WordPress, trước khi gettext được tải.

Liên kết đến trang Codex

Thông tin bổ sung về khi gettext không hoạt động

Hy vọng rằng câu trả lời cho câu hỏi của bạn, nếu không cho chúng tôi biết và có thể người khác có thể giúp đỡ hoặc tôi có thể thực hiện một số nghiên cứu thêm.

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.