Лучший способ сделать URL-адреса многоязычными?

Я разрабатываю нишевый сайт социальной сети, который станет многоязычным. Это означает, что в нашей текущей структуре URL-адресов скоро нужно будет начать использовать переведенные слова для ярлыков, например:

www. example.com/home становится www.example.com/inicio

www.example.com/profile становится www.example.com/perfil

www.example. com / help становится www.example.com/ayuda

И так далее. Мой вопрос: как лучше всего поддерживать это в приложении PHP? Для входящих запросов я подумал, что достаточно словаря, подобного следующему в моем файле router.php :

<?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]];
    }
}

...

Который в основном берет сегменты URL и сопоставляет их с английским аналогом, если он существует. Если нет, то это будет продолжаться как обычно и, скорее всего, вызовет ошибку 404, поскольку для сегмента URL не существует контроллера.

Несмотря на эти слова, мне нужно, чтобы он был обратно совместим. Например, при создании URL-адресов в моем приложении.

Естественно, поскольку приложение на данный момент только на английском языке, они просто жестко запрограммированы. Скажем, при получении объекта User я делаю следующее:

<?php
class User {

    function __construct($id) {
        // fetch user details
        $this->profile_url = ROOT . "/profile/" . $this->username;
    }
}

Каков наилучший метод для последующей замены экземпляров "/ profile /" , жестко запрограммированных для получения переведенная версия, т.е. "/ perfil /" на испанском сайте?

5
задан Martin Bean 28 October 2010 в 10:17
поделиться