zachleigh/laravel-lang-bundler

创建 Laravel 翻译包。

v1.1.0 2018-09-22 03:14 UTC

This package is auto-updated.

Last update: 2024-09-22 16:41:15 UTC


README

Latest Stable Version License Build Status Quality Score StyleCI Total Downloads

制作翻译值包。

内容

为什么

为什么使用这个包?因为这个很糟糕

<component
    welcome={{ trans('home.welcome') }}
    login={{ trans('home.login') }}
    signup={{ trans('home.signup') }}
    profile={{ trans('user.settings.profile') }}
    friends={{ trans('user.home.friends') }}
    intro={{ trans('user.home.intro') }}
    body={{ trans('user.home.body') }}
></component>

而这个则好得多

<component
    :lang={{ transB('bundle_name')->toJson() }}
></component>

升级信息

版本 1.0.* 到版本 1.1.*

版本 1.1.0 移除了对低于 7.1 的 PHP 版本的支持。

版本 0.9.* 到版本 1.0.0

版本 1.0.0 更多是对当前 API 和用法的确认,而不是其他。增加了对 Laravel 5.4 的支持。如果使用 Laravel 5.3,请使用 版本 0.9.11

composer require zachleigh/laravel-lang-bundler:0.9.*

安装

1. 通过 composer 安装
composer require zachleigh/laravel-lang-bundler
2. 注册服务提供者

在 Laravel 的 config/app.php 文件中,将服务提供者添加到具有 'providers' 键的数组中。

LaravelLangBundler\ServiceProvider::class
3. 发布配置文件
php artisan vendor:publish --tag=config
4. 在 resources/lang/ 中创建一个 'bundles' 目录。

手动创建或使用命令

php artisan langb:start

用法

1. 创建一个包。

假设我们有两个语言文件,一个叫做 'home.php',另一个叫做 'user.php'。

home.php

    'welcome' => 'Welcome!',
    'login' => 'Login',
    'signup' => 'Signup',

user.php

    'profile' => 'Your Profile',
    'friends' => 'Your Friends',
    'body' => 'Enter body below',

我们希望这些值都在一个包中。

只需在 bundles 目录的任何位置注册您的包作为数组。例如,在 bundles 目录中,您可以创建一个名为 'components' 的文件夹,并在其中创建一个名为 'bundle_name' 的文件,如下所示

return [
    'home.welcome',
    'home.login',
    'home.signup',
    'user.profile',
    'user.friends',
    'user.body'
];

显然,'bundle_name' 是包的名称。其他值代表在上述语言文件中找到的键。

就像在其他语言文件夹中一样,bundles 目录中的任何文件/文件夹都被视为数组的一个级别。所以在这个例子中,我们的文件路径如下

lang/bundles/components/bundle_name.php

'bundle_name' 包的路径将是 'bundles.components.bundle_name'。也可以在单个文件中创建多个命名包,但这不被推荐,因为不能为多包文件使用自动别名。

2. 使用 transB() 辅助函数获取包。

通过将包路径传递给 transB() 辅助函数来获取您的翻译包。

transB('bundles.components.bundle_name');

或使用自动别名的名称

transB('bundle_name');

transB() 返回一个按原始翻译键键控的翻译值集合。继续上面的例子,transB() 将给我们一个包含以下数组的集合

[
    'welcome' => 'Welcome!',
    'login' => 'Login',
    'signup' => 'Signup',
    'profile' => 'Your Profile',
    'friends' => 'Your Friends',
    'body' => 'Enter body below',
];
3. 向您的包传递参数。

与标准的 trans() 函数一样,您可以将参数作为第二个参数传递给 transB() 函数。

transB('bundle_name', ['parameterName' => $value]);

如果您的包有冲突的参数名称,您可以给它们命名空间。在这个例子中,三个值需要一个 user 参数。

user.php 翻译文件

return [
    'welcome_user' => 'Welcome :user',
    'message_to'   => 'You sent a message to :user',
    'invite_from'  => 'You have an invite from :user'
];

包文件

return [
    'user.welcome_user',
    'user.message_to',
    'user.invite_from'
];

通过在传递给 transB() 时对参数进行命名空间来避免命名冲突

transB('bundle_name', [
    'welcome_user.user' => 'Bob',
    'message_to.user' => 'Sally',
    'invite_from.user' => 'George'
]);
4. 多数化值

可以通过在 transB() 函数参数中传递一个命名空间的 'choice' 参数来多数化语言项。例如,如果我们的语言文件值如下所示

'inbox_status' => 'You have a new message.|You have new messages'

我们可以在包中正常注册它

'home.inbox_status'

然后,在调用 transB() 时,传递一个名为 'inbox_status.choice' 的参数,并带有所需的选项值

transB('bundle_name', ['inbox_status.choice' => 3]);

结果将是多数化字符串 "您有新消息"。

高级用法

修改返回键和值

要修改返回翻译数组中的键和值,请在特定包项上使用 bundle_item() 辅助函数。

bundle_item($id, $type, $parameters = []);

“$id”是语言键。"$type" 必须使用以下格式:“target_type”。'target' 声明要受修改影响的项,可以是“value”、“key”或“both”。'type' 声明修改的类型(回调、更改等)。$parameters 是要发送给执行修改的类的参数数组。

如果我们想使用上面的示例将 'welcome_user' 的值转换为大写,我们可以在 bundle 文件中使用 bundle_item() 辅助函数来实现。
user.php 翻译文件

return [
    'welcome_user' => 'Welcome :user',
    'message_to'   => 'You sent a message to :user',
    'invite_from'  => 'You have an invite from :user'
];

包文件

return [
    bundle_item('user.welcome_user', 'value_strtoupper'),
    'user.message_to',
    'user.invite_from'
];

将 bundle 键 'user.welcome_user' 包裹在 bundle_item() 全局函数中,并传递翻译键($id)和类型(对返回的 'value' 执行 'strtoupper')。假设有一个非命名空间的用户变量,值为 'Bob',这将返回以下值

[
    'welcome_user' => 'WELCOME BOB',
    'message_to'   => 'You sent a message to Bob',
    'invite_from'  => 'You have an invite from Bob'
];

如果我们想对键执行相同的操作,我们可以这样做

return [
    bundle_item('user.welcome_user', 'key_strtoupper'),
    'user.message_to',
    'user.invite_from'
];

或者,如果我们想同时修改键和值

return [
    bundle_item('user.welcome_user', 'both_strtoupper'),
    'user.message_to',
    'user.invite_from'
];
可用的修饰符
回调

对键或值执行回调。需要“callback”参数。

bundle_item('user.welcome_user', 'value_callback', [
    'callback' => 'function_name'
]),
更改

将键更改为新值。对值不执行任何操作。需要“new”参数。

bundle_item('user.invite_from', 'key_change', [
    'new' => 'newKey'
]),
explode

根据给定分隔符拆分。对键不执行任何操作。需要“delimiter”参数。

bundle_item('user.invite_from', 'value_explode', [
    'delimiter' => ' '
]),
strtolower

将整个字符串转换为小写。

bundle_item('home.invite_from', 'value_strtolower')
strtoupper

将整个字符串转换为大写。

bundle_item('home.invite_from', 'value_strtoupper')
ucfirst

将字符串中的第一个字符转换为大写。

bundle_item('home.invite_from', 'value_ucfirst')
values

如果翻译值是数组,则运行 array_values() 在数组上并返回只有整数字段的值。对键不执行任何操作。

bundle_item('home.months', 'value_values')
创建自己的修饰符

使用 'mod' 命令在 App/LangBundler/Mods 中创建新的 mod 类。

langb:mod {name}

您的类必须实现两个抽象方法。

    /**
     * Alter key and return.
     *
     * @param string $key
     *
     * @return string
     */
    abstract public function key($key);

    /**
     * Alter value and return.
     *
     * @param mixed $value
     *
     * @return mixed
     */
    abstract public function value($value);

同一类用于修改值和键。定义您的修改并返回所需的键/值。

命令

php artisan langb:start

通过在 lang 文件夹中创建 bundles 目录来开始。

php artisan langb:new {path}

在路径处创建新的 bundle 文件。例如

php artisan langb:new components.user.profile

这将创建一个空数组返回的文件 lang/bundles/components/user/profile.php。

php artisan langb:mod {name}

在 App/LangBundler/Mods 中创建一个空的 mod 模板。

配置

别名

为了缩短 bundle 的名称,您可以在配置中注册别名。

'aliases' [
    'alias' => 'full.path.to.bundle'
];

然后只需在 transB() 中使用别名而不是路径即可。

transB('alias');
key_transform

如果您希望将语言文件键转换为 snake_case、StudlyCase 或 camelCase,请将 key_transform 设置为 'snake_case'、'studly_case' 或 'camel_case'。默认值是 'none'。
例如,此 bundle 包含 snake cased 变量

return [
    'user.welcome_user',
    'user.message_to',
    'user.invite_from'
];

但是在您的 JavaScript 中,您想使用 came cased 变量,将 key_transform 设置为 'camel_case' 以获取此 bundle

return [
    'welcomeUser' => 'Welcome user!',
    'messageTo' => 'Message to user',
    'inviteFrom' => 'You have an invitation from user!',
];

许多其他简单的字符串函数(ucfirst、strtoupper 等)也适用。

key_transform 是全局的,并将转换项目中的所有键。如果您想转换单个键,请参阅 修改返回键和值

global_key_namespace

如果您将所有翻译都放在一个文件中,可以将 global_key_namespace 设置为文件名以节省一些输入。例如,如果所有翻译都在名为 'translations.php' 的文件中,您将必须注册一个类似这样的 bundle

return [
    'bundle_name' => [
        'translations.home',
        'translations.navigation',
        'translations.menu',
        'translations.login'
    ];
];

但是,如果将 global_key_namespace 设置为 'translations',则可以像这样注册

return [
    'bundle_name' => [
        'home',
        'navigation',
        'menu',
        'login'
    ];
];

测试

composer test

贡献

我们非常欢迎贡献。Fork,改进并提交 pull request。对于错误、改进想法或其他,请创建一个 问题