jield-webdev/jield-slm-locale

Laminas 自动检测本地化

v0.3.0 2017-11-20 14:20 UTC

README

Build Status Latest Stable Version Coverage Status

由 Jurian Sluiman 创建

简介

SlmLocale 是一个 Laminas 模块,用于自动检测应用程序的本地化。它使用多种可插拔策略来搜索有效的本地化。SlmLocale 具有默认本地化、一组支持本地化和本地化别名。

SlmLocale 支持开箱即用的几种搜索本地化的策略。通过接口,可以创建其他策略。默认策略集包括:

  1. HTTP Accept-Language 标头
  2. 一个 cookie 用来在多个会话中存储本地化
  3. 一个查询参数,以便轻松切换本地化
  4. uri 路径的第一部分
  5. 域名的一部分(可以是顶级域名或子域名)

此外,它还提供了一套额外的本地化功能

  1. 默认本地化,用作回退
  2. 一组别名,您可以将主机名策略中的 .com 映射为 "en-US"
  3. 当找到本地化时,重定向到正确的域名/路径
  4. 视图辅助工具,用于创建本地化 uri 或语言切换列表

安装

将 "slm/locale" 添加到您的 composer.json 文件中,并更新您的依赖项。在您的 application.config.php 中启用 SlmLocale。

如果您在项目根目录中没有 composer.json 文件,请复制下面的内容,将其放入一个名为 composer.json 的文件中,并将其保存到您的项目根目录中

{
    "require": {
        "slm/locale": ">=0.1.0,<1.2.0-dev"
    }
}

然后在 CLI 中执行以下命令

curl -s http://getcomposer.org/installer | php
php composer.phar install

现在您应该有一个包含 slm/localevendor 目录。在您的引导代码中,确保包含 vendor/autoload.php 文件以正确加载 SlmLocale 模块。

用法

在配置中设置默认本地化

'slm_locale' => [
    'default' => 'nl-NL',
],

在配置中设置所有支持本地化

'slm_locale' => [
    'supported' => ['en-US', 'en-GB'],
],

并启用一些策略。命名如下所示

  • cookie: SlmLocale\Strategy\CookieStrategy
  • host: SlmLocale\Strategy\HostStrategy
  • acceptlanguage: SlmLocale\Strategy\HttpAcceptLanguageStrategy
  • query: SlmLocale\Strategy\QueryStrategy
  • uripath: SlmLocale\Strategy\UriPathStrategy
  • asset: SlmLocale\Strategy\AssetStrategy

您可以在 strategies 列表中启用一个或多个。请注意优先级很重要!您通常希望将 acceptlanguage 作为最后一个回退

'slm_locale' => [
    'strategies' => ['uripath', 'acceptlanguage'],
],

此时,本地化应该被检测到。本地化存储在 php 的 Locale 对象中。使用 Locale::getDefault() 获取本地化。这也在 Laminas 翻译器对象和 i18n 视图辅助工具中自动化(因此您不需要在那里设置本地化)。

在 html 中设置本地化的语言

通常会在 html 中提供使用本地化的语言。例如,可以在 html 标签中设置

<html lang="en">

使用以下代码在此处注入检测到的语言

<html lang="<?= $this->primaryLanguage()?>">

在 PHPUNIT 中禁用 UriPathStrategy

(目前)如果您想在您的 AbstractHttpControllerTestCase 单元测试中使用 this->dispatch('my/uri');,则这是必要的。否则,如果检查响应代码,您将得到 302,而应该是 200

示例

$this->dispatch('/to/my/uri');
$this->assertResponseStatusCode(200); // this will be 302 instead of 200

$this->dispatch('/en/to/my/uri');
$this->assertResponseStatusCode(200); // this will be 302 instead of 200

要修复,请将以下内容添加到您的 phpunit 配置中。

phpunit.xml

<phpunit...>
    ...
    <php>
        <server name="DISABLE_URIPATHSTRATEGY" value="true" />
    </php>
</phpunit>

或者,在您的 phpunit 启动文件中设置 $_SERVER['DISABLE_URIPATHSTRATEGY'] = true;

创建可用的本地化列表

待定

有关使用和所有策略的配置的更多信息,请参阅文档