gpt4 book ai didi

php - 如何在 Laravel 中创建多语言翻译路线

转载 作者:IT王子 更新时间:2023-10-29 00:52:34 24 4
gpt4 key购买 nike

我想根据所选语言创建具有许多翻译路线的应用程序。我曾经在 3 methods of creating URLs in multilingual websites 上描述过它.

在这种情况下,它应该是提到的主题中的第一个方法所以:

  1. 我有一种默认语言
  2. 我可以使用多种其他语言
  3. 当前语言应仅通过 URL(不含 cookie/ session )计算,以使其对搜索引擎也非常友好
  4. 对于默认语言,URL中不应该有前缀,对于其他语言,应该是域后的语言前缀
  5. url的每一部分都应该按照当前语言翻译。

假设我设置了默认语言 pl 和其他 2 种语言 enfr。我只有 3 个页面 - 主页、联系页面和关于页面。

网站的网址应该是这样的:

/
/[about]
/[contact]
/en
/en/[about]
/en/[contact]
/fr
/fr/[about]
/fr/[contact]

[about][contact] 应根据所选语言进行翻译,例如英语应保留 contact 但对于波兰语,它应该是 kontakt 等等。

如何做到尽可能简单?

最佳答案

第一步:

转到 app/lang 目录并在此处为每种语言的路线创建翻译。您需要创建 3 个 routes.php 文件 - 每个文件都在单独的语言目录 (pl/en/fr) 中,因为您要使用 3 种语言

对于波兰语:

<?php

// app/lang/pl/routes.php

return array(

'contact' => 'kontakt',
'about' => 'o-nas'
);

对于英语:

<?php

// app/lang/en/routes.php

return array(
'contact' => 'contact',
'about' => 'about-us'
);

对于法语:

<?php

// app/lang/fr/routes.php

return array(
'contact' => 'contact-fr',
'about' => 'about-fr'
);

第二步:

转到 app/config/app.php 文件。

你应该找到一行:

'locale' => 'en',

并将其更改为您的主要站点语言(在您的情况下为波兰语):

'locale' => 'pl',

您还需要将以下几行放入该文件中:

/**
* List of alternative languages (not including the one specified as 'locale')
*/
'alt_langs' => array ('en', 'fr'),

/**
* Prefix of selected locale - leave empty (set in runtime)
*/
'locale_prefix' => '',

alt_langs 配置中,您设置替代语言(在您的情况下为 enfr)- 它们应该与第一个文件名相同创建带翻译文件的步骤。

locale_prefix 是您所在区域的前缀。您不希望默认语言环境有前缀,因此它被设置为空字符串。如果选择默认语言之外的其他语言,此配置将在运行时修改。

第三步

转到您的 app/routes.php 文件并放入它们的内容(这是 app/routes.php 文件的全部内容):

<?php

// app/routes.php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the Closure to execute when that URI is requested.
|
*/


/*
* Set up locale and locale_prefix if other language is selected
*/
if (in_array(Request::segment(1), Config::get('app.alt_langs'))) {

App::setLocale(Request::segment(1));
Config::set('app.locale_prefix', Request::segment(1));
}


/*
* Set up route patterns - patterns will have to be the same as in translated route for current language
*/
foreach(Lang::get('routes') as $k => $v) {
Route::pattern($k, $v);
}


Route::group(array('prefix' => Config::get('app.locale_prefix')), function()
{
Route::get(
'/',
function () {
return "main page - ".App::getLocale();
}
);


Route::get(
'/{contact}/',
function () {
return "contact page ".App::getLocale();
}
);



Route::get(
'/{about}/',
function () {
return "about page ".App::getLocale();

}
);

});

正如您首先看到的,您检查 url 的第一段是否与您的语言名称匹配 - 如果是,您更改区域设置和当前语言前缀。

然后在小循环中,您为所有路由名称设置要求(您提到您希望将 aboutcontact 翻译成 URL),所以在这里您将它们设置为与当前语言的 routes.php 文件中定义的相同。

最后,您创建的路由组的前缀与您的语言相同(对于默认语言,它将为空),在组内您只需创建路径,但这些参数 about contact 您将其视为变量,因此您对它们使用{about}{contact} 语法。

您需要记住,在这种情况下,将检查所有路由中的 {contact} 是否与您在第一步中为当前语言定义的相同。如果您不想要这种效果并希望使用 where 为每条路线手动设置路线,则可以使用不带循环的替代 app\routes.php 文件,您可以在其中设置 contactabout 每条路线分别:

<?php

// app/routes.php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the Closure to execute when that URI is requested.
|
*/

/*
* Set up locale and locale_prefix if other language is selected
*/
if (in_array(Request::segment(1), Config::get('app.alt_langs'))) {

App::setLocale(Request::segment(1));
Config::set('app.locale_prefix', Request::segment(1));
}


Route::group(array('prefix' => Config::get('app.locale_prefix')), function()
{
Route::get(
'/',
function () {
return "main page - ".App::getLocale();
}
);


Route::get(
'/{contact}/',
function () {
return "contact page ".App::getLocale();
}
)->where('contact', Lang::get('routes.contact'));



Route::get(
'/{about}/',
function () {
return "about page ".App::getLocale();

}
)->where('about', Lang::get('routes.about'));


});

第四步:

您没有提到它,但还有一件事您可以考虑。如果有人将使用 url /en/something 其中 something 不是正确的路由,我认为最好的解决方案是进行重定向。但是您应该重定向到 /,因为它是默认语言,而是重定向到 /en

现在您可以打开 app/start/global.php 文件并在此处为未知网址创建 301 重定向:

// app/start/global.php

App::missing(function()
{
return Redirect::to(Config::get('app.locale_prefix'),301);
});

关于php - 如何在 Laravel 中创建多语言翻译路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25082154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com