改进了键翻译和链式HTML操作

v1.0.0-rc1 2021-05-02 10:54 UTC

This package is not auto-updated.

Last update: 2024-10-02 04:14:52 UTC


README

此包可以帮助您通过一些便捷的功能访问您的键翻译(不支持json翻译),并允许您通过链式'处理器'来修改翻译的显示方式

之前

在您的翻译在一个特定区域都指向同一位置的情况下,这样做并不非常DRY(Don't Repeat Yourself,不要重复自己)

{{ __('columns.users.name') }}
{!! nl2br( e( __('columns.users.notes') ) ) !!}
{!! __('columns.users.description') !!}

之后

与其使用__()或trans(),不如使用___()或qtrans() 使用"shift"函数来声明后续的所有翻译都应该查找某个特定区域

您可以使用qtrans($key)或qtrans()->get($key),后者在您想在获取翻译之前调用其他函数时很有用。

如果您的配置中'qtrans.processor'数组中的'escape'处于活动状态,则默认情况下所有翻译都将被转义,除非您通过链式翻译手动应用处理器,或者链式调用clear()。在下面的示例中,配置将与包中提供的配置相同,其中escape处理器处于活动状态。

不再需要在这些blade函数{{ }}和{!! !!}}之间切换。始终使用{{ }},而文本是否转义将取决于您的HTML处理器默认值或您手动链式的处理器。

内联shift

{{ qtrans()->shift('columns.users')->get('name') }}
{{ qtrans('notes')->escape()->br() }}
{{ qtrans('description')->clear() }}

预-shift

@php(qtrans()->shift('columns.users'))

{{ qtrans('name') }}
{{ qtrans('notes')->escape()->br() }}
{{ qtrans('description')->clear() }}

警告

QTrans默认转义翻译字符串。您可以在配置qtrans.processor中编辑此设置。目的是您不会转义翻译,因为它们通常应该是安全的,所以我建议关闭转义默认值。然而,如果您手动将HTML处理器应用到翻译中并忘记escape(),即使转义默认值处于开启状态,它也不会被转义。

安装

Composer

composer require corbinjurgens/qtrans

配置

php artisan vendor:publish --tag="qtrans-config"

手动安装

将以下内容复制到主composer。(如果在packages/corbinjurgens/qroute中添加了包)

 "autoload": {
	"psr-4": {
		"Corbinjurgens\\QTrans\\": "packages/corbinjurgens/qtrans/src"
	},
	"files": {
		"packages/corbinjurgens/qtrans/src/helpers.php"
	}
},

然后运行

composer dump-autoload

将以下内容添加到config/app.php的providers

Corbinjurgens\QTrans\ServiceProvider::class,

将别名添加到config/app.php的alias

"QTrans" => Corbinjurgens\Trans\Facade::class,

用法

查看简介了解基本用法

多个选项

在shift时,您可以传递一个数组来声明翻译键可以在多个地方找到

在下面的示例中,每个键例如'name'将查找'forms.signup.name',如果没有找到,将查找'columns.users.name'以找到翻译。

这是我组织表列翻译的首选方式,将通用翻译放在一个区域,然后在另一个区域中放置特定于当前页面的翻译,其中只包含与通用翻译不同的翻译。

@php(qtrans()->shift(['forms.signup', 'columns.users']))

{{ qtrans('name') }}
{{ qtrans('email') }}
{{ qtrans('description') }}

动态设置优先级

您的翻译可能有一组要查找的位置列表,而1号优先级可能取决于一个变量。在这种情况下,请使用优先级函数。所给的变量应该是存在于给定shift数组中的变量,但它也可以是不在数组中的变量。

$get_page = request()->query('page', 'columns.users');
$shifts = [
	'signup' => 'forms.signup',
	'manage' => 'columns.users',
];
$page = $shifts[$get_page] ?? 'columns.users';
@php(qtrans()->shift(['forms.signup', 'columns.users'])->priority($page))

{{ qtrans('name') }}
{{ qtrans('email') }}
{{ qtrans('description') }}

在其他地方shift,然后返回

当第二次、第三次或更多次shift时,您shift的历史将被保留,并且您可以使用back()返回到之前的shift。

@php(qtrans()->shift(['forms.signup', 'columns.users']))

{{ qtrans('name') }} {{-- forms.signup.name, columns.users.name --}}
{{ qtrans('email') }} {{-- forms.signup.email, columns.users.email --}}
{{ qtrans('description') }} {{-- forms.signup.description, columns.users.description --}}

@php(qtrans()->shift('common'))

{{ qtrans('header') }} {{-- common.header --}}
{{ qtrans('url') }} {{-- common.url --}}

@php(qtrans()->back())

{{ qtrans('address') }} {{-- forms.signup.address, columns.users.address --}}

更深更深

在shift时,如果您将true作为第二个变量传递,则给定的shift值或值将作为先前shift的扩展。这只可能在第一次shift之后发生。

@php(qtrans()->shift(['forms.signup', 'columns.users']))

{{ qtrans('name') }} {{-- forms.signup.name, columns.users.name --}}
{{ qtrans('email') }} {{-- forms.signup.email, columns.users.email --}}
{{ qtrans('description') }} {{-- forms.signup.description, columns.users.description --}}

@php(qtrans()->shift('common', true))

{{ qtrans('header') }} {{-- forms.signup.common.header, columns.users.common.header --}}
{{ qtrans('url') }} {{-- forms.signup.common.url, columns.users.common.header --}}

@php(qtrans()->back())

{{ qtrans('address') }} {{-- forms.signup.address, columns.users.address --}}

当然,您可以给每个shift传递一个数组,并且当搜索翻译时它将遵循以下模式。尽管如此,实际使用这个的用例似乎很少。

@php(qtrans()->shift(['forms.signup', 'columns.users']))
@php(qtrans()->shift(['common', 'address'], true))
@php(qtrans()->shift(['contact', 'private_contact'], true))

{{ qtrans('cell') }}

将在以下位置搜索“cell”键

[
  0 => "forms.signup.common.contact"
  1 => "forms.signup.common.private_contact"
  2 => "forms.signup.address.contact"
  3 => "forms.signup.address.private_contact"
  4 => "columns.users.common.contact"
  5 => "columns.users.common.private_contact"
  6 => "columns.users.address.contact"
  7 => "columns.users.address.private_contact"
]

使用 current() 函数获取上面的数组,显示当前位移级别基础

重置

清除位移历史并开始新的基础,或使用 base() 开始空基础

临时暂停位移

使用 pause() 然后稍后 resume() 临时关闭位移功能,查找与正常翻译相同的键原始数据

@php(qtrans()->shift(['forms.signup', 'columns.users']))

@php(qtrans()->pause())
{{ qtrans('user.cell') }} {{ user.cell }}

@php(qtrans()->resume())
{{ qtrans('user.cell') }} {{ forms.signup.user.cell, columns.users.user.cell }}

或者使用 skip() 暂停下一个翻译中的位移功能。如果您想跳过特定次数,可以传递一个数字

@php(qtrans()->shift(['forms.signup', 'columns.users']))

@php(qtrans()->skip())
{{ qtrans('user.cell') }} {{ user.cell }}

{{ qtrans('user.cell') }} {{ forms.signup.user.cell, columns.users.user.cell }}

HTML处理器

如果当前实例的 $basic_setting 属性设置为 false(由配置 'qtrans.basic' 确定),则所有返回的翻译值都将是一个“可HTML化”的实例。这允许您链式处理。

之前

如果您想使用 nl2br 函数和转义,您需要做如下操作:

{!! nl2br( e( __('translation.key') ) ) !!}

这非常混乱。

之后

{{ ___('translation.key')->escape()->br() }}

注意处理器的顺序。运行 br()->escape() 将导致 HTML 标签显示为纯文本
标签

可用处理器

  • escape(): 对字符串应用 e()
  • br(): 对字符串应用 nl2br()
  • markdown(): 对字符串应用 Illuminate\Mail\Markdown::parse(),这是 Laravel 内置的邮件 Markdown,也适用于 HTML Markdown

HTML 处理器默认值

要为所有翻译应用一组默认处理器,请修改和添加到配置文件 qtrans.processor 数组中。

例如,默认处理器设置为:

'processor' => [
	['escape', [] ], 
]

这意味着对于 {{ ___('users.name') }} 的情况,应用了 escape 处理器。但是,如果您手动调用处理器,如 {{ ___('users.name')->br() }},则不会使用 escape 或默认中声明的任何其他处理器。这是在您想要重新排序处理器的情况下的用法。

如果您不想为特定翻译使用默认处理器但没有任何处理器可以替换它,例如调用 clear(),例如 {{ ___('users.name')->clear() }}。您还可以通过编辑 $processor_setting 数组属性来修改默认处理器,例如 qtrans()->processor_setting = []

自定义处理器

通过调用 Corbinjurgens\QTrans\Html::custom() 创建自定义处理器

例如,在您的 AppServiceProvider 注册函数中

Corbinjurgens\QTrans\Html::custom('upper', function($string){
	return \Str::upper($string)
});
{{ ___('users.name')->escape()->upper() }}