Tôi đang phát triển một trang web mạng xã hội thích hợp đang phát triển đa ngôn ngữ. Điều đó có nghĩa cấu trúc URL hiện tại của chúng tôi sẽ sớm cần phải bắt đầu sử dụng những từ đã dịch cho sên như sau:Cách tốt nhất để đạt được các URL đa ngôn ngữ?
www.example.com/home
trở thành www.example.com/inicio
www.example.com/profile
trở thành www.example.com/perfil
www.example.com/help
trở thành www.example.com/ayuda
Và vân vân. Câu hỏi của tôi là: cách tốt nhất để hỗ trợ điều này trong một ứng dụng PHP là gì? Đối với yêu cầu gửi đến, tôi nghĩ một cuốn từ điển như sau trong tập tin router.php
của tôi sẽ đủ:
<?php
$request = explode("/", trim($_SERVER['REQUEST_URI'], "/"));
// Dictionaries of page slugs.
$slugs = array(
'es' => array(
'inicio' => 'home',
'perfil' => 'profile',
'ayuda' => 'help',
)
// additional languages can be added here
);
// Rewrite any incoming (foreign) requests
if ($host=="www.example.es") { // to be made programmatic
$lang = "es"; // pick up from locale constant rather being hard-coded
if (array_key_exists($request[0], $slugs[$lang])) {
$request[0] = $slugs[$lang][$request[0]];
}
}
...
Mà về cơ bản có đoạn URL rồi so sánh chúng chống lại một phản phần tiếng Anh nếu nó tồn tại. Nếu không, sau đó nó sẽ tiến hành như bình thường và rất có thể gây ra một 404 như một bộ điều khiển không tồn tại cho phân đoạn URL.
Mặc dù từ này, tôi cũng cần nó để tương thích ngược. Ví dụ: khi tạo URL trong ứng dụng của tôi.
Đương nhiên, vì ứng dụng chỉ là tiếng Anh tại thời điểm chúng chỉ được mã hóa cứng. Vì vậy, nói, khi lấy một đối tượng User
tôi làm như sau:
<?php
class User {
function __construct($id) {
// fetch user details
$this->profile_url = ROOT . "/profile/" . $this->username;
}
}
phương pháp tốt nhất để rồi thay thế trường hợp của "/profile/"
là gì được mã hóa cứng để nhận được phiên bản được dịch, ví dụ: "/perfil/"
trong các trang web tiếng Tây Ban Nha?
Bạn đang sử dụng một số loại khuôn khổ PHP, hoặc nó là một hệ thống tự mã hóa? – mth
Tại thời điểm dịch, tôi thường chọn không lưu trữ các trang trong cơ sở dữ liệu, tham chiếu đến chúng bằng id hoặc tên nội bộ, và làm cho chúng đầy đủ các đối tượng có các phương thức như 'getUrl()'. – Wrikken
Các đoạn đường dẫn được dịch là rất không phổ biến. Cảm giác ruột của tôi là tránh làm cho việc này trở nên quá linh hoạt. – mario