实现多语言URL的最佳方式?

时间:2010-10-28 10:17:14

标签: php internationalization url-routing multilingual

我正在开发一个多语言的利基社交网站。这意味着我们当前的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/"

4 个答案:

答案 0 :(得分:2)

我总是错的,但是这里......

实现多语言网站的标准方法是使用i18n字典/模板技术,其中每种语言都有一个单独的字典,在某些情况下还有不同的模板。

然而,在这种情况下,我从未见过任何人改变其网址的语言。 URL映射对服务器磁盘上文件的请求(一般来说),如果可以避免,则不应该根据语言进行更改。

通常会在您网址的“路径”部分前加上您要求的语言 - 即: http://foo.bar/en-us/foobar.html

总结一下: 我不担心翻译你的网址,因为它不是标准的做法(至少,不是我见过的)。只需在URL“路径”前加上语言符号,例如上面的URL。

答案 1 :(得分:1)

嗯,我见过的常见模式是为每种语言创建一个php文件并初始化一个大字典,其中所有语言的键都相同。

有一个名为language的会话变量,最初可以为英语(或者你喜欢的任何东西)'en',然后包含使用命令“include(language。'/ main.php');”其中你有一个名为'en'的文件夹,其中包含要包含的所有翻译文件。如果main太大,您可以细分并包含满足您需求的翻译(例如,用于论坛翻译的/en/forum.php和用于首页翻译的/en/blob.php)。

它具有灵活性的巨大优势,允许您通过修改一个会话变量来控制语言。你甚至可以做一些技巧,比如检测浏览器语言设置,并根据它来分配语言,如果它还没有定义,而不是简单地使它成为英语。

答案 2 :(得分:1)

我正在开发的应用程序中有类似的东西。

每个页面都有一个唯一的ID,它与表格中每种语言的slug,页面标题,元描述等相匹配。

至于那些说它不是标准做法并且不打扰它的人我不同意,因为有很好的翻译URL可以帮助你用不同语言的SEO。

答案 3 :(得分:0)

我正在考虑这个问题,因为我现在正走这条路。我打算使用类似的方法,但不一样......

我将使用包含该网站所有字符串的语言“包含”文件。所以......

/languages/en.php

将拥有英语所有正确的字符串,并且可以在新翻译完成后删除其他语言文件。

在en.php文件中,我打算放入像这样的字段

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

然后在站点的任何地方调用该静态变量。 en语言将在其个人资料中定义

然后我就可以这样调用那个变量:

echo PageTitleWelcomeMessage;