avris/micrus-localizator

此包已被废弃,不再维护。作者建议使用 avris/localisator 包。

Micrus 框架的本地化工具

v3.1.0 2017-07-19 10:20 UTC

This package is auto-updated.

Last update: 2022-02-01 13:05:47 UTC


README

这是一个用于处理您应用程序本地化的 Micrus 框架模块。

要安装此模块,请打开文件 app/Config/modules.yml 并添加

  - Avris\Micrus\Localizator\LocalizatorModule

然后运行

composer require avris/micrus-localizator

定义区域设置

区域设置 是一组数据,使您能够根据特定本地化调整您的网站。它主要包括翻译,但也包括货币、数据格式等。

区域设置的标识符是:ISO 639-1 语言代码,然后一个下划线 (_),然后是 ISO 3166-1 alpha-2 国家代码。或者它可能只是语言代码本身。

区域设置以 YAML 文件的形式放置在 app/Locale 目录中,例如

- app
	- Locale
		- en.yml
		- en_UK.yml
		- en_UK.yml
		- pl.yml

en.yml 将包含英国和美式英语共享的单词和短语,而 en_UK 可能看起来像这样

color: Colour
dateFormat: d/m/Y
currency:
  before: £

en_US 如此

color: Color
dateFormat: m/d/Y
currency:
  before: $

pl 当然应该在一个文件中包含所有数据,因为它没有“子”。

app/Config/config.yml 文件中,您应该设置允许的区域设置列表和后备

locales:
  en_GB: English (GB)
  en_US: English (USA)
  pl: Polski
  de: Deutsch
fallbackLocale: pl

现在,当需要由 Micrus 的 Localizator 翻译一个单词,并且当前用户的区域设置为 en_UK 时,这会发生什么

  1. en_UK.yml 中查找单词,如果找到则返回
  2. 如果没有找到,则在“父”区域设置中查找 en.yml,如果找到则返回
  3. 如果没有找到,则在后备 pl.yml 中查找,如果找到则返回
  4. 如果仍然找不到翻译,则返回未翻译的原单词。

如果用户的当前区域设置为 pl,则只会检查 pl.yml

如果会话中没有设置区域设置,Micrus 将尝试根据浏览器的头部信息和可用区域设置列表猜测最佳选择。

翻译

本地化是非常广泛使用的。几乎应用程序的每个部分都可能想要翻译一些字符串。因此,在所有地方注入 Localizator 服务会非常讨厌...这就是为什么本地化有一个特殊的 全局 函数,l($word, $replacements = [], $set = null, $locale = null)。它创建一个 LocalizedString 对象,当转换为简单字符串时会进行翻译。

$this->addFlash('success', l('entity.Post.create.success', ['title' => $post->getTitle()]));

如果您的区域设置包含此条目

entity:
  Post:
    create:
      success: Post "%title%" has been successfully created!

并且您的帖子标题为“Lorem ipsum”,则显示的提示信息将说

Post "Lorem ipsum" has been successfully created!

本地化器也可以直接使用

$this->get('localizator')->get('entity.Post.create.success', ['title' => $post->getTitle()]);

在视图中(如果是 Twig 的情况)

{{ 'entity.Post.create.success'|l({title: post.title}) }}

区域设置集,约定

您的 app/Locale 目录不必是唯一的。外部库可能提供自己的。例如,Micrus Forms 提供了自己的(用于验证器)。保持区域设置在树结构中有序排列有助于避免它们之间的冲突。在 app/Locale 中的条目将始终覆盖任何其他区域设置集。

为了在模块之间重用翻译,请遵守有关所有与模型相关的翻译的约定,如下所示

entity:
  User:
    singular: User
    plural: Users
    fields:
      username: Login
      password: Password
      passwordRepeat: Repeat password
      email: Email
      posts: Posts
      postsCount: Posts count
      role: Role
      roleName: Role
      rememberMe: Remember me
    sections:
      access: Access
      activity: Activity

处理器

此模块定义了一个 translationOrder 服务,它尝试根据以下内容确定要使用哪个区域设置:

  • 会话中的变量 _locale
  • URL 中的标签 _locale
  • HTTP Accept-Language 头部
  • 定义的后备

当用户明确选择一个与他们的HTTP头不同的区域设置时,该区域设置会由于两个可用处理程序之一而保存到会话/URL。

默认情况下是SessionLocaleHandler。要使用它,只需生成一个指向changeLocale的路径。

<a href="{{ route('changeLocale', { locale: 'en_UK' }) }}">

如果您更愿意在URL中传递区域设置,请在services.php中覆盖服务以使用UrlLocaleHandler

localizatorHandler:
  class: Avris\Micrus\Localizator\Handler\UrlLocaleHandler
  params: ['@']
  events: ['addRoute', 'generateRoute']
  tags: ['automatcherSpecialTags']
  clear: true

在这种情况下,生成一个切换区域设置的路径如下所示

{% set newRouteMatch = app.request.routeMatch.withTag('_locale', key) %}
{{ route(newRouteMatch.route.name, newRouteMatch.tags) }}

版权