GoravelGoravel
首页
视频
  • English
  • 简体中文
GitHub
首页
视频
  • English
  • 简体中文
GitHub
  • 前言

    • 升级指南

      • 从 v1.14 升级到 v1.15
      • 从 v1.13 升级到 v1.14
      • 历史版本升级
    • 贡献指南
    • 优秀扩展包
  • 入门指南

    • 安装
    • 配置信息
    • 文件夹结构
    • 编译
  • 核心架构

    • 请求周期
    • 服务容器
    • 服务提供者
    • Facades
  • 基本功能

    • 路由
    • HTTP 中间件
    • 控制器
    • 请求
    • 响应
    • 视图
    • Grpc
    • Session
    • 表单验证
    • 日志
  • 综合话题

    • Artisan 命令行
    • 缓存系统
    • 事件系统
    • 文件储存
    • 邮件
    • 队列
    • 任务调度
    • 本地化
    • 扩展包开发
    • 颜色
    • Strings
    • 辅助函数
  • 安全相关

    • 用户验证
    • 用户授权
    • 加密解密
    • 哈希
  • ORM

    • 快速入门
    • 模型关联
    • 数据库迁移
    • 数据填充
    • 模型工厂
  • 测试相关

    • 快速入门
    • HTTP Tests
    • Mock

本地化

  • 简介
  • 配置语言环境
    • 确定当前的语言环境
    • 定义翻译字符串
    • 检索翻译字符串

简介

Goravel 的本地化功能提供了一种方便的方法来检索各种语言的字符串,从而使你可以轻松地在应用程序中支持多种语言。语言字符串存储在 lang 目录里的文件中,Goravel 支持两种方式组织语言文件:

每一种语言文件独立一个文件:

/lang
  en.json
  cn.json

或者当语言过多时,可以对其进行分类:

/lang
  /en
    user.json
  /cn
    user.json

配置语言环境

应用程序的默认语言存储在 config/app.go 配置文件的 locale 配置选项中。你可以随意修改此值以适合你的应用程序的需求。

你也可以使用 App Facade 提供的 SetLocale 方法,在运行时为单个 HTTP 请求修改默认语言:

facades.Route().Get("/", func(ctx http.Context) http.Response {
    facades.App().SetLocale(ctx, "en")

    return ctx.Response()
})

你可以配置一个「备用语言」,当当前语言不包含给定的翻译字符串时,将使用该语言。和默认语言一样,备用语言也是在 config/app.go 配置文件中配置。

"fallback_locale": "en",

确定当前的语言环境

你可以使用 CurrentLocale 和 IsLocale 方法来确定当前的 locale 或检查 locale 是否是一个给定值。

locale := facades.App().CurrentLocale(ctx)
if facades.App().IsLocale(ctx, "en") {}

定义翻译字符串

在语言文件中,可以定义一级或多级结构:

// lang/en.json
{
  "name": "It's your name",
  "required": {
    "user_id": "UserID is required"
  }
}

检索翻译字符串

你可以使用 facades.Lang(ctx).Get() 方法从语言文件中检索翻译字符串。如果语言文件包含多个层级,可以使用 . 进行连接,如果语言文件在多层级的文件夹中,可以使用 / 进行连接。 例如:

// lang/en.json
{
  "name": "It's your name",
  "required": {
    "user_id": "UserID is required"
  }
}

facades.Lang(ctx).Get("name")
facades.Lang(ctx).Get("required.user_id")

// lang/en/role/user.json
{
  "name": "It's your name",
  "required": {
    "user_id": "UserID is required"
  }
}

facades.Lang(ctx).Get("role/user.name")
facades.Lang(ctx).Get("role/user.required.user_id")

替换翻译字符串中的参数

可以在翻译字符串中定义占位符。所有占位符的前缀都是 :。例如,可以使用占位符名称定义欢迎消息:

{
  "welcome": "Welcome, :name"
}

在要检索翻译字符串时替换占位符,可以将替换数组作为第二个参数传递给 facades.Lang(ctx).Get() 方法:

facades.Lang(ctx).Get("welcome", translation.Option{
  Replace: map[string]string{
    "name": "Goravel",
  },
})

复数化

因为不同的语言有着各种复杂的复数化规则,所以复数化是个复杂的问题;不过 Goravel 可以根据你定义的复数化规则帮助你翻译字符串。使用 | 字符,可以区分字符串的单数形式和复数形式:

{
  "apples": "There is one apple|There are many apples"
}

你甚至可以创建更复杂的复数化规则,为多个值范围指定转换字符串:

{
  "apples": "{0} There are none|[1,19] There are some|[20,*] There are many"
}

定义具有复数选项的翻译字符串后,可以使用 facades.Lang(ctx).Choice() 方法检索给定「count」的行。在本例中,由于计数大于 1 ,因此返回翻译字符串的复数形式:

facades.Lang(ctx).Choice("messages.apples", 10)

也可以在复数化字符串中定义占位符属性。通过将数组作为第三个参数传递给 facades.Lang(ctx).Choice() 方法,可以替换这些占位符:

"minutes_ago": "{1} :value minute ago|[2,*] :value minutes ago",

facades.Lang(ctx).Choice("time.minutes_ago", 5, translation.Option{
  Replace: map[string]string{
    "value": "5",
  },
})
Edit this page
Prev
任务调度
Next
扩展包开发