0

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 language riêng: Mọi Category, Article, Menu Item, Module trong Joomla đều có cột language trong 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

  1. Truy cập System →\rightarrow Install →\rightarrow Languages, tìm và cài đặt gói Vietnamese (vi-VN).

  2. Kiểm tra tại System →\rightarrow Manage →\rightarrow 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ụ: vi và en).

Bước 2: Kích hoạt bộ đôi Plugin Đa ngôn ngữ cốt lõi

Truy cập System →\rightarrow Manage →\rightarrow Plugins, tìm và bật (Enable) 2 plugin hệ thống sau:

  1. 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).
  2. 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) →\rightarrow 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) →\rightarrow 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 VI và Main Menu EN, bạn vào Content →\rightarrow 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 Language Vietnamese, Module Menu Tiếng Anh gán Language English) và đặt vào vị trí menu của Template.

Bước 5: Tạo Module chuyển đổi ngôn ngữ (Language Switcher)

  1. Vào Content →\rightarrow Site Modules →\rightarrow Bấm New →\rightarrow Chọn kiểu Language Switcher.

  2. Đặt tiêu đề (ví dụ: Chọn ngôn ngữ), gán vào vị trí topbar hoặc header, 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 →\rightarrow Chuyển sang tab Associations →\rightarrow 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 →\rightarrow 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 →\rightarrow 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 key và context. Khi bạn đang ở bài viết id = 15, Joomla chỉ cần chạy 1 câu lệnh SQL tìm các id khác có cùng key và 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 #__associations sử dụng mã băm key ở tầng MySQL và cách sử dụng Text::_(), 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí