TL; DR
Nếu bạn không quan tâm đến các chi tiết về cách dịch hoạt động, hãy bỏ qua nội dung đến phần
Kiểm tra xem bản dịch của bạn không hoạt động bên dưới, đặc biệt là phần phụ
Giải pháp cho Xung đột dịch thuật Mô-đun .
Tổng quan về dịch thuật Magento
Magento ưu tiên các nguồn dịch (từ cao nhất đến thấp nhất):
- DB (
core_translate
bảng)
- Chủ đề
translate.csv
tập tin
- Các
app/locale/*/*.csv
tập tin
Làm thế nào là mảng dịch được xây dựng?
Dịch thuật mô-đun
Đầu tiên tất cả các tệp từ app/locale/*/*.csv
đó được tham chiếu từ các etc/config.xml
tệp mô-đun hoạt động được phân tích cú pháp. Đây là hướng dẫn của quy trình:
Giả sử Magento tìm thấy phần sau config.xml
:
<!-- excerpt from Mage/Catalog/etc/config.xml -->
<frontend>
<translate>
<modules>
<Mage_Catalog>
<files>
<default>Mage_Catalog.csv</default>
</files>
</Mage_Catalog>
</modules>
</translate>
</frontend>
Và trong tệp đó, bản dịch sau được chỉ định cho ngôn ngữ được định cấu hình cho chế độ xem cửa hàng hiện tại:
"AAA","BBB"
Trong các trường hợp này, Magento tạo các bản ghi sau trong mảng dịch:
array(
"AAA" => "BBB",
"Mage_Catalog::AAA" => "BBB"
)
Giá trị thứ hai là Dịch thuật Phạm vi Mô-đun . Tên mô-đun tiền tố được lấy từ nút XML cấu hình có chứa khai báo tệp dịch.
Nếu bản dịch tương tự được quy định một lần nữa bằng một tập tin mô-đun thứ hai , ví dụ như trong Some_Module.csv
bản dịch "AAA","CCC"
, nó sẽ không ghi đè lên các "AAA"
thiết lập. Thay vào đó, nó sẽ chỉ thêm một bản ghi mới với tên mô-đun thứ hai "Some_Module::AAA" => "CCC"
.
Nếu chế độ nhà phát triển được kích hoạt, nó thậm chí sẽ bỏ đặt các"AAA"
kỷ lục nếu nó tìm thấy một kỷ lục thứ hai với cùng một chìa khóa trong một dịch module. Điều này giúp dễ dàng phát hiện xung đột dịch mô-đun trong quá trình phát triển.
Dịch chủ đề
Thứ hai, các bản dịch được tải từ translate.csv
tệp đầu tiên trong dự phòng chủ đề cho ngôn ngữ hiện tại chỉ đơn giản là thay thế các bản ghi hiện có trong mảng dịch.
Vì vậy, tiếp tục ví dụ trước, một translate.csv
bản ghi "AAA","DDD"
sẽ dẫn đến dữ liệu dịch sau:
array(
"AAA" => "DDD", // This is overwritten by the translate.csv file
"Mage_Catalog::AAA" => "BBB",
"Some_Module::AAA" => "CCC"
)
Tất nhiên các bản ghi trong các translate.csv
khóa dịch mới chỉ đơn giản được thêm vào mảng.
Dịch thuật cơ sở dữ liệu
Các bản dịch từ core_translate
bảng về cơ bản được hợp nhất vào mảng dịch giống như các bản dịch chủ đề.
Các khóa hiện có từ mô-đun hoặc bản dịch chủ đề được ghi đè bằng các bản ghi cơ sở dữ liệu, các khóa mới được thêm vào.
Tra cứu dịch thuật
Khi __()
phương thức được gọi, trước tiên Magento tìm một bản dịch trong mảng khớp với mô-đun hiện tại.
Mô-đun hiện tại được xác định bởi tên lớp mà __()
lớp được gọi. Ví dụ, trong các khối, phương thức chịu trách nhiệm trông như thế này:
// Excerpt from Mage/Core/Block/Abstract.php
public function getModuleName()
{
$module = $this->getData('module_name');
if (is_null($module)) {
$class = get_class($this);
$module = substr($class, 0, strpos($class, '_Block'));
$this->setData('module_name', $module);
}
return $module;
}
Các phương thức trong Bộ trợ giúp và Bộ điều khiển hoạt động tương ứng.
Kịch bản tra cứu ví dụ
Ví dụ, giả sử $this->__('AAA')
được gọi trong tệp mẫu. Nếu khối liên kết có loại Mage_Core_Block_Template
, trước tiên Magento sẽ kiểm tra Mage_Core::AAA
bản ghi. Nếu nó không tìm thấy nó, nó sẽ quay trở lại bản dịch cho khóa AAA
.
Trong kịch bản ví dụ, điều này sẽ dẫn đến việc dịch DDD
(từ translate.csv
tệp).
Trong một kịch bản khác, khối liên quan có thể là Mage_Catalog_Block_Product_View
. Trong trường hợp này, Magento trước tiên sẽ kiểm tra bản ghi dịch Mage_Catalog::AAA
và sẽ tìm bản dịch AAA
.
Vì vậy, trong thực tế, các bản dịch phạm vi mô-đun có mức độ ưu tiên cao hơn bất kỳ bản dịch chung nào . Dịch thuật nào được sử dụng phụ thuộc vào mô-đun mà lớp gọi từ __()
phương thức.
Kiểm tra xem bản dịch của bạn không hoạt động
Nếu bản dịch của bạn từ một translate.csv
tệp không được sử dụng, hãy làm theo danh sách kiểm tra này:
- Bộ đệm dịch có bị tắt / làm mới không? (Giải pháp: xóa bộ nhớ cache)
- Là
translate.csv
tập tin thực sự trong dự phòng chủ đề cho các cửa hàng hiện tại? (Giải pháp: sửa cấu hình chủ đề)
- Có một bản ghi mâu thuẫn cho bản dịch trong
core_translate
bảng không? (Giải pháp: xóa bản ghi xung đột khỏi core_translate
)
- Nếu tất cả các điểm trước đó không phải là nguyên nhân, thì phải có một bản dịch mâu thuẫn từ một mô-đun khác. (Giải pháp: xem bên dưới)
Giải pháp cho xung đột dịch thuật mô-đun
Nếu bạn tìm thấy những trường hợp cuối cùng là đúng, chỉ cần thêm bản dịch một lần thứ hai để bạn translate.csv
có phạm vi mô-đun của module làm bản dịch.
Trong ví dụ, nếu bạn luôn muốn AAA
được dịch là DDD
thông qua bản dịch chủ đề, bạn có thể thực hiện việc này trong translate.csv
:
"AAA","DDD"
"Mage_Catalog::AAA","DDD"
"Some_Module::AAA","DDD"
Trong thực tế, tôi chỉ thêm phạm vi mô-đun vào bản dịch nếu có xung đột, nghĩa là, nếu bản dịch không hoạt động.
Ghi chú bổ sung
Dịch nội tuyến
Tính năng dịch nội tuyến của Magento cũng thêm các bản dịch tùy chỉnh vào core_translate
bảng bằng cách sử dụng tiền tố phạm vi mô-đun.
Khả năng tương thích ngược
Mức độ ưu tiên của các bản dịch chủ đề được sử dụng cao hơn sau đó cơ sở dữ liệu dịch lên phiên bản Magento 1.3 trở lên.
Dịch thuật XML
Magento đôi khi đánh giá translate=""
lập luận trong config.xml
, system.xml
và bố trí XML để dịch các giá trị nút con.
Một lớp trình trợ giúp có thể được chỉ định trong các trường hợp đó bằng cách sử dụng module=""
đối số để chỉ định mô-đun cho phạm vi dịch.
Nếu không có module
đối số nào được chỉ định trong XML, trình core/data
trợ giúp được sử dụng để dịch các giá trị nút con.
Thêm thông tin
Tôi thú nhận rằng tôi đã trình bày một số chi tiết về quy trình dịch thuật Magento trong bài viết này, nhưng chỉ vì tôi không muốn có quá nhiều thông tin.
- Một số chi tiết kỹ thuật trong khi mảng dịch được xây dựng
- Khả năng sử dụng các tệp dịch bổ sung cho các mô-đun
- Lưu trữ phạm vi xem
core_translate
hồ sơ
- Ưu và nhược điểm sử dụng các phương pháp dịch thuật khác nhau
Vui lòng hỏi một câu hỏi riêng nếu cần thêm thông tin.