creativelittledots/laravel-gettext

此软件包已被废弃,不再维护。没有建议的替代软件包。

使用Poedit和GNU gettext,以简单的方式为laravel应用添加本地化支持。

4.0.4 2016-11-14 18:31 UTC

README

Laravel Gettext 是一个与伟大的 Laravel PHP 框架兼容的软件包。它提供了一个简单的方法将本地化支持添加到 Laravel 应用程序中。它旨在与 GNU gettextPoedit 一起工作。此软件包的早期版本(4.x之前)与本机的 php-gettext 模块一起工作。当前版本默认使用 Symfony 翻译软件包,而不是本机 php 扩展。

稳定构建状态 最新的 Laravel 5.3.x 稳定版本 (4.0.4)

注意:本文档适用于 laravel 5.3.x 和 4.x 分支。对于旧版本的 laravel,请查看以下链接

旧版本

稳定构建状态 最新的 Laravel 5.2.x 稳定版本 (3.1.0)

稳定构建状态 最新的 Laravel 5.1.x 稳定版本 (3.0.3)

稳定构建状态 最新的 Laravel 5.0 稳定版本 (2.0.3)

稳定构建状态 最新的 Laravel 4.x 稳定版本 (1.0.3)

开发构建状态 开发 master 不稳定,仅用于开发 (dev-master)

1. 要求

如果需要使用本机的 php-gettext 扩展,以下为可选要求

您需要将 'handler' 选项更新为 'gettext',才能使用本机的 php-gettext 模块。

2. 安装

将Composer仓库添加到您的composer.json文件中

    "xinax/laravel-gettext": "4.x"

然后运行composer update。安装完成后,您可以在config/app.php中的providers数组中注册服务提供者

    'providers' = [
        // ...
        Xinax\LaravelGettext\LaravelGettextServiceProvider::class,
        // ...
    ]

现在您需要发布配置文件,以便设置自己的应用程序值

    php artisan vendor:publish

此命令将在以下位置创建包配置文件:config/laravel-gettext.php

您还需要在app/Http/Kernel.php文件中注册LaravelGettext中间件

    protected $middlewareGroups = [
        'web' => [
            // ...
            \Xinax\LaravelGettext\Middleware\GettextMiddleware::class,
        ],
        // ...
    ]

请确保在Illuminate\Session\Middleware\StartSession之后添加该行,否则区域设置不会被保存到会话中。

3. 配置

此时,您的应用程序已完全支持gettext。现在您需要在config/laravel-gettext.php中设置一些配置值。

    /**
     * Default locale: this will be the default for your application all
     * localized strings. Is to be supposed that all strings are written
     * on this language.
     */
    'locale' => 'es_ES',
    /**
     * Supported locales: An array containing all allowed languages
     */
    'supported-locales' => array(
        'es_ES',
        'en_US',
        'it_IT',
        'es_AR',
    ),
    /**
     * Default charset encoding.
     */
    'encoding' => 'UTF-8',

好的,现在已配置完成。现在是时候第一次生成目录结构和翻译文件了。

运行此命令之前,请确保您有对resources/的写入权限

    php artisan gettext:create

此命令将在resources/lang/i18n上创建所需的目录和文件

4. 工作流程

A. 编写字符串 :D

默认情况下,LaravelGettext会递归地搜索app/Http/Controllers和resources/views以查找翻译。所有翻译都是通过__()函数打印的文本。让我们看看一个简单的视图示例

    // an example view file
    echo 'Non translated string';
    echo __('Translated string');
    echo __('Another translated string');
    // with parameter
    $str = 'parameter';
    $n = 2;
    echo __('Translated string with %s', $str);
    echo __('%dnd translated string with %s', [$n, $str]);
    // an example view in blade
    {{ __('Translated string') }}

Poedit不支持blade语法。当使用blade视图时,您必须运行php artisan gettext:update来编译所有blade视图为纯php,然后再用Poedit更新翻译

B. 复数字符串

复数翻译遵循相同的模式。复数翻译是通过_n()函数打印的文本,遵循php ngettext。让我们看看一个简单的视图示例

    // an example view file
    $n = 2;
    echo ($n > 1) ? 'Non translated plural string' : 'Non translated string';
    echo _n('Translated string', 'Translated plural string', $n);
    // with parameter
    $str = 'parameter';
    echo _n('Translated string %s', 'Translated plural string %s', 2, $str);
    // an example view in blade
    {{ _n('Translated string', 'Translated plural string', $n) }}

Poedit的关键字在配置文件中使用默认模式定义

    ['_n:1,2', 'ngettext:1,2']

有关Poedit为您语言配置的复数形式,请参阅

C. 使用Poedit进行翻译

使用Poedit打开您要翻译的语言的PO文件。PO文件默认位于resources/lang/i18n/[locale]/LC_MESSAGES/[domain].po。如果您有多个gettext域,每个域将生成一个文件。

68747470733a2f2f7261772e6769746875622e636f6d2f78696e61782f6c61726176656c2d676574746578742f6d61737465722f646f632f706f656469742e706e67

加载Poedit后,按更新按钮加载所有本地化字符串。每次您添加新的本地化字符串时,都可以重复此步骤。

在Poedit中填写翻译字段并保存文件。第一次这样做时,将为每个区域生成MO文件。

C. 运行时方法

要更改运行时配置,您有这些方法

    /**
     * Sets the Current locale.
     * Example param value: 'es_ES'
     *
     * @param mixed $locale the locale
     * @return LaravelGettext
     */
    LaravelGettext::setLocale($locale);
    /**
     * Gets the Current locale.
     * Example returned value: 'es_ES'
     *
     * @return String
     */
     LaravelGettext::getLocale();
    /**
     * Gets the language portion of the locale.
     * Eg from en_GB, returns en
     *
     * @return mixed
     */
    LaravelGettext::getLocaleLanguage()
    /**
     * Sets the Current encoding.
     * Example param value: 'UTF-8'
     *
     * @param mixed $encoding the encoding
     * @return LaravelGettext
     */
     LaravelGettext::setEncoding($encoding);
    /**
     * Gets the Current encoding.
     * Example returned value: 'UTF-8'
     *
     * @return String
     */
     LaravelGettext::getEncoding();
    /**
     * Sets the current domain
     *
     * @param String $domain
     */
    LaravelGettext::setDomain($domain);
    /**
     * Returns the current domain
     *
     * @return String
     */
    LaravelGettext::getDomain();
    /**
     * Returns the language selector object
     *
     * @param  Array $labels
     * @return LanguageSelector
     */
    LaravelGettext::getSelector($labels = []);

5. 功能和示例

A. 路由和控制器实现示例

app/Http/routes.php

    Route::get('/lang/{locale?}', [
        'as'=>'lang',
        'uses'=>'HomeController@changeLang'
    ]);

app/Http/Controllers/HomeController.php

    /**
     * Changes the current language and returns to previous page
     * @return Redirect
     */
    public function changeLang($locale=null)
    {
        LaravelGettext::setLocale($locale);
        return Redirect::to(URL::previous());
    }

B. 基本语言选择器示例

  <ul>
      @foreach(Config::get('laravel-gettext.supported-locales') as $locale)
            <li><a href="/lang/{{$locale}}">{{$locale}}</a></li>
      @endforeach
  </ul>

C. 内置语言选择器

您可以在视图中使用内置的语言选择器

    // Plain php:
    LaravelGettext::getSelector()->render();

    // Blade views:
    {!! LaravelGettext::getSelector()->render() !!}

它还支持自定义标签

    LaravelGettext::getSelector([
        'en_US' => 'English',
        'es_ES' => 'Spanish',
        'de_DE' => 'Deutsch',
    ])->render();

D. 添加源目录和域

您可以通过编辑 source-paths 配置数组来实现这一点。默认情况下已设置 resources/views 和 app/Http/Controllers。

    /**
     * Paths where Poedit will search recursively for strings to translate.
     * All paths are relative to app/ (don't use trailing slash).
     *
     * Remember to call artisan gettext:update after change this.
     */
    'source-paths' => array(
        'Http/Controllers',
        '../resources/views',
        'foo/bar',              // app/foo/bar
    ),

您可能希望将翻译保存在不同的文件中。在 GNUGettext 中,翻译通过域(domains)进行分隔,域仅仅是上下文名称。

Laravel-Gettext 默认设置了一个包含所有不属于任何域的路径的域,其名称由 'domain' 配置选项确定。

要添加一个新的域,只需将您的路径包裹在所需的域名中即可,如下例所示

    'source-paths' => array(
        'frontend' => array(
            'Http/Controllers',
            '../resources/views/frontend',
        ),
        'backend' => array(
            '../resources/views/backend',
        ),
        '../resources/views/misc',
    ),

此配置将为每种语言生成三个翻译文件: messages.pofrontend.pobackend.po

要在运行时更改当前域(路由中间件将是一个不错的选择)

    LaravelGettext::setDomain("backend");

记住: 每次更改 'source-paths' 选项时都要更新您的 gettext 文件,否则没有必要。

    php artisan gettext:update

此命令将更新您的 PO 文件,并保留当前的翻译。之后,您可以在 Poedit 中打开并点击更新按钮以将新路径中的新文本字符串添加进去。

您可以使用相同的命令仅更新单个域的文件

    php artisan gettext:update --domain backend

E. 关于 gettext 缓存(仅适用于 php-gettext 原生模块)

有时您在 PO 文件中编辑/添加翻译时,更改不会立即出现。这是因为 gettext 缓存系统保留了内容。最快速的解决方案是重启您的 Web 服务器。

6. 贡献

如果您想帮助开发这个包,您可以

  • 在问题部分警告您找到的错误
  • 向我发送包含您补丁的 pull request
  • 修复文档/注释中的灾难性英语 ;-)
  • 创建一个分叉并创建您自己的 laravel-gettext 版本
  • 给个星吧!