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