czukowski/i18n-nette

Nette 框架的 I18n 包适配器

1.1.2 2016-10-26 09:29 UTC

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。