laravelrus / localized-carbon
Carbon 的本地化版本
Requires
- php: >=5.3.0
- illuminate/support: >=5.5.0
- nesbot/carbon: ^1.24
README
很抱歉,我没有太多时间支持这个仓库。此外,我现在很少使用 Laravel,因此需要新的维护者。
Localized Carbon
对于 L4 使用 1.4 分支
对于 L5.4 使用 2.2 对于 >=L5.5 使用 2.3
另见 本地化文档
介绍
Localized Carbon 是一个流行的 Carbon 包的扩展,专为 Laravel 框架设计。本地化指的是它的 diffForHumans
函数,该函数返回一个可读的时间间隔字符串。此包还通过在 formatLocalized
方法中引入 "%f" 键来支持所有格的月份。
安装
将以下要求添加到您的 composer.json
中:"laravelrus/localized-carbon": "1.*"
然后运行 composer update
。
接下来,将包的 Service Provider 添加到 app/config/app.php
中的 providers
部分
'Laravelrus\LocalizedCarbon\LocalizedCarbonServiceProvider',
之后,您可能还想添加一些别名(同一配置中的 aliases
部分)
'LocalizedCarbon' => Laravelrus\LocalizedCarbon\LocalizedCarbon::class,
'DiffFormatter' => Laravelrus\LocalizedCarbon\DiffFactoryFacade::class,
请注意,DiffFormatter
将仅用于扩展默认本地化。请参阅 扩展 Localized Carbon。
如果您想在模型中使用与原始 Carbon
相同的方式使用 LocalizedCarbon
的功能,您可以在模型中使用提供的特质
use \Laravelrus\LocalizedCarbon\Traits\LocalizedEloquentTrait;
在这种情况下,LocalizedCarbon
将用于 Eloquent 模型中的所有日期,而不是原始的 Carbon
。
请注意,此方法适用于 PHP 版本 5.4 及更高版本。
如果您仍在使用 PHP 5.3.7,可以使用此包提供的 Laravelrus\LocalizedCarbon\Models\Eloquent
替代 Laravel 的 Eloquent 类。为此,您可以直接继承此类,或者将其作为别名添加到 app\config\app.php
中的原始 Eloquent。
使用
此包提供了一个继承自原始 Carbon 的 LocalizedCarbon
类,因此其用法与原始 Carbon 完全相同。
但想象一下,您有一个例如 Comment
模型,它具有默认的时间戳字段(created_at
和 updated_at
)。您想以可读的格式显示其 created_at
的时间。一种实现方式可能是这样的(在您的 Blade 模板中)
{{ LocalizedCarbon::instance($comment->created_at)->diffForHumans() }}
在这种情况下,该类将输出类似于 "5 minutes ago" 的内容。请注意,对于只是英语版本的字符串,原始 Carbon 就足够了。此 LocalizedCarbon
用于在当前应用程序语言中显示消息。例如,对于俄语,它将显示 "5 минут назад"。
但也可以用Laravel的Eloquent模型来替换,这样时间戳就会转换成LocalizedCarbon
而不是原始的Carbon
。所以使用方法就像使用原始的Carbon一样。
{{ $comment->created_at->diffForHumans() }}
在原始的Carbon中,diffForHumans
函数有一个可选的第一个参数(它是一个Carbon实例)。它指定了应该计算差异的时间。默认情况下(缺失或null
值),使用当前时间。
此外,LocalizedCarbon
还添加了一个可选的第二个参数,其中你可以指定所需的语言,或者直接指定一个用于格式化差异字符串的formatter
类(参见扩展Localized Carbon)。默认情况下使用当前应用程序语言。你也可以在第二个参数中指定一个闭包来完成格式化。关于其签名,请参阅扩展Localized Carbon部分。
支持的语言
Localized Carbon的当前版本附带以下本地化
- 英语(en)(完整)
- 俄语(ru)(完整)
- 乌克兰语(uk)(完整)
- 荷兰语(nl)(无主格)
- 西班牙语(es)(完整)
- 葡萄牙语(pt)(无主格)
- 法语(fr)(无主格)
- 保加利亚语(bg)(无主格)
- 斯洛伐克语(sk)(无主格)
- 土耳其语(tr)(无主格)
- 阿拉伯语(ar)(无主格)
- 日语(ja)(完整)
- 孟加拉语(bn)(完整)
- 波斯语(fa)(完整)
但它是可以扩展的,所以你可以编写并使用自己的本地化,而无需修改包的内容。参见扩展Localized Carbon。
扩展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
方法应根据这些参数返回一个字符串。作为一个例子,请参见现有的DiffFormatters在vendor\laravelrus\localized-carbon\src\Laravelrus\LocalizedCarbon\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!';
});
此外,还可以为现有语言添加别名。例如,本地化的Carbon软件包包含乌克兰语本地化,通过uk
语言键识别。但如果您的应用程序使用ua
或ukr
语言,这仍然意味着它是乌克兰语?在这种情况下,您可以按以下方式为uk
语言添加别名
DiffFormatter::alias('ukr', 'uk');
贡献
如果您已经为当前版本(1.3)的Localized Carbon不支持的语言编写了格式化器,请随意在当前版本分支中提交一个带有该格式化器的pull请求,但请确保调整您的格式化器以供包使用。
格式化器应位于src/Laravelrus/LocalizedCarbon/DiffFormatters
目录中,遵循简单的命名约定:类的名称应以所需语言的小写字母开头,但第一个字母应为大写。名称的其余部分应为"DiffFormatter"。文件名应与类名相对应。
例如,fr
语言的格式化器位于src/Laravelrus/LocalizedCarbon/DiffFormatters/FrDiffFormatter.php
,类名应为FrDiffFormatter
。
此外,我需要社区的帮助来完成所有支持语言的所有格属词列表。如果您了解一种语言并且它使用日期中的格属词,请随时贡献。查看俄罗斯语或乌克兰语的lang\XX\months.php
文件示例。