dotzero/laravel-localized-carbon

Laravel 5 的本地化版本 Carbon

v1.2.0 2019-07-27 07:40 UTC

This package is auto-updated.

Last update: 2024-09-04 14:21:46 UTC


README

Build Status Latest Stable Version License

本地化 Carbon 是一个流行 Carbon 包的扩展,专门为 Laravel 5 框架设计。这里的本地化指的是它的 diffForHumans 函数,它返回一个人类可读的时间间隔字符串。此包还通过在 formatLocalized 方法中引入 %f 键来支持所有格月份。

安装

使用以下命令通过 Composer 安装此包

$ composer require dotzero/laravel-localized-carbon

接下来,将包的 Service Provider 添加到 app/config/app.php 文件的 providers 部分

'providers' => [
    // ...
    Laravelrus\LocalizedCarbon\LocalizedCarbonServiceProvider::class,
],

之后,你可能想添加一些别名(配置文件的 aliases 部分)

'aliases' => [
    // ...
    'LocalizedCarbon' => Laravelrus\LocalizedCarbon\LocalizedCarbon::class,
    'DiffFormatter'   => Laravelrus\LocalizedCarbon\DiffFactoryFacade::class,
],

运行以下命令将语言文件发布到 resources/lang

$ php artisan vendor:publish

用法

请注意,DiffFormatter 只会用于扩展默认本地化。

如果你想以与在模型中使用原始 Carbon 相同的方式使用 LocalizedCarbon 的功能,你可能想在模型中使用提供的特性来实现这一点

use \Laravelrus\LocalizedCarbon\Traits\LocalizedEloquentTrait;

在这种情况下,LocalizedCarbon 将用于 Eloquent 模型中的所有日期,而不是原始的 Carbon

此包提供了一个继承自原始 Carbon 的 LocalizedCarbon 类,因此其使用方式与原始 Carbon 完全相同。

但想象一下,你有一个 Comment 模型,例如,它有默认的时间戳字段(created_atupdated_at)。你想要以人类可读的格式显示自 created_at 以来过去的时间。一种实现方式可以是这样的(在你的 Blade 模板中)

{{ LocalizedCarbon::instance($comment->created_at)->diffForHumans() }}

在这种情况下,该类将输出类似 "5 分钟前" 的内容。请注意,对于英文版本的原生 Carbon 就足够了。此 LocalizedCarbon 用于在当前应用程序语言中显示消息。例如,对于俄语,它将显示 "5 минут назад"。

但也可以替换 Laravel 的 Eloquent 模型,以便将时间戳转换为 LocalizedCarbon 而不是原始的 Carbon。因此,使用方式可以像使用原始 Carbon 一样

{{ $comment->created_at->diffForHumans() }}

与原始 Carbon 一样,diffForHumans 函数有一个可选的第一个参数(它是另一个 Carbon 实例)。它指定了差异应计算的时间。默认情况下(缺失或 null 值),使用当前时间。

LocalizedCarbon 还添加了一个可选的第二个参数,在其中你可以指定所需的语言,或直接指定用于格式化差异字符串的 formatter 类。默认情况下,使用当前应用程序语言。你还可以指定一个闭包作为第二个参数,该闭包将执行格式化。有关签名,请参阅扩展 Localized Carbon 部分。

支持的语言

Localized Carbon 的当前版本包含以下本地化

  • 英语 (en) (完整)
  • 俄语 (ru) (完整)
  • 乌克兰语 (uk) (完整)
  • 荷兰语 (nl) (无所有格)
  • 西班牙语 (es) (完整)
  • 葡萄牙语 (pt) (无所有格)
  • 法语 (fr) (无所有格)
  • 保加利亚语 (bg) (无所有格)
  • 斯洛伐克语 (sk) (无所有格)
  • 土耳其语 (tr) (无所有格)
  • 阿拉伯语 (ar) (无所有格)
  • 日语 (ja) (完整)
  • 孟加拉语 (bn) (完整)
  • 波斯语 (fa) (完整)

扩展 Localized Carbon

如果此包未提供本地化版本,您可以自己编写并扩展Localized Carbon,无需接触供应商文件夹。

扩展Localized Carbon有几种方法。

首先,您可以为此编写自己的DiffFormatter类,实现Laravelrus\LocalizedCarbon\DiffFormatters\DiffFormatterInterface接口。此接口强制类必须有一个单例的format方法,如下所示:

public function format($isNow, $isFuture, $delta, $unit);

$isNow是一个布尔值,当计算与当前时间相关的时差时为true$isFuture是一个布尔值,如果DateTime对象相对于比较时间在未来则为true$delta是一个整数,等于差值的单位数。$unit是时间单位。它可以如下:second(秒)、minute(分钟)、hour(小时)、day(天)、week(周)、month(月)或year(年)。

因此,您的format方法应该根据这些参数返回一个字符串。例如,您可以在vendor\laravelrus\localized-carbon\src\Laravelrus\LocalizedCarbon\DiffFormatters目录中查看现有的DiffFormatters。您还可以使用Lang::choice引用lang文件,就像在俄语本地化中所做的那样。

当您的类准备就绪时,您必须在Localized Carbon中注册它。为此,您必须从任何由框架加载的文件中调用DiffFormatter::extend方法。例如,您可以在app/start/global.php中的某个地方做这件事。

extend方法期望两个参数:第一个是要支持的编程语言(如果您只想使用应用程序的语言,则通常为App::getLocale())。下一个是您的格式化程序实例,或者只是类的名称,如果它可以自动加载。以下是一些示例:

$formatter = new Acme\DiffFormatters\FrDiffFormatter;
DiffFormatter::extend('fr', $formatter);

// or

DiffFormatter::extend('fr', 'Acme\\DiffFormatters\\FrDiffFormatter');

在这种情况下,格式化程序将在需要时使用IoC自动加载。请注意,由于优化考虑,格式化程序在应用程序生命周期中只加载一次。

扩展的第二种方法是传递一个闭包作为第二个参数。它必须具有与DiffFormatterInterface接口中format方法相同的签名。例如:

DiffFormatter::extend('fr', function($isNow, $isFuture, $delta, $unit) {
    return 'Some formatter diff string!';
});

此外,还可以为现有语言添加别名。例如,Localized Carbon附带乌克兰语本地化,由uk语言键识别。但如果您的应用程序使用uaukr语言,它仍然表示它是乌克兰语?在这种情况下,您可以以此方式为uk语言添加别名。

DiffFormatter::alias('ukr', 'uk');

贡献

如果您为未在Localized Carbon当前版本中提供的语言编写了一个格式化程序,请随时在当前版本分支(1.3)中创建带有它的拉取请求,但请确保调整您的格式化程序以供包使用。

格式化程序应位于src/Laravelrus/LocalizedCarbon/DiffFormatters目录中,遵循简单的命名约定:类名应以所需语言的小写字母开头,但第一个字母应大写。名称的其余部分应为"DiffFormatter"。文件名应与类名相对应。

例如,fr语言的格式化程序位于src/Laravelrus/LocalizedCarbon/DiffFormatters/FrDiffFormatter.php中,类名为FrDiffFormatter

此外,我需要社区的帮助来完成所有支持语言的所有格的形式列表。如果您知道一种语言并在日期中使用所有格,请随时贡献。请参阅俄罗斯语或乌克兰语的示例lang\XX\months.php文件。

许可

Carbon的本地化版本根据MIT许可:[https://open-source.org.cn/licenses/mit-license.php](https://open-source.org.cn/licenses/mit-license.php)