dotzero / laravel-localized-carbon
Laravel 5 的本地化版本 Carbon
Requires
- php: ^7.1.3
- illuminate/support: >=5.5.0 <5.9.0
- nesbot/carbon: ^1.25
Requires (Dev)
- composer/composer: ^1.8
- graham-campbell/testbench: ^5.2
- mockery/mockery: ^1.2
- phpunit/phpunit: ~5.7.10|~6.5|~7.0|~8.0
This package is auto-updated.
Last update: 2024-09-04 14:21:46 UTC
README
本地化 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_at
和 updated_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
语言键识别。但如果您的应用程序使用ua
或ukr
语言,它仍然表示它是乌克兰语?在这种情况下,您可以以此方式为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)