sabiehahmed/mulilingual-translations

支持数据库和缓存支持的Laravel 5翻译包

该包的官方仓库似乎已删除,因此该包已被冻结。

2.3.0 2017-08-09 06:08 UTC

README

Latest Version on Packagist Software License Build Status Total Downloads

介绍

保持项目翻译的正确更新是繁琐的。通常翻译者无法访问代码库,即使他们可以,也很难跟踪哪种翻译缺失或原始文本的更新需要修改翻译。

该包允许开发人员利用数据库和缓存来管理多语言网站,同时在开发期间仍然可以工作在语言文件上,并从Laravel的Translation bundle的所有功能中受益,如复数或替换。

WAAVI是一家位于西班牙马德里的网络开发工作室。您可以在waavi.com了解更多关于我们的信息。

目录

Laravel兼容性

Laravel translation
4.x 1.0.x
5.0.x 2.0.x
5.1.x 5.3.x
5.4.x 2.2.x及更高版本

功能概述

  • 允许动态更改网站的文本和翻译。
  • 缓存您的本地化条目。
  • 将您的翻译文件加载到数据库中。
  • 强制您的URL本地化(例如:/home -> /es/home),并通过浏览器的配置自动设置区域设置。
  • 本地化模型属性。

安装

通过composer要求

composer require waavi/translation 2.1.x

或手动编辑您的composer.json文件

"require": {
	"waavi/translation": "2.1.x"
}

安装后,在您的项目配置文件app.php中,将提供商数组中的以下条目替换为

Illuminate\Translation\TranslationServiceProvider::class

Waavi\Translation\TranslationServiceProvider::class

删除您的配置缓存

php artisan config:cache

发布配置文件和迁移

php artisan vendor:publish

执行数据库迁移

php artisan migrate

您可以在以下位置检查包的配置文件:

config/translator.php

翻译源

此包允许您从常规的Laravel本地化文件(在/resources/lang中),从数据库,从缓存或前者的组合(用于开发)加载翻译。您可以通过translator.php配置文件和/或TRANSLATION_SOURCE环境变量配置所需的操作模式。接受的值是

  • 'files' 从Laravel的语言文件(默认)加载翻译
  • 'database' 从数据库加载翻译
  • 'mixed' 从文件系统和数据库中加载翻译,文件系统具有优先级。
  • 'mixed_db' 从文件系统和数据库中加载翻译,数据库优先。[v2.1.5.3]

有关缓存配置,请访问缓存配置

从文件加载翻译

如果您不想使用数据库进行翻译,可以选择仅通过语言文件加载语言行。这种模式与Laravel不同,如果在指定的区域找不到行,则不会立即返回键,而是首先检查默认语言中的条目。如果您想单独使用此模式,则需要设置'available_locales'配置文件

config/translator.php
	'available_locales' => ['en', 'es', 'fr'],

示例

en/validations.php中的内容,其中'en'是默认区域,如下所示

		[
			'missing_name'			=>	'Name is missing',
			'missing_surname'		=>	'Surname is missing',
		];

es/validations.php中的内容如下

		[
			'missing_name'			=>	'Falta el nombre',
		];

使用'es'区域的不同键的输出

		trans('validations.missing_name'); 		// 		'Falta el nombre'
		trans('validations.missing_surname'); 	// 		'Surname is missing'
		trans('validations.missing_email'); 	// 		'validations.missing_email'

从数据库加载翻译

您可以选择仅从数据库加载翻译。如果您打算允许用户或管理员实时编辑网站文本和翻译,这将非常有用。在实时生产环境中,您通常希望激活翻译的缓存来使用此源模式。有关使用此源模式的步骤详细信息,请参阅将文件加载到数据库中

示例

languages表中的内容如下

	| id | locale | name    |
	-------------------------
	| 1  | en     | english |
	| 2  | es     | spanish |

language_entries表中的相关内容如下

	| id | locale | namespace | group       | item	          | text                    |
	-------------------------------------------------------------------------------------
	| 1  | en     | *         | validations | missing.name    | Name is missing         |
	| 2  | en     | *         | validations | missing.surname | Surname is missing      |
	| 3  | en     | *         | validations | min_number      | Number is too small     |
	| 4  | es     | *         | validations | missing.name    | Falta nombre   			|
	| 5  | es     | *         | validations | missing.surname | Falta apellido 			|

使用es区域的不同键的输出

		trans('validations.missing.name');   //    'Falta nombre'
		trans('validations.min_number');     //    'Number is too small'
		trans('validations.missing.email');  //    'missing_email'

混合模式

在混合模式下,当查找一组语言行时,既会查询语言文件,也会查询数据库。在文件系统中找到的条目优于数据库。这种源模式在开发时很有用,因为它考虑了文件系统和用户条目。

示例

When files and database are set like in the previous examples:
		trans('validations.missing_name');     //    'Falta el nombre'
		trans('validations.missing_surname');  //    'Falta apellido'
		trans('validations.min_number');       //    'Number is too small'
		trans('validations.missing_email');    //    'missing_email'

将您的文件加载到数据库中

当使用数据库或混合翻译源时,您首先需要将您的翻译加载到数据库中。为此,请按照以下步骤操作

  • 运行安装说明中详细说明的迁移。

  • 将您选择的语言添加到数据库中(参见管理数据库语言

  • 使用提供的Artisan命令将您的语言文件加载到数据库中

    php artisan translator:load

执行Artisan命令时,将发生以下操作

  • 将创建不存在的条目。
  • 现有条目将被更新(除非它们被锁定)。当允许用户实时编辑翻译时,建议您通过翻译存储库中提供的updateAndLock方法进行更新。这可以防止在重新加载从文件中翻译时覆盖条目。
  • 当默认区域的条目被编辑时,所有翻译都将被标记为待审查。这给翻译者提供了审查可能不正确的翻译的机会,但不会删除它们,以避免源文本中的微小错误更改删除所有翻译。有关如何处理不稳定翻译的详细信息,请参阅管理翻译

支持供应商文件和子目录。请注意,当将条目加载到子目录中时,Laravel 5已更改语法为

	trans('subdir/file.entry')
	trans('package::subdir/file.entry')

缓存翻译

每次加载语言组时查询数据库效率极低,您可以选择利用Laravel的缓存系统。此模块将使用您在app/config/cache.php中定义的相同的缓存配置。

您可以通过translator.php配置文件或“TRANSLATION_CACHE_ENABLED”环境变量启用或禁用缓存。配置选项如下:

环境键 类型 描述
TRANSLATION_CACHE_ENABLED 布尔值 启用/禁用翻译缓存
TRANSLATION_CACHE_TIMEOUT 整数 翻译项应保留在缓存中的分钟数。
TRANSLATION_CACHE_SUFFIX 字符串 默认为'translation'。这将是应用于所有翻译缓存条目的缓存后缀。

缓存标签

自版本2.1.3.8起可用。如果使用的缓存存储支持标签,则TRANSLATION_CACHE_SUFFIX将用作所有缓存条目的公共标签。这建议只无效化翻译缓存,甚至可以只无效化给定的区域设置、命名空间和组配置。

清除缓存

自版本2.1.3.8起可用。您可以通过Artisan命令和外观清除翻译缓存。如果使用缓存标签,则仅清除翻译缓存。但是,如果没有缓存标签,则会清除您的所有应用程序缓存。

缓存刷新命令

php artisan translator:flush

为了访问翻译缓存,将以下别名添加到您的config/app.php文件中:

    'aliases'         => [
        /* ... */
        'TranslationCache' => \Waavi\Translation\Facades\TranslationCache::class,
    ]

完成操作后,您可以通过调用以下命令清除整个翻译缓存:

    \TranslationCache::flushAll();

您还可以选择只使一个给定的区域设置、命名空间和组合无效。

    \TranslationCache::flush($locale, $group, $namespace);
  • 区域设置是您希望清除的语言区域。
  • 命名空间是您的应用程序翻译文件为'*',或者为供应商翻译文件为'package'。
  • 组变量是您希望清除的翻译文件的路径。

例如,假设我们在resources/lang目录中有一个以下文件:en/auth.php、en/auth/login.php和en/vendor/waavi/login.php。要清除它们的缓存条目,您将调用:

    \TranslationCache::flush('en', 'auth', '*');
    \TranslationCache::flush('en', 'auth/login', '*');
    \TranslationCache::flush('en', 'login', 'waavi');

在数据库中管理语言和翻译

管理语言和翻译的推荐方法是使用提供的存储库。您也可以通过语言和翻译模型直接保存更改来规避此操作,但模型保存时不再自动执行验证,可能导致不稳定和错误。

语言和翻译存储库都提供了以下方法:

方法 描述
hasTable(); 如果数据库中存在相应的表,则返回true,否则返回false
all($related = [], $perPage = 0); 从数据库检索所有记录。如果第二个参数大于0,则返回分页记录,每页返回$perPage项
find($id); 通过id查找记录
create($attributes); 验证给定的属性并插入新记录。如果发生验证错误,则返回false
delete($id); 通过id删除记录
restore($id); 通过id恢复记录
count(); 返回条目总数
validate(array $attributes); 检查给定的属性是否有效
validationErrors(); 获取创建和更新方法的验证错误

管理语言

应通过 \Waavi\Translation\Repositories\LanguageRepository 管理语言,以确保在插入和更新之前进行适当的数据验证。建议您通过依赖注入实例化此类。

有效的语言记录需要其名称和地区唯一。建议您使用每种语言的本地名称(例如:英语、西班牙语、法语)。

提供的方法有:

方法 描述
update(array $attributes); 更新语言条目 [id, name, locale]
trashed($related = [], $perPage = 0); 从数据库检索所有已删除的记录。
findTrashed($id, $related = []); 通过id查找已删除的记录
findByLocale($locale); 通过地区查找记录
findTrashedByLocale($locale); 通过地区查找已删除的记录
allExcept($locale); 返回除给定地区之外的所有语言的列表
availableLocales(); 返回所有可用地区的列表
isValidLocale($locale); 检查是否存在具有给定地区的语言
percentTranslated($locale); 返回给定地区的翻译百分比

管理翻译

应通过 \Waavi\Translation\Repositories\TranslationRepository 进行翻译管理,以确保在插入和更新之前进行适当的数据验证。建议您通过依赖注入实例化此类。

有效的翻译条目不能与另一个条目具有相同的地区和语言代码。

提供的方法有:

方法 描述
update($id, $text); 更新解锁的条目
updateAndLock($id, $text); 更新并锁定条目(无论是否已锁定)
allByLocale($locale, $perPage = 0); 通过地区获取所有条目
untranslated($locale, $perPage = 0, $text = null); 获取所有未翻译的条目。如果设置了 $text,则将根据翻译值的部分匹配进行筛选。
pendingReview($locale, $perPage = 0); 列出所有待审查的条目
search($locale, $term, $perPage = 0); 通过地区和部分匹配文本值和翻译代码的条目进行搜索。
randomUntranslated($locale); 获取一个随机未翻译的条目
translateText($text, $textLocale, $targetLocale); 将文本翻译到另一个地区
flagAsReviewed($id); 标记条目为已审查

注意事项

  • 您可以锁定翻译,以便只能通过 updateAndLock 进行更新。语言文件加载器使用 update 方法,无法覆盖已锁定的翻译。
  • 当更新属于默认地区的文本条目时,所有其兄弟条目都会被标记为待审查。
  • 当删除条目时,如果它属于默认地区,其翻译也将被删除。

模型属性翻译

您还可以使用翻译管理系统来管理模型属性翻译。为此,您只需要

  • 确保数据库或混合源已设置。
  • 确保您的模型使用 Waavi\Translation\Translatable\Trait
  • 在您的模型中,添加一个 translatableAttributes 数组,包含您希望可用于翻译的属性名称。
  • 对于您希望翻译的每个字段,确保您的数据库中有一个相应的 attributeName_translation 字段。

示例

	\Schema::create('examples', function ($table) {
        $table->increments('id');
        $table->string('slug')->nullable();
        $table->string('title')->nullable();
        $table->string('title_translation')->nullable();
        $table->string('text')->nullable();
        $table->string('text_translation')->nullable();
        $table->timestamps();
    });

    class Example extends Model
	{
	    use \Waavi\Translation\Translatable\Trait;
	    protected $translatableAttributes = ['title', 'text'];
	}

URI 本地化

您可以使用 Waavi\Translation\Middleware\TranslationMiddleware 确保所有 URL 都正确本地化。TranslationMiddleware 仅将重定向不带地区的 GET 请求。

例如,如果用户访问 URL /home,将发生以下情况

  • 中间件将检查是否存在地区。
  • 如果存在有效地区
    • 它将为该地区全局设置语言
    • 以下数据将在您的视图中可用
      • currentLanguage:当前选择的 Language 实例。
      • selectableLanguages:访问者可以切换到的所有语言列表(不包括当前语言)
      • altLocalizedUrls:当前资源除了这个之外的所有本地化URL列表,格式为['locale' => 'en', 'name' => 'English', 'url' => '/en/home']
  • 如果没有地区设置
    • 检查浏览器接受的地区HTTP_ACCEPT_LANGUAGE的前两个字母(例如 'en-us' => 'en')
    • 如果是有效的地区,将访问者重定向到该地区 => /es/home
    • 如果不是,重定向到默认地区 => /en/home
    • 重定向将保留URL中的输入数据(如果有)

您可以通过将中间件添加到您的 App\Http\Kernel 文件中来全局激活此中间件

	protected $middleware = [
		/* ... */
        \Waavi\Translation\Middleware\TranslationMiddleware::class,
    ]

或者通过 ‘localize’ 路由中间件有选择性地应用它,该中间件在通过 ServiceProvider 安装包时已经注册。

建议您将以下别名添加到您的 config/app.php 别名中

	'aliases'         => [
		/* ... */
		'UriLocalizer'	=> Waavi\Translation\Facades\UriLocalizer::class,
    ];

每个本地化路由必须以当前地区为前缀

	// If the middleware is globally applied:
	Route::group(['prefix' => \UriLocalizer::localeFromRequest()], function(){
		/* Your routes here */
	});

	// For selectively chosen routes:
	Route::group(['prefix' => \UriLocalizer::localeFromRequest(), 'middleware' => 'localize')], function () {
	    /* Your routes here */
	});

从 v2.1.6 版本开始,您还可以在您的 URL 中指定地区段的自定义位置。例如,如果地区信息是 URL 的第三个段(/api/v1/es/my_resource),您可以使用

    // For selectively chosen routes:
    Route::group(['prefix' => 'api/v1'], function() {
        /** ... Non localized urls here **/

        Route::group(['prefix' => \UriLocalizer::localeFromRequest(2), 'middleware' => 'localize:2')], function () {
            /* Your localized routes here */
        });
    });

在您的视图中,对于活动中间件的路线,您可以使用共享变量为用户提供一个菜单,以便从当前语言切换到另一种语言。例如

<li class="dropdown">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ $currentLanguage->name }} <b class="caret"></b></a>
    <ul class="dropdown-menu">
        @foreach ($altLocalizedUrls as $alt)
            <li><a href="{{ $alt['url'] }}" hreflang="{{ $alt['locale'] }}">{{ $alt['name'] }}</a></li>
        @endforeach
    </ul>
</li>