- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想根据所选语言创建具有许多翻译路线的应用程序。我曾经在 3 methods of creating URLs in multilingual websites 上描述过它.
在这种情况下,它应该是提到的主题中的第一个方法所以:
假设我设置了默认语言 pl
和其他 2 种语言 en
和 fr
。我只有 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
配置中,您设置替代语言(在您的情况下为 en
和 fr
)- 它们应该与第一个文件名相同创建带翻译文件的步骤。
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 的第一段是否与您的语言名称匹配 - 如果是,您更改区域设置和当前语言前缀。
然后在小循环中,您为所有路由名称设置要求(您提到您希望将 about
和 contact
翻译成 URL),所以在这里您将它们设置为与当前语言的 routes.php
文件中定义的相同。
最后,您创建的路由组的前缀与您的语言相同(对于默认语言,它将为空),在组内您只需创建路径,但这些参数 about
和 contact
您将其视为变量
,因此您对它们使用{about}
和{contact}
语法。
您需要记住,在这种情况下,将检查所有路由中的 {contact}
是否与您在第一步中为当前语言定义的相同。如果您不想要这种效果并希望使用 where 为每条路线手动设置路线,则可以使用不带循环的替代 app\routes.php
文件,您可以在其中设置 contact
和about
每条路线分别:
<?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/
我是一名优秀的程序员,十分优秀!