欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

使用 Laravel 5.1 内置的本地化功能轻松实现多语言支持

使用Laravel提供的本地化功能实现多语言支持很简单,只需要简单配置并创建对应的本地化翻译文件即可。下面我们就以Laravel自带的几个语言文件为例简单演示如何在登录认证和密码重置这两个功能中实现本地化(汉化)。

1、配置本地化语言

Laravel应用的本地化语言配置项位于config/app.php:

'locale' => 'zh_cn',
'fallback_locale' => 'en',

locale用于配置本地化语言,fallback_locale作为备用语言,当本地语言在翻译文件中找不到时会自动使用备用语言。由于我们本地语言是中文,所以设置locale值为zh_cn

2、简单使用示例

创建翻译文件

配置好配置文件后,我们需要为中文创建翻译文件,翻译文件所在目录为resources/lang,接下来要创建以配置文件中本地语言配置值为文件名的子目录,比如我们的配置值是zh_cn,则需要在resources/lang目录下创建子目录zh_cn,我们仿照自带的en目录在zh_cn目录下新建三个翻译文件用于定义翻译项:

Laravel创建中文翻译文件

auth.php内容如下:

<?php

return [

    'failed' => '用户名/密码不匹配',
    'throttle' => '失败次数太多,请在:seconds秒后再尝试',

];

passwords.php内容如下:

<?php

return [

    'password' => '密码长度至少包含6个字符并且两次输入密码要一致',
    'reset' => '密码已经被重置!',
    'sent' => '我们已经发送密码重置链接到您的邮箱',
    'token' => '密码重置令牌无效',
    'user' => "该邮箱对应的用户不存在!",

];

validation.php内容如下:

<?php

return [

    'confirmed' => '两次:attribute输入不一致',
    'email' => '请输入正确的邮箱地址!',
    'unique' => '该:attribute已存在',
    'required' => ':attribute不能为空',
    'max' => [
        'string' => ':attribute长度不能超过:max个字符',
    ],
    'min' => [
        'string' => ':attribute长度至少包含:min个字符',
    ],

];

在代码中实现本地化显示

在应用中显示本地翻译字符串很简单,只需调用帮助函数trans即可,下面我们将视图中显示错误的部分如下修改即可:

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul style="color:red;">
            @foreach ($errors->all() as $error)
                <li>{{ trans($error) }}</li>
            @endforeach
        </ul>
    </div>
@endif

其实就是在显示$error的时候对其调用trans这一点改变。

访问登录页面http://laravel.app:8000/auth/login(如果没有设置过登录功能,可参考这篇文章:使用Laravel内置组件快速实现注册登录),不输入密码点击登录,则会提示错误信息:

Laravel登录错误提示

如果输入密码错误:

Laravel登录错误提示

如果多次输入密码错误:

Laravel登录错误提示

这里需要注意的是Laravel底层验证器自动为我们替换了:attribute/:min/:max/:seconds这些值,如果时需要我们自己传入的话,使用如下这种方式传递即可:

echo trans('auth.throttle', ['seconds ' => 60]);

中文有一个好处就是没有英文那种单数、复数的区分,所以这里我们略过不谈。

用户注册/密码重置与此类似,这里不再赘述。

3、通过URL动态实现本地化

除了上述这种场景,我们在实际应用中还会遇到在URL中动态传入本地语言从而显示不同语言页面的这种场景,比如锤子手机官网这种:

锤子科技多语言支持

选择English,URL跳转到http://www.smartisan.com/en/#/,选择中文跳转到http://www.smartisan.com/cn/#/home,默认本地语言则根据用户所在位置IP来判断,这种情况下,只在config/app.php中配置已经不够了,还需要在应用中根据URL参数动态设置页面显示语言,当然,Laravel也提供了这种支持,我们只需在代码中使用如下方法即可:

App::setLocale($locale);

比如我们在routes.php中定义如下路由规则:

Route::get('/{locale}', function ($locale) {
    App::setLocale($locale);
    return view('welcome');
});

然后在resources/lang/en目录下新建welcome.php

<?php

return [
    'message' => 'Welcome To Laravel Academy!'
];

resources/lang/zh_cn目录下新建welcome.php

<?php

return [
    'message' => '欢迎访问Laravel学院!'
];

最后修改resources/views/welcome.blade.php页面主体部分:

<div class="content">
    <div class="title">{{ trans('welcome.message') }}</div>
</div>

在浏览器中访问http://laravel.app:8000/zh_cn,页面显示:

Laravel通过路由设置本地化
在浏览器中访问http://laravel.app:8000/en,页面显示:

Laravel通过路由设置本地化

学院君

学院君 has written 1081 articles

Laravel学院院长,终身学习者

积分:136097 等级:P12 职业:手艺人 城市:杭州

10 条回复

  1. kang kang says:
    难道我要每个路由都使用一下 App::setLocale($locale);么?
  2. two say two say says:
    这样的话我在控制器进行数据库切换的话,直接截取url呗
  3. two say 陈宝金 says:
    这样的话我在控制器进行数据库切换的话,直接截取url呗
  4. Coralie Coralie says:
    @ wangbadan I want to finish my thugoht here. If God treated us fairly Jesus would have never died on the cross. and we would have never been offered saailtvon. I praise God that He loves me, He never fails me and He goes to plan B and on. Look ho w He blessed Israel, they sinned and went away from God countless times, but He was faithful and loved them any way. Romans 5:8 But God commended His love toward us, in that while we were sinners Christ died for us. Praise be to God!  
  5. Meteor.lxy Meteor.lxy says:
    Laravel会根据浏览器请求头中的Accept-Language判断语言吗?
  6. 学院君 学院君 says:
    @ kingofswing 调用个函数对性能影响可以忽略 这是多语言的通用解决方案 比如WordPress也是这么处理的 况且这往往是用于一些提示性文字 如果视图上的静态文字 可以通过创建不同语言版本的视图文件来实现
  7. Meteor.lxy 王贯 says:
    问题是如果我全站要翻译,而每一处文字输出都要调用一遍trans() 函数,这性能得多差?
  8. Meteor.lxy 阿布力米提 says:
    数据库方面的怎么实现?

登录后才能进行评论,立即登录?


来自  https://laravelacademy.org/post/1947.html

普通分类: