2010-10-28 11 views
5

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?

+0

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

+0

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

+0

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

Trả lời

1

Tôi có thứ gì đó tương tự trong ứng dụng tôi đang phát triển.

Mỗi trang có một ID duy nhất được khớp với một tiêu đề trang, sên, mô tả meta và như vậy cho từng ngôn ngữ trong một bảng.

Đối với những người nói rằng nó không phải là tiêu chuẩn thực hành và không bận tâm với nó Tôi không đồng ý như có URL được dịch độc đáo có thể giúp SEO của bạn trong các ngôn ngữ khác nhau.

+0

Chính xác lý do của tôi. Cảm ơn vì đầu vào của bạn. –

1

Vâng, một mẫu phổ biến mà tôi đã thấy cho php là tạo một tệp php cho từng ngôn ngữ và khởi tạo một từ điển lớn trong đó các phím giống nhau cho tất cả các ngôn ngữ.

Có biến phiên được gọi là ngôn ngữ ban đầu có thể là 'en' cho tiếng Anh (hoặc bất kỳ thứ gì bạn thích), và sau đó bao gồm sử dụng lệnh "include (language. '/main.php');" trong đó bạn có một thư mục có tên 'en' chứa tất cả các tệp php để đưa vào bản dịch. Nếu chính quá lớn, bạn có thể chia nhỏ và bao gồm bất kỳ bản dịch nào phục vụ nhu cầu của bạn (ví dụ: /en/forum.php cho bản dịch diễn đàn và /en/blob.php cho bản dịch trang đầu).

Nó có lợi thế to lớn là linh hoạt và cho phép bạn kiểm soát ngôn ngữ đơn giản bằng cách sửa đổi một biến phiên. Bạn thậm chí có thể thực hiện các thủ thuật như phát hiện cài đặt ngôn ngữ trình duyệt và gán ngôn ngữ theo đó nếu nó chưa được xác định thay vì chỉ đơn giản là làm cho nó thành tiếng anh.

+0

Vâng. Tôi hy vọng sẽ sử dụng biến miền địa phương hoặc hằng số kết hợp với 'gettext' để xác định nội dung ngôn ngữ và URL cần gọi. –

+0

Tôi nghĩ chìa khóa ở đây là bạn không phải lo lắng về url. Ngôn ngữ chuyển tải/tải các công cụ được xử lý trên máy chủ. –

1

tôi luôn luôn có thể sai, nhưng ở đây đi ...

Cách thông thường để đạt được các trang web đa ngôn ngữ là sử dụng kỹ thuật từ điển i18n/mẫu, trong đó bạn có một từ điển riêng cho mỗi ngôn ngữ, và trong một số trường hợp các mẫu khác nhau.

Tuy nhiên, trong những trường hợp như vậy, tôi chưa bao giờ thấy bất kỳ ai thay đổi ngôn ngữ của URL của họ. URL của bản đồ là một yêu cầu cho các tập tin trên đĩa máy chủ (nói chung), và ở đó không nên thay đổi dựa trên ngôn ngữ nếu bạn có thể tránh nó.

Người ta thường tiền tố phần 'path' của URL với ngôn ngữ bạn đang yêu cầu - ví dụ: http://foo.bar/en-us/foobar.html

Để tóm tắt: tôi sẽ không lo lắng về dịch URL của bạn vì nó isn không phải là một thực hành tiêu chuẩn (atleast, không phải là tôi đã thấy). Đơn giản chỉ cần tiền tố URL 'đường dẫn' với một ngôn ngữ biểu thị như trong URL ở trên.

+0

Nó sẽ không phải là một ngôn ngữ * thông báo *? : P –

+0

Thật vậy, mặc dù tôi nghĩ rằng 'denotation' là một từ đồng nghĩa tốt hơn. Tôi đã sửa nó ở trên. – Craige

0

Tôi đã suy nghĩ về điều này, khi tôi đi xuống con đường này ngay bây giờ. Tôi sẽ sử dụng một phương pháp tương tự, nhưng không giống nhau ...

Tôi sẽ có các tệp "bao gồm" ngôn ngữ với tất cả các chuỗi của trang web. Vì vậy, ...

/languages/en.php

sẽ có tất cả các chuỗi chính xác cho các ngôn ngữ tiếng Anh, và các tập tin ngôn ngữ khác có thể được giảm xuống trong khi bản dịch mới được thực hiện.

Trong tập tin en.php, tôi sẽ đặt trong các lĩnh vực như thế này

define('PageTitleWelcomeMessage', 'Welcome to Foo'); 

Và rồi gọi đó là biến tĩnh bất cứ nơi nào trong trang web. Ngôn ngữ en sẽ được xác định trong hồ sơ của họ

sau đó tôi có thể gọi đó là biến như vậy:

echo PageTitleWelcomeMessage;