Joomla Bài học 13: Xây dựng website đa ngôn ngữ (Multilingual) tích hợp sẵn không cần cài thêm bên thứ ba
Chào mừng bạn đến với Joomla Bài học 13. Trong bài học này, chúng ta sẽ đi qua quy trình chuẩn 6 bước để biến một website Joomla đơn ngữ thành hệ thống đa ngôn ngữ hoàn chỉnh (ví dụ: Tiếng Việt vi-VN và Tiếng Anh en-GB), tìm hiểu cơ chế ánh xạ nội dung (Multilingual Associations) và giải phẫu cách Joomla lưu trữ, liên kết các bản dịch ở tầng cơ sở dữ liệu.
1. Kiến trúc Đa ngôn ngữ trong Joomla 5 hoạt động như thế nào?
Khác với cơ chế dịch tự động hay nhồi nhét nhiều ngôn ngữ vào cùng một bản ghi, Joomla tiếp cận theo hướng Độc lập và Ánh xạ (Isolation & Association):
-
Mỗi thực thể có thuộc tính
languageriêng: Mọi Category, Article, Menu Item, Module trong Joomla đều có cộtlanguagetrong database. Giá trị mặc định là*(All - Hiển thị cho tất cả ngôn ngữ) hoặc mã ngôn ngữ cụ thể nhưvi-VN,en-GB. -
Định tuyến theo tiền tố URL (URL Language Code): Khi bật chế độ đa ngôn ngữ, Router của Joomla tự động phân tách đường dẫn theo cấu trúc
[domain.com/vi/tin-tuc](https://domain.com/vi/tin-tuc)và[domain.com/en/news](https://domain.com/en/news). -
Liên kết bản dịch (Associations): Hệ thống cho phép bạn nối Bài viết A (Tiếng Việt) với Bài viết B (Tiếng Anh). Khi người dùng đang đọc Bài viết A và bấm nút đổi sang cờ Tiếng Anh, Joomla sẽ chuyển hướng thẳng sang Bài viết B thay vì đẩy họ về lại Trang chủ.
2. Quy trình 6 bước thiết lập Website Đa ngôn ngữ chuẩn mực
Bước 1: Cài đặt gói ngôn ngữ (Language Packs) và tạo Content Languages
-
Truy cập System Install Languages, tìm và cài đặt gói Vietnamese (
vi-VN). -
Kiểm tra tại System Manage Content Languages: Đảm bảo cả
English (en-GB)vàVietnamese (vi-VN)đều đang ở trạng thái Published (bật dấu tích xanh). Tại đây bạn có thể cấu hình URL Language Code (tiền tố xuất hiện trên URL, ví dụ:vivàen).
Bước 2: Kích hoạt bộ đôi Plugin Đa ngôn ngữ cốt lõi
Truy cập System Manage Plugins, tìm và bật (Enable) 2 plugin hệ thống sau:
-
System - Language Filter: Đóng vai trò bắt request đầu vào, phát hiện ngôn ngữ của trình duyệt hoặc thông qua URL (
/vi/,/en/), lưu cookie ngôn ngữ và lọc toàn bộ câu lệnh truy vấn SQL theo ngôn ngữ hiện tại.- Cấu hình quan trọng trong Plugin này: Bật Item Associations = Yes (để cho phép nối các bài viết/menu giữa các ngôn ngữ) và bật Add Alternate Meta Tags = Yes (tự động sinh thẻ
<link rel="alternate" hreflang="..." />chuẩn SEO Google).
- Cấu hình quan trọng trong Plugin này: Bật Item Associations = Yes (để cho phép nối các bài viết/menu giữa các ngôn ngữ) và bật Add Alternate Meta Tags = Yes (tự động sinh thẻ
-
System - Language Code: Hỗ trợ chuẩn hóa mã ngôn ngữ trong thẻ HTML
<html lang="...">ở nguồn trang cho công cụ tìm kiếm.
Bước 3: Tổ chức cấu trúc Categories và Articles theo ngôn ngữ
Nguyên tắc vàng để không bị rối dữ liệu là tạo cây danh mục gốc (Root Category) riêng cho từng ngôn ngữ:
-
Tạo Category
Tin tức(Chọn Language:Vietnamese) Viết các bài viết Tiếng Việt bên trong và gán Language làVietnamese. -
Tạo Category
News(Chọn Language:English) Viết các bài viết Tiếng Anh bên trong và gán Language làEnglish.
Bước 4: Thiết lập hệ thống Menu đa ngôn ngữ (Bước quan trọng nhất)
Joomla yêu cầu mỗi ngôn ngữ phải có một Menu riêng chứa một Trang chủ mặc định (Default Home Page) của ngôn ngữ đó, đồng thời vẫn phải giữ lại một Menu chung chứa trang chủ mặc định cho All (*) (nhưng không cho hiển thị ra ngoài):
| Tên Menu | Mục Menu Trang chủ bên trong | Ngôn ngữ gán (Language) | Biểu tượng trên Admin |
|---|---|---|---|
| Main Menu (All) | Home (All) | All (*) | Ngôi sao vàng ⭐ (Giữ nguyên, ẩn module đi) |
| Main Menu VI | Trang chủ | Vietnamese (vi-VN) | Lá cờ Việt Nam 🇻🇳 |
| Main Menu EN | Home | English (en-GB) | Lá cờ Anh 🇬🇧 |
Lưu ý: Sau khi tạo xong
Main Menu VIvàMain Menu EN, bạn vào Content Site Modules, tạo 2 Module kiểu Menu tương ứng cho từng ngôn ngữ (Module Menu Tiếng Việt gán LanguageVietnamese, Module Menu Tiếng Anh gán LanguageEnglish) và đặt vào vị trímenucủa Template.
Bước 5: Tạo Module chuyển đổi ngôn ngữ (Language Switcher)
-
Vào Content Site Modules Bấm New Chọn kiểu Language Switcher.
-
Đặt tiêu đề (ví dụ: Chọn ngôn ngữ), gán vào vị trí
topbarhoặcheader, chọn Language làAllđể ở ngôn ngữ nào người dùng cũng nhìn thấy nút bấm chuyển đổi cờ.
Bước 6: Ánh xạ nội dung với Multilingual Associations
Để liên kết các bản dịch với nhau, bạn có thể làm theo 2 cách:
-
Cách 1 (Ngay trong từng bài viết/menu): Mở bài viết Tiếng Việt Chuyển sang tab Associations Chọn bài viết Tiếng Anh tương ứng.
-
Cách 2 (Công cụ tập trung chuyên nghiệp): Truy cập Components Multilingual Associations. Chọn kiểu dữ liệu (Articles, Categories, hoặc Menu Items) và chọn ngôn ngữ gốc (
vi-VN) cùng ngôn ngữ đích (en-GB). Giao diện Side-by-Side (Chia đôi màn hình) sẽ xuất hiện, cho phép bạn vừa đọc bài Tiếng Việt bên trái, vừa gõ dịch thẳng sang bài Tiếng Anh bên phải và lưu liên kết chỉ trong một màn hình!
3. Công cụ kiểm tra lỗi: Multilingual Status Module
Khi thiết lập đa ngôn ngữ, chỉ cần quên bật plugin hoặc thiếu trang chủ cho một ngôn ngữ cũng sẽ gây lỗi 404. Joomla cung cấp sẵn một công cụ chẩn đoán cực hay:
-
Trong trang quản trị, vào Content Administrator Modules.
-
Tìm module tên là Multilingual Status và bật (Publish) nó lên.
-
Trên thanh顶 (Topbar) góc phải của trang Admin sẽ xuất hiện nút Multilingual Status. Bấm vào đó, Joomla sẽ hiển thị bảng kiểm tra sức khỏe đa ngôn ngữ (báo rõ ngôn ngữ nào đang thiếu Home page, plugin nào chưa bật).
4. Giải phẫu Database & Code PHP xử lý Đa ngôn ngữ (Góc nhìn Backend)
Cơ chế bảng #__associations trong MySQL
Làm sao Joomla biết 3 bài viết thuộc 3 ngôn ngữ (Việt, Anh, Nhật) là bản dịch của nhau mà không dùng khóa ngoại vòng tròn? Joomla sử dụng bảng trung gian #__associations cực kỳ thông minh:
| id (ID của bài viết) | context (Ngữ cảnh Component) | key (Mã băm MD5 nhóm liên kết) |
|---|---|---|
| 15 (Bài Tiếng Việt) | com_content.item |
a8f5f167f44f4964e6c998dee827110c |
| 28 (Bài Tiếng Anh) | com_content.item |
a8f5f167f44f4964e6c998dee827110c |
| 42 (Bài Tiếng Nhật) | com_content.item |
a8f5f167f44f4964e6c998dee827110c |
- Bản chất: Mọi bài viết là bản dịch của nhau sẽ có chung một chuỗi hash
keyvàcontext. Khi bạn đang ở bài viếtid = 15, Joomla chỉ cần chạy 1 câu lệnh SQL tìm cácidkhác có cùngkeyvàcontext, sau đó join với bảng#__contentđể lấy ra URL tương ứng của từng ngôn ngữ!
Cách làm việc với Ngôn ngữ trong Code PHP (Joomla 5)
Khi lập trình Module hoặc Component, bạn cần nắm 2 kỹ thuật cốt lõi: Lấy ngôn ngữ hiện tại để lọc SQL, và sử dụng lớp Text để dịch các chuỗi văn bản tĩnh trong code (từ file .ini):
PHP
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Language\Associations;
$app = Factory::getApplication();
$lang = $app->getLanguage();
// 1. Lấy mã ngôn ngữ hiện tại (Ví dụ: 'vi-VN' hoặc 'en-GB')
$currentLangTag = $lang->getTag();
// 2. Dịch chuỗi văn bản tĩnh từ file ngôn ngữ (.ini)
// Trong file vi-VN.mod_mycustom.ini có dòng: MOD_MYCUSTOM_WELCOME="Chào mừng bạn, %s!"
echo Text::_('JGLOBAL_READ_MORE'); // Dịch chuỗi đơn giản
echo Text::sprintf('MOD_MYCUSTOM_WELCOME', 'Hiếu'); // Dịch chuỗi có truyền biến động
// 3. Lọc dữ liệu Database chuẩn Đa ngôn ngữ trong QueryBuilder
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->getQuery(true)
->select($db->quoteName(['id', 'title', 'alias', 'language']))
->from($db->quoteName('#__content'))
->where($db->quoteName('state') . ' = 1')
// Luôn lấy các bản ghi thuộc ngôn ngữ hiện tại HOẶC ngôn ngữ '*' (All)
->whereIn($db->quoteName('language'), [$currentLangTag, '*'], \Joomla\Database\ParameterType::STRING);
// 4. Kiểm tra xem hệ thống có đang bật tính năng Associations không và lấy các bản dịch của bài viết ID = 15
if (Associations::isEnabled()) {
$associations = Associations::getAssociations('com_content', '#__content', 'com_content.item', 15);
foreach ($associations as $tag => $associatedItem) {
// $tag là 'en-GB', $associatedItem chứa id, alias, catid của bài viết tiếng Anh
echo "Bản dịch tiếng " . $tag . " có ID là: " . $associatedItem->id;
}
}
5. Tổng kết bài học
-
Nắm vững quy trình 6 bước thiết lập hệ thống đa ngôn ngữ chuẩn mực ngay từ trong Core của Joomla 5.
-
Hiểu rõ vai trò của plugin System - Language Filter, cách tổ chức Menu mặc định cho từng ngôn ngữ và công cụ dịch song song Multilingual Associations.
-
Hiểu thiết kế bảng
#__associationssử dụng mã bămkeyở tầng MySQL và cách sử dụngText::_(),whereIn('language', ...)trong PHP.
Trong Bài học 14, chúng ta sẽ đi sâu vào kỹ thuật tối ưu hóa đường dẫn và điều hướng: Cấu hình URL thân thiện (SEF URLs), URL Rewriting và quản lý Redirects xử lý lỗi 404.
All rights reserved