Hướng dẫn i18n states countrycode php - i18n quốc gia mã php

Quốc tế hóa (I18N) đề cập đến quá trình thiết kế một ứng dụng phần mềm để nó có thể được điều chỉnh theo các ngôn ngữ và khu vực khác nhau mà không cần thay đổi kỹ thuật. Đối với các ứng dụng web, điều này có tầm quan trọng đặc biệt vì người dùng tiềm năng có thể trên toàn thế giới. YII cung cấp một phổ đầy đủ các tính năng i18N hỗ trợ dịch tin nhắn, xem dịch, định dạng ngày và số.

Địa phương và ngôn ngữ ¶

Địa phương ¶

Locale là một tập hợp các tham số xác định ngôn ngữ, quốc gia của người dùng và bất kỳ tùy chọn biến thể đặc biệt nào mà người dùng muốn thấy trong giao diện người dùng của họ. Nó thường được xác định bởi một ID bao gồm ID ngôn ngữ và ID vùng.

Ví dụ, ID



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

3 là viết tắt của địa phương của "Tiếng Anh và Hoa Kỳ".

Vì lý do nhất quán, tất cả các ID địa phương được sử dụng trong các ứng dụng YII nên được chuẩn hóa theo định dạng của



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

4, trong đó


/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

5 là một ngôn ngữ viết thường hai hoặc ba chữ cái theo ISO-639 và


/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

6 là mã quốc gia hai chữ cái theo ISO -3166. Thông tin chi tiết về Locale có thể được tìm thấy trong tài liệu của dự án ICU.

Ngôn ngữ ¶

Trong YII, chúng ta thường sử dụng thuật ngữ "ngôn ngữ" để chỉ một địa điểm.

Một ứng dụng YII sử dụng hai loại ngôn ngữ:

  • Ngôn ngữ nguồn: Điều này đề cập đến ngôn ngữ trong đó các tin nhắn văn bản trong mã nguồn được viết.
  • Ngôn ngữ mục tiêu: Đây là ngôn ngữ nên được sử dụng để hiển thị nội dung cho người dùng cuối.

Cái gọi là dịch vụ dịch tin nhắn chủ yếu dịch một tin nhắn văn bản từ ngôn ngữ nguồn sang ngôn ngữ đích.

Cấu hình ¶

Bạn có thể định cấu hình các ngôn ngữ ứng dụng trong "Cấu hình ứng dụng" như sau:

return [
    // set target language to be Russian
    'language' => 'ru-RU',
    
    // set source language to be English
    'sourceLanguage' => 'en-US',
    
    ......
];

Giá trị mặc định cho ngôn ngữ nguồn là



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

3, có nghĩa là tiếng Anh Hoa Kỳ. Bạn nên giữ giá trị mặc định này không thay đổi. Thông thường việc tìm những người có thể dịch từ "tiếng Anh sang các ngôn ngữ khác" dễ dàng hơn nhiều so với "không phải tiếng Anh sang không tiếng Anh".recommended that you keep this default value unchanged. Usually it is much easier to find people who can translate from "English to other languages" than from "non-English to non-English".

Bạn thường cần đặt ngôn ngữ đích một cách linh hoạt dựa trên các yếu tố khác nhau, chẳng hạn như sở thích ngôn ngữ của người dùng cuối. Thay vì định cấu hình nó trong cấu hình ứng dụng, bạn có thể sử dụng câu lệnh sau để thay đổi ngôn ngữ đích:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';

Mẹo: Nếu ngôn ngữ nguồn của bạn thay đổi giữa các phần khác nhau trong mã của bạn, bạn có thể ghi đè ngôn ngữ nguồn cho các nguồn tin nhắn khác nhau, được mô tả trong phần tiếp theo.If your source language varies among different parts of your code, you can override the source language for different message sources, which are described in the next section.

Dịch tin ¶

Từ ngôn ngữ nguồn đến ngôn ngữ đích ¶

Dịch vụ dịch tin nhắn dịch một tin nhắn văn bản từ một ngôn ngữ (thường là ngôn ngữ nguồn) sang ngôn ngữ khác (thường là ngôn ngữ đích).

Nó thực hiện bản dịch bằng cách tìm kiếm thông báo sẽ được dịch trong một nguồn tin nhắn lưu trữ các tin nhắn gốc và các tin nhắn được dịch. Nếu thông báo được tìm thấy, tin nhắn được dịch tương ứng sẽ được trả về; Nếu không, tin nhắn ban đầu sẽ được trả lại chưa được dịch.

Cách thực hiện ¶

Để sử dụng dịch vụ dịch tin nhắn, bạn chủ yếu cần thực hiện công việc sau:

  1. Bao bọc mọi tin nhắn văn bản cần được dịch trong một cuộc gọi đến phương thức yii :: t ().
  2. Định cấu hình một hoặc nhiều nguồn tin nhắn trong đó dịch vụ dịch tin nhắn có thể tìm kiếm các tin nhắn được dịch.
  3. Hãy để các dịch giả dịch tin nhắn và lưu trữ chúng trong (các) nguồn tin nhắn.

1. Bọc một tin nhắn văn bản ¶

Phương pháp yii :: t () có thể được sử dụng như sau,

echo \Yii::t('app', 'This is a string to translate!');

Trong đó tham số thứ hai đề cập đến thông báo văn bản sẽ được dịch, trong khi tham số đầu tiên đề cập đến tên của danh mục được sử dụng để phân loại thông báo.

2. Định cấu hình một hoặc nhiều nguồn tin nhắn ¶

Phương thức YII :: T () sẽ gọi phương thức thành phần ứng dụng



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

8


/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

9 để thực hiện công việc dịch thực tế. Thành phần có thể được cấu hình trong cấu hình ứng dụng như sau,

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],

Trong mã trên, một nguồn tin nhắn được hỗ trợ bởi yii \ i18n \ phpmessagesource đang được cấu hình.

Thể loại Wildcards với biểu tượng
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
0 ¶

Mẫu

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
1 chỉ ra rằng tất cả các danh mục tin nhắn có tên bắt đầu bằng
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
2 nên được dịch bằng nguồn tin nhắn này.

3. Để người dịch dịch tin nhắn và lưu trữ chúng trong (các) nguồn tin nhắn ¶

Lớp Yii \ i18n \ PhpMessagesource sử dụng các tệp PHP với một mảng PHP đơn giản để lưu trữ các bản dịch tin nhắn. Các tệp này chứa một bản đồ của các tin nhắn trong

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
3 cho bản dịch trong
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
4.

Thông tin: Bạn có thể tự động tạo các tệp PHP này bằng cách sử dụng lệnh

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
5, sẽ được giới thiệu sau trong chương này.You can automatically generate these PHP files by using the
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
5 command, which will be introduced later in this chapter.

Mỗi tệp PHP tương ứng với các tin nhắn của một danh mục. Theo mặc định, tên tệp phải giống như tên danh mục. Ví dụ cho

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
6



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

Ánh xạ tệp ¶

Bạn có thể định cấu hình FILEMAP để ánh xạ một danh mục vào tệp PHP với cách tiếp cận đặt tên khác.

Trong ví dụ trên, danh mục

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
7 được ánh xạ vào tệp PHP
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
8 (giả sử
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
9 là ngôn ngữ đích). Tuy nhiên, nếu không có cấu hình này, danh mục sẽ được ánh xạ tới
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
0.

Các loại lưu trữ khác ¶

Ngoài ra, lưu trữ các tin nhắn trong các tệp PHP, bạn cũng có thể sử dụng các nguồn tin nhắn sau để lưu trữ các tin nhắn được dịch trong các lưu trữ khác nhau:

  • yii \ i18n \ getTextMessageSource sử dụng các tệp GNU getText Mo hoặc PO để duy trì các tin nhắn được dịch.
  • yii \ i18n \ dbmessagesource sử dụng bảng cơ sở dữ liệu để lưu trữ các tin nhắn được dịch.

Định dạng tin nhắn ¶

Khi dịch một thông báo, bạn có thể nhúng một số người giữ chỗ và thay thế chúng bằng các giá trị tham số động. Bạn thậm chí có thể sử dụng cú pháp giữ chỗ đặc biệt để có các giá trị tham số được định dạng theo ngôn ngữ đích. Trong tiểu mục này, chúng tôi sẽ mô tả các cách khác nhau để định dạng tin nhắn.

Thông số thông báo ¶

Trong một thông báo được dịch, bạn có thể nhúng một hoặc nhiều tham số (còn được gọi là giữ chỗ) để chúng có thể được thay thế bằng các giá trị đã cho. Bằng cách đưa ra các bộ giá trị khác nhau, bạn có thể thay đổi thông báo được dịch một cách linh hoạt. Trong ví dụ sau, trình giữ chỗ

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
1 trong tin nhắn
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
2 sẽ được thay thế bằng
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
3 và
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
4, tương ứng.

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

Trong khi dịch một thông điệp có chứa chỗ giữ chỗ, bạn nên để lại chỗ giữ chỗ. Điều này là do các trình giữ chỗ sẽ được thay thế bằng các giá trị thực tế khi bạn gọi

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
5 để dịch một tin nhắn.

Bạn có thể sử dụng trình giữ chỗ được đặt tên hoặc giữ chỗ vị trí, nhưng không phải cả hai, trong một tin nhắn.

Ví dụ trước đây cho thấy cách bạn có thể sử dụng trình giữ chỗ được đặt tên. Đó là, mỗi trình giữ chỗ được viết theo định dạng

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
6 và bạn cung cấp một mảng kết hợp có các phím là tên giữ chỗ (không có dấu ngoặc xoăn) và có giá trị là giá trị của giá trị tương ứng được thay thế bằng.

Các vị trí vị trí sử dụng trình tự số nguyên dựa trên 0 làm tên được thay thế bằng các giá trị được cung cấp theo vị trí của chúng trong cuộc gọi của

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
5. Trong ví dụ sau, các vị trí vị trí
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
8,
$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
9 và
echo \Yii::t('app', 'Price: {0}', $price);
0 sẽ được thay thế bằng các giá trị của
echo \Yii::t('app', 'Price: {0}', $price);
1,
echo \Yii::t('app', 'Price: {0}', $price);
2 và
echo \Yii::t('app', 'Price: {0}', $price);
3, tương ứng.

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);

Trong trường hợp của một tham số vị trí duy nhất, giá trị của nó có thể được chỉ định mà không cần bọc nó vào mảng:

echo \Yii::t('app', 'Price: {0}', $price);

MIPO: Trong hầu hết các trường hợp, bạn nên sử dụng trình giữ chỗ có tên. Điều này là do các tên sẽ làm cho các dịch giả hiểu rõ hơn toàn bộ tin nhắn được dịch.In most cases you should use named placeholders. This is because the names will make the translators understand better the whole messages being translated.

Định dạng tham số ¶

Bạn có thể chỉ định các quy tắc định dạng bổ sung trong trình giữ chỗ của một thông báo để các giá trị tham số có thể được định dạng đúng trước khi họ thay thế các giữ chỗ. Trong ví dụ sau, giá trị tham số giá sẽ được coi là một số và được định dạng là giá trị tiền tệ:

________số 8

Lưu ý: Định dạng tham số yêu cầu cài đặt tiện ích mở rộng INTL PHP.Parameter formatting requires the installation of the intl PHP extension.

Bạn có thể sử dụng biểu mẫu ngắn hoặc biểu mẫu đầy đủ để chỉ định trình giữ chỗ với định dạng:

short form: {name,type}
full form: {name,type,style}

Lưu ý: Nếu bạn cần sử dụng các ký tự đặc biệt như

echo \Yii::t('app', 'Price: {0}', $price);
4,
echo \Yii::t('app', 'Price: {0}', $price);
5,
echo \Yii::t('app', 'Price: {0}', $price);
6,
echo \Yii::t('app', 'Price: {0}', $price);
7, hãy bọc chúng trong
echo \Yii::t('app', 'Price: {0}', $price);
6:
If you need to use special characters such as
echo \Yii::t('app', 'Price: {0}', $price);
4,
echo \Yii::t('app', 'Price: {0}', $price);
5,
echo \Yii::t('app', 'Price: {0}', $price);
6,
echo \Yii::t('app', 'Price: {0}', $price);
7, wrap them in
echo \Yii::t('app', 'Price: {0}', $price);
6:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
0

Định dạng hoàn chỉnh được mô tả trong tài liệu ICU. Trong phần sau, chúng tôi sẽ hiển thị một số cách sử dụng phổ biến.

Con số ¶

Giá trị tham số được coi là một số. Ví dụ,

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
1

Bạn có thể chỉ định kiểu tham số tùy chọn là

echo \Yii::t('app', 'Price: {0}', $price);
9,
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
0 hoặc
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
1:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
2

Bạn cũng có thể chỉ định một mẫu tùy chỉnh để định dạng số. Ví dụ,

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
3

Các ký tự được sử dụng trong định dạng tùy chỉnh có thể được tìm thấy trong tham chiếu API ICU trong phần "ký tự mẫu đặc biệt".

Giá trị luôn được định dạng theo địa phương bạn đang dịch sang tức là bạn không thể thay đổi số phân tử hoặc hàng ngàn dấu phân cách, ký hiệu tiền tệ, v.v. mà không thay đổi địa phương dịch. Nếu bạn cần tùy chỉnh những thứ này, bạn có thể sử dụng yii \ i18n \ formatter :: asdecimal () và yii \ i18n \ formatter :: ascurrency ().

Ngày ¶

Giá trị tham số nên được định dạng là một ngày. Ví dụ,

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
4

Bạn có thể chỉ định kiểu tham số tùy chọn là

$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
2,
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
3,
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
4 hoặc
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
5:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
5

Bạn cũng có thể chỉ định một mẫu tùy chỉnh để định dạng giá trị ngày:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
6

Định dạng tài liệu tham khảo.

Thời gian ¶

Giá trị tham số nên được định dạng theo thời gian. Ví dụ,

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
7

Bạn có thể chỉ định kiểu tham số tùy chọn là

$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
2,
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
3,
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
4 hoặc
$price = 100;
echo \Yii::t('app', 'Price: {0,number,currency}', $price);
5:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
8

Bạn cũng có thể chỉ định một mẫu tùy chỉnh để định dạng giá trị thời gian:

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
9

Định dạng tài liệu tham khảo.

Đánh vần ra đi ¶

Giá trị tham số nên được coi là một số và được định dạng là một phép thuật. Ví dụ,

echo \Yii::t('app', 'This is a string to translate!');
0

Theo mặc định, số được đánh vần là Hồng y. Nó có thể được thay đổi:

echo \Yii::t('app', 'This is a string to translate!');
1

Lưu ý rằng không nên có khoảng trống sau

short form: {name,type}
full form: {name,type,style}
0 và trước
short form: {name,type}
full form: {name,type,style}
1.

Để có được một danh sách các tùy chọn có sẵn cho Locale, bạn đang sử dụng kiểm tra "Đánh số các lược đồ, Spellout" tại https://intl.rmcreative.ru/.

Thứ tự

Giá trị tham số nên được coi là một số và được định dạng là một tên thứ tự. Ví dụ,

echo \Yii::t('app', 'This is a string to translate!');
2

Thứ tự hỗ trợ nhiều cách định dạng cho các ngôn ngữ như tiếng Tây Ban Nha:

echo \Yii::t('app', 'This is a string to translate!');
3

Lưu ý rằng không nên có khoảng trống sau

short form: {name,type}
full form: {name,type,style}
2 và trước
short form: {name,type}
full form: {name,type,style}
1.

Để có được một danh sách các tùy chọn có sẵn cho Locale, bạn đang sử dụng kiểm tra "SỐ TIỀN SCHEMA, CREDINA" tại https://intl.rmcreative.ru/.

Khoảng thời gian ¶

Giá trị tham số nên được coi là số giây và được định dạng dưới dạng chuỗi thời lượng. Ví dụ,

echo \Yii::t('app', 'This is a string to translate!');
4

Thời lượng hỗ trợ nhiều cách định dạng hơn:

echo \Yii::t('app', 'This is a string to translate!');
5

Lưu ý rằng không nên có khoảng trống sau

short form: {name,type}
full form: {name,type,style}
4 và trước
short form: {name,type}
full form: {name,type,style}
1.

Để có được một danh sách các tùy chọn có sẵn cho Locale, bạn đang sử dụng kiểm tra "Suy định số, thời lượng" tại https://intl.rmcreative.ru/.

Số nhiều ¶

Các ngôn ngữ khác nhau có những cách khác nhau để tạo ra số nhiều. YII cung cấp một cách thuận tiện để dịch các thông điệp ở các dạng số nhiều khác nhau hoạt động tốt ngay cả đối với các quy tắc rất phức tạp. Thay vì xử lý trực tiếp các quy tắc thay đổi, nó chỉ đủ để cung cấp dịch thuật các từ bị thổi phồng trong một số tình huống nhất định. Ví dụ,

echo \Yii::t('app', 'This is a string to translate!');
6

Trong các đối số quy tắc số nhiều ở trên,

short form: {name,type}
full form: {name,type,style}
6 có nghĩa là giá trị rõ ràng. Vì vậy,
short form: {name,type}
full form: {name,type,style}
7 có nghĩa là chính xác bằng không,
short form: {name,type}
full form: {name,type,style}
8 có nghĩa là chính xác một.
short form: {name,type}
full form: {name,type,style}
9 là viết tắt của bất kỳ giá trị nào khác.
echo \Yii::t('app', 'Price: {0}', $price);
7 được thay thế bằng giá trị của
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
01 được định dạng theo ngôn ngữ đích.

Các hình thức số nhiều có thể rất phức tạp trong một số ngôn ngữ. Trong ví dụ sau đây của Nga,

short form: {name,type}
full form: {name,type,style}
8 khớp chính xác ____10103 trong khi
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
04 khớp với
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
05 hoặc
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
06:

echo \Yii::t('app', 'This is a string to translate!');
7

Những

short form: {name,type}
full form: {name,type,style}
9,
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
08,
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
09 và các tên đối số đặc biệt khác khác nhau tùy thuộc vào ngôn ngữ. Để tìm hiểu những cái nào bạn nên chỉ định cho một địa điểm cụ thể, vui lòng tham khảo "Quy tắc số nhiều, Hồng y" tại https://intl.rmcreative.ru/. Ngoài ra, bạn có thể tham khảo các quy tắc tham chiếu tại unicode.org.

Lưu ý: Ví dụ trên Thông điệp Nga chủ yếu được sử dụng làm thông điệp được dịch, không phải là một thông báo gốc, trừ khi bạn đặt ngôn ngữ nguồn của ứng dụng của mình là

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
9 và dịch từ tiếng Nga.The above example Russian message is mainly used as a translated message, not an original message, unless you set the source language of your application as
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
9 and translating from Russian.

Khi một bản dịch không được tìm thấy cho một thông báo gốc được chỉ định trong cuộc gọi

$price = 100;
$count = 2;
$subtotal = 200;
echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
5, các quy tắc số nhiều cho ngôn ngữ nguồn sẽ được áp dụng cho thông báo gốc.

Có tham số

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
12 cho các trường hợp khi chuỗi giống như sau:

echo \Yii::t('app', 'This is a string to translate!');
8

Lựa chọn thứ tự ¶

Loại tham số của

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
13 có nghĩa là chọn một chuỗi dựa trên các quy tắc ngôn ngữ cho các quy tắc cho địa phương bạn đang dịch sang:

echo \Yii::t('app', 'This is a string to translate!');
9

Định dạng này rất gần với những gì được sử dụng cho số nhiều. Để tìm hiểu những đối số nào bạn nên chỉ định cho một địa điểm cụ thể, vui lòng tham khảo "Quy tắc số nhiều, thứ tự" tại https://intl.rmcreative.ru/. Ngoài ra, bạn có thể tham khảo các quy tắc tham chiếu tại unicode.org.

Lựa chọn

Bạn có thể sử dụng loại tham số

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
14 để chọn một cụm từ dựa trên giá trị tham số. Ví dụ,

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
0

Trong biểu thức ở trên, cả

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
15 và
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
16 đều là các giá trị tham số có thể, trong khi
short form: {name,type}
full form: {name,type,style}
9 xử lý các giá trị không khớp với một trong số chúng. Theo từng giá trị tham số có thể, bạn nên chỉ định một cụm từ và đặt nó trong một cặp dấu ngoặc xoăn.

Chỉ định nguồn tin nhắn mặc định ¶

Bạn có thể chỉ định nguồn thông báo mặc định sẽ được sử dụng như một dự phòng cho danh mục không khớp với bất kỳ danh mục được định cấu hình nào. Bạn có thể làm điều đó bằng cách định cấu hình một loại ký tự đại diện

$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
0. Để làm điều đó, hãy thêm phần sau vào cấu hình ứng dụng:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
1

Bây giờ bạn có thể sử dụng các danh mục mà không cần định cấu hình từng loại, tương tự như hành vi YII 1.1. Tin nhắn cho danh mục sẽ được tải từ một tệp trong bản dịch mặc định

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
19 đó là
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
20:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
2

Thông báo sẽ được tải từ

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
21.

Dịch các tin nhắn mô -đun ¶

Nếu bạn muốn dịch các tin nhắn cho một mô -đun và tránh sử dụng một tệp dịch cho tất cả các tin nhắn, bạn có thể làm như sau:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
3

Trong ví dụ trên, chúng tôi đang sử dụng ký tự đại diện để khớp và sau đó lọc từng danh mục cho mỗi tệp cần. Thay vì sử dụng

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
22, bạn chỉ cần sử dụng quy ước của ánh xạ danh mục vào cùng một tệp được đặt tên. Bây giờ bạn có thể sử dụng trực tiếp
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
23 hoặc
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
24.

Dịch tin nhắn tiện ích ¶

Quy tắc tương tự như được áp dụng cho các mô -đun trên cũng có thể được áp dụng cho các tiện ích, ví dụ:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
4

Thay vì sử dụng

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
22, bạn chỉ cần sử dụng quy ước của ánh xạ danh mục vào cùng một tệp được đặt tên. Bây giờ bạn có thể sử dụng
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
26 trực tiếp.

Lưu ý: Đối với các tiện ích, bạn cũng có thể sử dụng các chế độ xem i18N, với các quy tắc tương tự như đối với các bộ điều khiển được áp dụng cho chúng.For widgets you also can use i18n views, with the same rules as for controllers being applied to them too.

Dịch các tin nhắn khung ¶

YII đi kèm với các thông báo dịch mặc định cho các lỗi xác thực và một số chuỗi khác. Những thông điệp này đều nằm trong danh mục

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
27. Đôi khi bạn muốn sửa bản dịch tin nhắn khung mặc định cho ứng dụng của mình. Để làm như vậy, định cấu hình thành phần ứng dụng


/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

8 như sau:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
5

Bây giờ bạn có thể đặt các bản dịch được điều chỉnh của bạn lên

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
29.

Xử lý các bản dịch bị thiếu ¶

Ngay cả khi bản dịch bị thiếu từ nguồn, YII sẽ hiển thị nội dung tin nhắn được yêu cầu. Hành vi như vậy rất thuận tiện trong trường hợp tin nhắn thô của bạn là một văn bản dài dòng hợp lệ. Tuy nhiên, đôi khi nó không đủ. Bạn có thể cần thực hiện một số xử lý tùy chỉnh của tình huống, khi bản dịch được yêu cầu bị thiếu từ nguồn. Điều này có thể đạt được bằng cách sử dụng sự kiện thiếu sót của yii \ i18n \ messageource.

Ví dụ: bạn có thể muốn đánh dấu tất cả các bản dịch còn thiếu với một cái gì đó đáng chú ý, để chúng có thể dễ dàng tìm thấy tại trang. Đầu tiên bạn cần thiết lập một trình xử lý sự kiện. Điều này có thể được thực hiện trong cấu hình ứng dụng:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
6

Bây giờ bạn cần thực hiện xử lý sự kiện của riêng mình:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
7

Nếu yii \ i18n \ thiếutranslationevent :: $ dịch được đặt bởi trình xử lý sự kiện, nó sẽ được hiển thị như kết quả dịch.

Lưu ý: Mỗi nguồn tin nhắn xử lý các bản dịch bị thiếu của nó một cách riêng biệt. Nếu bạn đang sử dụng một số nguồn tin nhắn và muốn họ xử lý các bản dịch còn thiếu theo cùng một cách, bạn nên chỉ định trình xử lý sự kiện tương ứng cho từng bản chúng.each message source handles its missing translations separately. If you are using several message sources and wish them to treat the missing translations in the same way, you should assign the corresponding event handler to each of them.

Sử dụng lệnh $username = 'Alexander'; // display a translated message with username being "Alexander" echo \Yii::t('app', 'Hello, {username}!', [ 'username' => $username, ]); $username = 'Qiang'; // display a translated message with username being "Qiang" echo \Yii::t('app', 'Hello, {username}!', [ 'username' => $username, ]); 5

Các bản dịch có thể được lưu trữ trong các tệp PHP, các tệp .po hoặc trong cơ sở dữ liệu. Xem các lớp cụ thể để biết các tùy chọn bổ sung.

Đầu tiên bạn cần tạo một tệp cấu hình. Quyết định nơi bạn muốn lưu trữ nó và sau đó ban hành lệnh

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
8

Mở tệp đã tạo và điều chỉnh các tham số để phù hợp với nhu cầu của bạn. Đặc biệt chú ý đến:

  • // change target language to Chinese
    \Yii::$app->language = 'zh-CN';
    
    31: Một mảng đại diện cho ngôn ngữ mà ứng dụng của bạn nên được dịch thành;
  • // change target language to Chinese
    \Yii::$app->language = 'zh-CN';
    
    32: Đường dẫn lưu trữ các tệp tin nhắn, sẽ khớp với tham số
    // change target language to Chinese
    \Yii::$app->language = 'zh-CN';
    
    19 của ____ 48 được nêu trong cấu hình.

Bạn cũng có thể sử dụng lệnh '. Ví dụ: bạn có thể đặt các tham số

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
31 và
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
32 như sau:

'components' => [
    // ...
    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
],
9

Để nhận danh sách các tùy chọn có sẵn thực thi lệnh tiếp theo:



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

0

Khi bạn đã hoàn tất với tệp cấu hình, cuối cùng bạn cũng có thể trích xuất tin nhắn của mình bằng lệnh:



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

1

Ngoài ra, bạn có thể sử dụng các tùy chọn để thay đổi linh hoạt các tham số để trích xuất.

Sau đó, bạn sẽ tìm thấy các tệp của mình (nếu bạn đã chọn các bản dịch dựa trên tệp) trong thư mục

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
32 của bạn.

Xem bản dịch ¶

Thay vì dịch các tin nhắn văn bản riêng lẻ, đôi khi bạn có thể muốn dịch toàn bộ tập lệnh xem. Để đạt được mục tiêu này, chỉ cần dịch chế độ xem và lưu nó theo một thư mục con có tên giống như ngôn ngữ đích. Ví dụ: nếu bạn muốn dịch tập lệnh xem

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
38 và ngôn ngữ đích là
$username = 'Alexander';
// display a translated message with username being "Alexander"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);

$username = 'Qiang';
// display a translated message with username being "Qiang"
echo \Yii::t('app', 'Hello, {username}!', [
    'username' => $username,
]);
9, bạn có thể dịch chế độ xem và lưu nó dưới dạng tệp
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
40. Bây giờ bất cứ khi nào bạn gọi yii \ base \ view :: renderfile () hoặc bất kỳ phương thức nào gọi phương thức này (ví dụ: yii \ base \ điều khiển :: render ()) để hiển thị chế độ xem
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
38, nó sẽ kết thúc chế độ xem được dịch
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
40, thay vì.

Lưu ý: Nếu ngôn ngữ đích giống như chế độ xem gốc ngôn ngữ nguồn sẽ được hiển thị bất kể sự hiện diện của chế độ xem được dịch.If the target language is the same as source language original view will be rendered regardless of presence of translated view.

Ngày định dạng và giá trị số ¶

Xem phần Định dạng dữ liệu để biết chi tiết.

Thiết lập môi trường PHP ¶

YII sử dụng tiện ích mở rộng PHP Intl để cung cấp hầu hết các tính năng i18n của nó, chẳng hạn như định dạng ngày và số của lớp Yii \ i18n \ Formatter và định dạng tin nhắn bằng cách sử dụng Yii \ i18n \ MessageFormatter. Cả hai lớp cung cấp một cơ chế dự phòng khi phần mở rộng

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
43 không được cài đặt. Tuy nhiên, việc triển khai dự phòng chỉ hoạt động tốt cho ngôn ngữ mục tiêu tiếng Anh. Vì vậy, rất khuyến khích bạn cài đặt
// change target language to Chinese
\Yii::$app->language = 'zh-CN';
43 khi cần I18N.

Tiện ích mở rộng PHP INTL dựa trên thư viện ICU cung cấp các quy tắc kiến ​​thức và định dạng cho tất cả các địa phương khác nhau. Các phiên bản khác nhau của ICU có thể tạo ra kết quả định dạng khác nhau của các giá trị ngày và số. Để đảm bảo trang web của bạn tạo ra kết quả tương tự trên tất cả các môi trường, bạn nên cài đặt cùng một phiên bản của tiện ích mở rộng

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
43 (và do đó cùng một phiên bản ICU) trong tất cả các môi trường.

Để tìm ra phiên bản ICU nào được sử dụng bởi PHP, bạn có thể chạy tập lệnh sau, sẽ cung cấp cho bạn phiên bản PHP và ICU đang được sử dụng.



/**
* Translation map for nl-NL
*/
return [
    'welcome' => 'welkom'
];

2

Bạn cũng nên sử dụng phiên bản ICU bằng hoặc lớn hơn phiên bản 49. Điều này sẽ đảm bảo bạn có thể sử dụng tất cả các tính năng được mô tả trong tài liệu này.Ví dụ: phiên bản ICU dưới 49 không hỗ trợ sử dụng các trình giữ chỗ

echo \Yii::t('app', 'Price: {0}', $price);
7 trong các quy tắc số nhiều.Vui lòng tham khảo https://icu.unicode.org/doad để biết danh sách đầy đủ các phiên bản ICU có sẵn.Lưu ý rằng việc đánh số phiên bản đã thay đổi sau khi phát hành 4.8 (ví dụ: ICU 4.8, ICU 49, ICU 50, v.v.)

Ngoài ra, thông tin trong cơ sở dữ liệu múi giờ được vận chuyển với thư viện ICU có thể bị lỗi thời.Vui lòng tham khảo Hướng dẫn sử dụng ICU để biết chi tiết về việc cập nhật cơ sở dữ liệu múi giờ.Mặc dù đối với định dạng đầu ra, cơ sở dữ liệu Timezone ICU được sử dụng, cơ sở dữ liệu múi giờ được sử dụng bởi PHP cũng có thể có liên quan.Bạn có thể cập nhật nó bằng cách cài đặt phiên bản mới nhất của gói PECL

// change target language to Chinese
\Yii::$app->language = 'zh-CN';
47.