Laravel: Up & Running 中文版
  • Laravel Up and Running A Framework for Building Modern PHP Apps
  • 为什么是Laravel
    • 为什么使用框架
    • “自己写”
    • 一致性与灵活性
    • 简短PHP Web框架历史
      • Ruby on Rails
      • PHP框架的涌入
      • CodeIgniter的优劣
      • Laravel 1, 2,和 3
      • Laravel 4
      • Laravel 5
    • Laravel 特别之处
      • Laravel哲学
      • Laravel如何让开发者感到幸福
      • Laravel 社区
    • 是如何运作的
    • 为什么是Laravel
  • 创建Laravel开发环境
    • 系统要求
    • Composer
    • 本地开发环境
      • Laravel Valet
      • Laravel Homestead
    • 创建一个新的Laravel项目
      • 使用Laravel安装工具安装Laravel
      • 使用Composer的create-project功能安装Laravel
      • Lambo:一款增强的"Laravel New"工具
    • Laravel的目录结构
      • 文件夹
      • 其他零散文件
    • 配置
      • .env文件
    • 运行
    • 测试
    • 总结
  • 路由与控制器
    • MVC HTTP和REST简介
      • 什么是MVC
      • HTTP verbs
      • 什么是REST
    • 定义路由
      • Route Verbs
      • 处理路由
      • 路由参数
      • 路由命名
    • 路由组
      • 中间件
        • 在控制器内应用中间件
        • 频率限制
      • 路径前缀
      • 兜底路由
      • 子域路由
      • 命名空间前缀
      • 名称前缀
    • 路由签名
      • 添加签名
      • 修改路由可以访问签名链接
    • 视图
      • 直接使用Route::view()返回简单路由
      • 使用View Composer在视图间共享变量
    • 控制器
      • 获取用户输入
      • 将依赖注入到控制器
      • 资源控制器
      • API 资源控制器
      • 单动作控制器
    • 路由模型绑定
      • 隐式路由模型绑定
      • 自定义路由模型绑定
    • 路由缓存
    • 表单请求方法伪造
      • Laravel内的HTTP verb
      • HTML 表单中的HTTP方法伪造
    • CSRF保护
    • 重定向
      • redirect()->to()
      • redirect()->route()
      • redirect()->back()
      • 其他重定向方法
      • redirect()->with()
    • 关于请求
    • 自定义响应
      • response()->make()
      • response()->json() 和 ->jsonp()
      • response()->download(), ->streamDownload(), 和 ->file()
    • 测试
    • 总结
  • Blade 模板引擎
    • 输出数据
    • 控制结构
      • 条件
      • 循环
    • 模板继承
      • 包含视图
      • 使用堆栈
      • 使用组件与插槽
    • 视图Composer和服务注入
      • 使用视图composers绑定数据到视图
      • Blade 服务注入
    • 自定义Blade指令
      • 自定义指令传参
      • 示例:多租户的自定义Blade指令
      • 更简单的if语句自定义指令
    • 测试
    • 总结
  • 数据库和Eloquent
    • 配置
      • 数据库连接
      • 其他数据库配置选项
      • 定义迁移
        • 创建一个迁移
        • 创建表格
        • 创建字段
        • 构建额外属性
        • 丢弃表格
        • 修改字段
        • 索引和外键
      • 运行迁移
    • 填充
      • 创建一个填充
      • 模型工厂
    • 查询器
      • DB facade的基础用法
      • 原生SQL
      • 使用查询器
      • 事务
    • Eloquent介绍
      • 创建和定义Eloquent模型
      • 使用Eloquent检索数据
      • 使用Eloquent插入和更新
      • 使用Eloquent删除
      • 作用域
      • 使用访问,赋值和属性转换自定义字段
      • Eloquent集合
      • Eloquent序列化
      • Eloquent关系
      • 子记录更新父记录时间戳
    • Eloquent事件
    • 测试
    • 总结
  • 前端组件
    • Laravel 混合
      • Mix 文件夹结构
      • 运行Mix
      • Mix提供了什么
    • 前端预设和授权脚手架
      • 前端预设
    • 分页
    • 信息包
      • 命名错误包
    • 字符串助手,多元化和本地化
      • 字符串助手和多元化
      • 本地化
    • 测试
      • 测试Message和错误包
      • 翻译和本地化
    • 总结
  • 收集和处理用户数据
    • 注入一个请求对象
      • $request->all()
      • $request->except()和$request->only()
      • $request->has()
      • $request->input()
      • $request->method() 和->isMethod()
      • 数组输入
      • JSON 输入($request->json())
    • 路由数据
      • 来自请求
      • 来自路由参数
    • 上传文件
    • 验证
      • Request对象上的validate()
      • 手动验证
      • 自定义验证规则
      • 显示验证错误信息
    • 表单请求
      • 创建一个表单请求
      • 使用表单请求
    • Eloquent 模型批量赋值
    • {{ 与 {!!
    • 测试
    • 总结
  • Artisan 和 Tinker
    • Artisan 介绍
    • 基础Artisan命令
      • 选项
      • 分组的命令
    • 编写自定义Artisan命令
      • 一个简单的命令
      • 参数和选项
      • 使用输入
      • 提示
      • 输出
      • 基于闭包的命令
    • 在普通代码调用Artisan命令
    • Tinker
    • Laravel Dump 服务
    • 测试
    • 总结
  • 用户认证与授权
    • 用户模型与迁移
    • 使用auth()全局辅助和Auth Facade
    • 认证控制器
      • RegisterController
      • LoginController
      • ResetPasswordController
      • ForgotPasswordController
      • VerificationController
    • Auth::routes()
    • 认证脚手架
    • ”记住我“
    • 手动认证用户
    • 手动登出用户
    • 认证中间件
    • 邮箱验证
    • Blade认证指令
    • 守卫
      • 更改默认守卫
      • 不更改默认使用其他守卫
      • 添加新守卫
      • 闭包请求守卫
      • 创建一个自定义用户提供者
      • 非关系数据库的自定义用户提供者
    • 认证事件
    • 授权(ACL)和角色
      • 定义授权角色
      • Gate Facade(注入Gate)
      • 资源Gates
      • 授权中间件
      • 控制器授权
      • 检查用户实例
      • Blade检查
      • 拦截检查
      • 策略
    • 测试
    • 总结
  • 请求,响应,和中间件
    • Laravel的请求生命周期
      • 启动应用程序
      • 服务提供者
    • 请求对象
      • 在Laravel获取一个请求对象
      • 获取请求的基本信息
    • 响应对象
      • 在控制器内使用和创建响应对象
      • 序列化响应类型
    • Laravel和中间件
      • 中间件介绍
      • 创建自定义中间件
      • 绑定中间件
      • 给中间件传参
    • 可信代理
    • 测试
    • 总结
  • 容器
    • 依赖注入简介
    • 依赖注入与Laravel
    • app()全局辅助函数
    • 如何连接容器
    • 绑定类到容器
      • 绑定到闭包
      • 绑定到单例,Aliases和实例
      • 绑定具体实例到接口
      • 上下文绑定
    • Laravel框架内的构造注入
    • 方法注入
    • Facades和容器
      • Facade是如何工作的
      • 实时Facades
    • 服务提供者
    • 测试
    • 总结
  • 测试
  • 编写APIs
    • REST基础-JSON APIs
    • 控制器组织和JSON返回
    • 读取和发送Headers
      • 在Laravel中发送响应头
      • 在Laravel中读取请求头
    • Eloquent 分页
    • 排序和过滤
      • 排序你的API 结果
      • 过滤你的API结果
    • 转换结果
    • API 资源
      • 创建一个资源类
      • 资源集合
      • 嵌套关系
      • 对API资源使用分页
      • 有条件地应用属性
      • API资源的更多自定义
    • API 认证和Laravel Passport
      • OAuth 2.0 简介
      • 安装Passport
      • Passport的API
      • Passport的有效授权类型
      • 使用Passport API和vue组件管理客户端和令牌
      • Passport 作用域
      • 部署Passport
    • API Token认证
    • 自定义404响应
      • 触发回退路由
    • 测试
    • 总结
  • 存储和检索
Powered by GitBook
On this page

Was this helpful?

  1. 前端组件
  2. 字符串助手,多元化和本地化

本地化

Previous字符串助手和多元化Next测试

Last updated 5 years ago

Was this helpful?

本地化允许您定义多种语言并将任何字符串作为目标进行翻译。 您可以设置回退语言,甚至可以处理多元变化。

在Laravel中,您需要在页面加载期间的某个时间点设置一个“application locale”,以便本地化助手知道要从哪个翻译桶中提取。每个”locale“通常与翻译连接,就像“en” (for English),你可以通过App::setLocale($localeName)完成操作,并将其放到服务提供者中,现在你可以把它放到AppServiceProvider的boot中,但如果最终使用的不仅仅是与区域设置相关的绑定,则需要创建一个LocaleServiceProvider。

为每个请求设置本地化

首先,弄清楚Laravel是如何“了解”用户的语言环境的,或者提供翻译的,可能会让人困惑。大部分的工作都取决于您作为开发人员的能力。让我们来看一个可能的场景。

您可能拥有一些功能,允许用户选择一个区域设置,或者可能尝试自动检测它。不管怎样,应用程序都将确定区域设置,然后将其存储在URL参数或会话cookie中。然后,您的服务提供商(类似于LocaleServiceProvider)可能会获取该密钥并将其设置为Laravel引导程序的一部分。

因此,您的用户可能位于 您的LocaleServiceProvider将获取该es字符串,然后运行app::setLocale(“es”)。接下来,每当你要求翻译一个字符串时,Laravel都会寻找该字符串的西班牙语版本(es表示espan_ol),你需要在某个地方定义它

你可以在config/app.php定义回退,然后你会发现一个fallback_locale键,这允许您为应用程序定义默认语言,如果Laravel找不到所请求区域设置的翻译,它将使用该语言

基础本地化

所以我们如何翻译字符串?有一个__($key)辅助函数,它将为所传递的键提取当前区域设置的字符串,或者,如果该字符串不存在,则从默认区域设置中获取该字符串。在blade中,还可以使用@lang()指令。示例6-20演示了基本翻译的工作原理。我们将使用详情页面顶部的“返回仪表板”链接作为示例。

Example 6-20. Basic use of __()
// Normal PHP
<?php echo __('navigation.back'); ?> // Blade
{{ __('navigation.back') }}
// Blade directive
@lang('navigation.back')

假设我们现在使用的是ES语言环境。Laravel将在resources/lang/es/navigation.php中查找一个文件,并期望返回一个数组。它将在该数组上查找back键,如果它存在,它将返回其值。查看示例6-21中的示例。

Example 6-21. Using a translation
// resources/lang/es/navigation.php
return [
    'back' => 'Volver al panel',
];
// routes/web.php
Route::get('/es/contacts/show/{id}', function () {
    // Setting it manually, for this example, instead of in a service provider App::setLocale('es');
    return view('contacts.show');
});
// resources/views/contacts/show.blade.php
<a href="/contacts">{{ __('navigation.back') }}</a>

Laravel 5.4之前版本的翻译辅助函数

在运行5.4之前版本的Laravel的项目中,__()助手不可用。相反,您必须使用trans()助手,它使用旧的翻译系统,该系统的工作原理与我们在这里描述的类似,但不能访问JSON翻译。

本地化中的参数

前面的例子相对简单。让我们深入研究一些更复杂的问题。如果我们想定义返回到哪个仪表盘呢?请看示例6-22

Example 6-22. Parameters in translations
// resources/lang/en/navigation.php
return [
    'back' => 'Back to :section dashboard',
];
// resources/views/contacts/show.blade.php
{{ __('navigation.back', ['section' => 'contacts']) }}

正如你看到的,在单词前面添加冒号(:section)用于占位,__()第二个参数用于替换占位符

本地化的多元化

我们已经讨论了多元化,所以现在假设你正在定义你自己的多元化规则。有两种方法可以做到这一点;我们将从最简单的方法开始,如示例6-23所示。

Example 6-23. Defining a simple translation with an option for pluralization
// resources/lang/en/messages.php
return [
    'task-deletion' => 'You have deleted a task|You have successfully deleted tasks',
]

// resources/views/dashboard.blade.php
@if ($numTasksDeleted > 0)
{{ trans_choice('messages.task-deletion', $numTasksDeleted) }}
@endif

如您所见,我们有一个trans_choice()方法,它第二个参数接收计数;由此决定使用哪段翻译。

您还可以使用与Symfony更复杂的翻译组件兼容的任何翻译定义,如示例6-24

Example 6-24. Using the Symfony’s Translation component
// resources/lang/es/messages.php
return [
        'task-deletion' => "{0} You didn't manage to delete any tasks.|" .
        "[1,4] You deleted a few tasks.|" .
        "[5,Inf] You deleted a whole ton of tasks.",
];

使用JSON存储默认字符串作为key

翻译系统一个难点是没有好的系统来定义key的命名空间,例如一个key被嵌套了三四层,或者哪个key被用了两次。

slug键/字符串值对系统的替代方法是使用主要语言字符串作为键来存储您的翻译,而不是使用虚构的slug。 您可以通过将翻译文件作为JSON存储在resources/ lang目录中,向Laravel表明您正在以这种方式工作,文件名反映了区域设置,如示例6-25

Example 6-25. Using JSON translations and the __() helper
// In Blade
{{ __('View friends list') }}
// resources/lang/es.json
{
  'View friends list': 'Ver lista de amigos'
}

这是使用__()助手的优点,如果对于当前语言找不到对应的key,它将显示key,如果key就是你应用的默认语言,它比widgets.friends.title更合理。

JSON格式的翻译只在Laravel 5.4及之后版本有效

http://myapp.com/es/contacts