czukowski / i18n-nette
Nette 框架的 I18n 包适配器
Requires
- php: >=5.3.0
- czukowski/i18n: ~1.0
- nette/caching: ~2.2
- nette/di: ~2.2
- nette/http: ~2.2
- nette/neon: ~2.2
Requires (Dev)
- phpunit/phpunit: ~4.5
This package is auto-updated.
Last update: 2024-09-12 04:21:15 UTC
README
此包将帮助您在 Nette 应用程序中进行语法准确的翻译(支持框架版本 2.2+;在 2.4 中表现依然出色!)。
Nette 应用程序的 建议 翻译来源实际上是 Neon 文件,它们可能位于应用程序的任何地方,例如,在 app/i18n
文件夹中,这里将用于示例。请注意,您对存储翻译的位置没有限制:也可以使用纯 PHP 文件、数据库,甚至所有这些的组合!
安装和配置
使用 Composer 将其添加到您的应用程序中
composer require czukowski/i18n-nette
将 I18n 服务添加到您的配置文件中
extensions: i18n: I18n\Nette\NetteExtension i18n: defaultLang: cs # Default fallback language directories: # List of directories containing i18n files - %appDir%/i18n languages: # List of languages available in the application, - cs # it is useful for choosing default language from - en # HTTP request headers
将您的翻译放入 i18n 目录中,如下所示
en.neon
- 英文翻译,cs.neon
- 捷克文翻译,fr.neon
- 通用法文翻译,fr/be.neon
- 与通用法文不同的比利时法文翻译,fr/ch.neon
- 与通用法文不同的瑞士法文翻译。
如果您请求 'fr-CH' 区域的翻译,它将首先查找 fr/ch.neon
,如果失败,则查找通用 fr.neon
。如果即使在其中也找不到翻译,则返回未翻译的输入字符串。
翻译数据结构非常类似于您在 Neon 配置中习惯的结构(可以是平面的或嵌套的,由您选择!)
string: řetězec section: string: 'řetězec v podsekci'
一些 Nette 控件已准备好进行翻译,您只需在您的工厂中将翻译实例设置到它们中,例如(假设 $this->translator
是此包提供的翻译服务实例)
// Set translator to control (Nette\Forms\Controls\BaseControl): $control->setTranslator($this->translator); // Set translator to form (Nette\Forms\Form): $form->setTranslator($this->translator); // Set translator to template (Nette\Templating\Template or Nette\Bridges\ApplicationLatte\Template): $template->setTranslator($this->translator);
设置翻译到模板后,您将能够使用翻译宏: {_'translate this'}
。我们将在稍后详细介绍其用法。
配置选项
此 Nette 扩展可用的配置选项
defaultLang
- 默认应用程序语言,即在没有在翻译函数调用中指定目标语言时将其翻译为该语言(默认值:'en-us')。directories
- 包含应用程序翻译的目录。如果应用程序包含多个模块,并且每个模块都添加到翻译列表中,则可能不止一个。路径可以包含配置参数部分中的模板键,例如%appDir%/i18n
(没有默认值)。languages
- 可用语言的列表。当默认语言自动从 HTTP 请求头设置时很有用(没有默认值)。useNeonStyleParams
- 如果设置为 TRUE,则将替换参数名称用百分号括起来(例如,param
变为%param%
),这样翻译键可以看起来与 neon 配置文件中的模板参数类似,同时在翻译调用中使用裸参数键。示例:{_'I have %count% strings to translate', $count, ['count' => $count]}
。默认值是 FALSE,但如果您的应用程序仅使用 neon 文件作为翻译来源,则使用此选项可能看起来更美观。更改此参数可能需要在您的应用程序中审查所有翻译调用,因此请明智选择。setLangFromRequestHeaders
- 如果设置为 TRUE,将自动从 HTTP 请求设置默认语言(相应的函数也可以手动调用)。只有存在于languages
列表中的语言将被设置,根据头部的优先级。replaceLatteFactory
- 如果设置为 TRUE,将用一个新的工厂替换latte.templateFactory
服务,该工厂在创建模板时实现回调。此回调可以用来自动向模板注入翻译器(默认值是 FALSE,但如果使用自定义 Latte 模板工厂替换,可以安全地将其设置为 TRUE)。latteFactoryClass
- 这是一个用于替换模板工厂的类名。此设置允许您覆盖它并使用实现相同功能的另一个类(默认值:'I18n\Nette\TemplateFactory'
)。除非将replaceLatteFactory
参数设置为 TRUE,否则此设置将不会产生任何效果。autoSetTranslatorToTemplates
- 如果设置为 TRUE,将使用替换的 Latte 模板工厂自动向模板注入翻译器。如果replaceLatteFactory
设置为 TRUE,此参数也会隐式设置为 TRUE。设置此参数的唯一有效用例是当另一个模板工厂已被另一个类替换,但仍希望使用onCreateTemplate
回调自动将翻译器设置为模板。
如何使翻译工作
您可以在 基础包的说明文档 中找到有关翻译上下文、复数形式等信息。为了防止重复,这里省略。
在 Nette 模板中进行翻译
以下是一些示例,它们相当直观。
// Basic translation.
{_'Welcome!'}
// Translation with context.
{_'New customer has been saved.', $customer->gender}
// Translation with parameters and context skipped.
{_'Hi, my name is :name', [':name' => $name]}
// All arguments present, including target language.
{_'You have :count messages', $count, [':count' => $count], 'cs'}
注意:如果您使用 useNeonStyleParams
,翻译可能会看起来像这样
{_'You have %count% messages', $count, ['count' => $count], 'cs'}
API
基础包的 API 在其自己的说明文档中有介绍。
类 I18n\NetteTranslator
您不需要直接使用核心对象。这是一个与 Nette 兼容的包装器,并且在 Nette 应用程序中建议使用此方式。请参阅上面的示例,了解如何设置翻译服务。
public function __construct($default_lang = 'x', $use_neon_style_params = FALSE)
- @param string $default_lang
- @param boolean $use_neon_style_params
翻译器构造函数用于在未显式指定时使用默认语言。在内部初始化 Core 对象实例。
public function attach(I18n\Reader\ReaderInterface $reader)
- @param I18n\Reader\ReaderInterface $reader
将 Reader 对象附加到 Core 对象(见下文)。对于 Nette 应用程序,建议使用 I18n\Nette\NeonReader
作为默认读者,尽管还有 I18n\Nette\NetteReader
,它从放置在 Nette 应用程序中的原始 PHP 文件中获取翻译。当然,您也可以实现自己的读者,以从您选择的任何来源提供翻译。
public function getAvailableLanguages()
返回可用语言的列表。
public function setAvailableLanguages($langs)
- @param array $langs
- @return $this
设置可用语言的列表。
public function getDefaultLanguage()
返回默认语言,在未传递目标语言到翻译函数调用时使用。
public function setDefaultLanguage($lang)
- @param string $lang
- @return $this
设置默认语言。
public function setLanguageFromHeaders(Nette\Http\IRequest $httpRequest)
- @param Nette\Http\IRequest $httpRequest
- @return $this
从 HTTP 请求头设置默认语言,如果至少有一个接受的语言包含在可用语言列表中,则选择优先级最高的语言。
public function setTranslator($object)
- @param object $object
将 Nette 翻译器($this
对象实例)设置到兼容对象
'Nette\Bridges\ApplicationLatte\Template'
'Nette\Forms\Controls\BaseControl'
'Nette\Forms\Form'
'Nette\Templating\Template'
public function translate($string, $count, $parameters, $lang)
- @param string $string 要翻译的字符串
- @param mixed $count 字符串形式或数字计数(可选)
- @param array $parameters 需要替换的参数值(可选)
- @param string $lang 目标语言(可选)
- @return string
参数值(数组)可以作为第二个参数传递,在这种情况下,$count
被视为 NULL
,而 $lang
是第三个参数。
public function getService()
- @return I18n\Core
在某些情况下,如果需要,返回内部 Core 对象引用。
许可证
本软件的发布许可符合 MIT 许可证。详细信息请参阅 LICENSE.md。