Một trong những cách tốt nhất để ứng dụng tiếp cận nhiều đối tượng hơn là phục vụ cho nhiều ngôn ngữ. Điều này thường có thể chứng minh là một nhiệm vụ khó khăn, nhưng các tính năng quốc tế hóa và bản địa hóa trong CakePHP giúp nó dễ dàng hơn nhiều
Đầu tiên, điều quan trọng là phải hiểu một số thuật ngữ. Quốc tế hóa đề cập đến khả năng của một ứng dụng được bản địa hóa. Thuật ngữ bản địa hóa đề cập đến việc điều chỉnh ứng dụng để đáp ứng các yêu cầu về ngôn ngữ [hoặc văn hóa] cụ thể [i. e. một “địa phương”]. Quốc tế hóa và bản địa hóa thường được viết tắt lần lượt là i18n và l10n;
Tạo trình biên dịch của riêng bạn
Nếu bạn cần khác với các quy ước của CakePHP về vị trí và cách lưu trữ thông báo dịch, bạn có thể tạo trình tải thông báo dịch của riêng mình. Cách dễ nhất để tạo trình dịch của riêng bạn là xác định trình tải cho một miền và ngôn ngữ
use Aura\Intl\Package; I18n::setTranslator['animals', function [] { $package = new Package[ 'default', // The formatting strategy [ICU] 'default' // The fallback domain ]; $package->setMessages[[ 'Dog' => 'Chien', 'Cat' => 'Chat', 'Bird' => 'Oiseau' ... ]]; return $package; }, 'fr_FR'];
Đoạn mã trên có thể được thêm vào config/bootstrap của bạn. php để có thể tìm thấy bản dịch trước khi sử dụng bất kỳ chức năng dịch nào. Yêu cầu tối thiểu tuyệt đối để tạo trình dịch là hàm trình tải phải trả về một đối tượng
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"3. Sau khi có mã, bạn có thể sử dụng các chức năng dịch thuật như bình thường
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"
Như bạn thấy, các đối tượng
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"4 nhận các thông điệp dịch dưới dạng một mảng. Bạn có thể vượt qua phương thức
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"5 theo cách bạn muốn. với mã nội tuyến, bao gồm một tệp khác, gọi một chức năng khác, v.v. CakePHP cung cấp một số chức năng trình tải mà bạn có thể sử dụng lại nếu bạn chỉ cần thay đổi nơi tải thư. Ví dụ, bạn vẫn có thể sử dụng. po, nhưng được tải từ một vị trí khác
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];
Tạo trình phân tích tin nhắn
Có thể tiếp tục sử dụng các quy ước tương tự mà CakePHP sử dụng, nhưng sử dụng trình phân tích cú pháp thông báo khác với
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"6. Ví dụ: nếu bạn muốn tải thông báo dịch bằng cách sử dụng
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"7, trước tiên bạn cần tạo lớp trình phân tích cú pháp
________số 8
Tệp phải được tạo trong thư mục src/I18n/Parser của ứng dụng của bạn. Tiếp theo, tạo tệp bản dịch trong src/Locale/fr_FR/animals. khoai mỡ
Dog: Chien Cat: Chat Bird: Oiseau
Và cuối cùng, định cấu hình trình tải dịch cho miền và ngôn ngữ
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"0
Tạo trình dịch chung
Định cấu hình trình dịch bằng cách gọi
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"8 cho từng miền và ngôn ngữ bạn cần hỗ trợ có thể rất tẻ nhạt, đặc biệt nếu bạn cần hỗ trợ nhiều ngôn ngữ khác nhau. Để tránh vấn đề này, CakePHP cho phép bạn xác định trình tải trình dịch chung cho từng miền
Hãy tưởng tượng rằng bạn muốn tải tất cả các bản dịch cho miền mặc định và cho bất kỳ ngôn ngữ nào từ một dịch vụ bên ngoài
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"2
Ví dụ trên gọi một dịch vụ mẫu bên ngoài để tải tệp JSON có bản dịch và sau đó chỉ cần tạo một đối tượng
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"4 cho bất kỳ ngôn ngữ nào được yêu cầu trong ứng dụng
Nếu bạn muốn thay đổi cách tải các gói cho tất cả các gói không có bộ tải cụ thể, bạn có thể thay thế trình tải gói dự phòng bằng cách sử dụng gói
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];0
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"5
Mới trong phiên bản 3. 4. 0. Thay thế bộ tải
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];0 đã được thêm vào trong 3. 4. 0
Số nhiều và ngữ cảnh trong Trình dịch tùy chỉnh
Các mảng được sử dụng cho
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"5 có thể được tạo để hướng dẫn người dịch lưu trữ thư trong các miền khác nhau hoặc để kích hoạt lựa chọn số nhiều kiểu Gettext. Sau đây là một ví dụ về lưu trữ các bản dịch cho cùng một khóa trong các ngữ cảnh khác nhau
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"8
Tương tự, bạn có thể biểu thị số nhiều kiểu Gettext bằng cách sử dụng mảng thông báo bằng cách có khóa mảng lồng nhau cho mỗi dạng số nhiều
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"9
Sử dụng các trình định dạng khác nhau
Trong các ví dụ trước, chúng ta đã thấy rằng các Gói được tạo bằng cách sử dụng
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];3 làm đối số đầu tiên và nó được chỉ ra bằng một nhận xét rằng nó tương ứng với bộ định dạng sẽ được sử dụng. Trình định dạng là các lớp chịu trách nhiệm nội suy các biến trong thông báo dịch và chọn dạng số nhiều chính xác
Nếu bạn đang xử lý một ứng dụng cũ hoặc bạn không cần sức mạnh được cung cấp bởi định dạng thông báo ICU, CakePHP cũng cung cấp trình định dạng
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];4
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"0
Các thông báo cần dịch sẽ được chuyển đến hàm
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];5 để nội suy các biến
// Prior to 3.5 use I18n::locale[] I18n::setLocale['fr_FR']; __d['animals', 'Dog']; // Returns "Chien"1
Có thể đặt trình định dạng mặc định cho tất cả các trình dịch được tạo bởi CakePHP trước khi chúng được sử dụng lần đầu tiên. Điều này không bao gồm các trình dịch được tạo thủ công bằng phương pháp
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];6 và
use Cake\I18n\MessagesFileLoader as Loader; // Load messages from src/Locale/folder/sub_folder/filename.po // Prior to 3.5 use translator[] I18n::setTranslator[ 'animals', new Loader['filename', 'folder/sub_folder', 'po'], 'fr_FR' ];7