avris/ micrus-localizator
Requires
- avris/bag: ^3.0
- mustangostang/spyc: ^0.5
Requires (Dev)
- avris/micrus: ^3.0
- phpunit/phpunit: ~4.8
- symfony/var-dumper: ^3.2
- twig/twig: ^1.32
Suggests
- avris/micrus: Web framework that this library was created for
- mustangostang/spyc: Parses YAML files for translations
- twig/twig: Localizator adds a twig filter for localization
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
时,这会发生什么
- 在
en_UK.yml
中查找单词,如果找到则返回 - 如果没有找到,则在“父”区域设置中查找
en.yml
,如果找到则返回 - 如果没有找到,则在后备
pl.yml
中查找,如果找到则返回 - 如果仍然找不到翻译,则返回未翻译的原单词。
如果用户的当前区域设置为 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) }}
版权
- 作者: Andrzej Prusinowski (Avris.it)
- 许可证: MIT