laravelrus/localized-carbon

该包已被废弃,不再维护。未建议替代包。

Carbon 的本地化版本

v2.3 2018-04-22 13:14 UTC

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_atupdated_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是时间单位。它可以是以下之一:secondminutehourdayweekmonthyear

因此,你的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语言键识别。但如果您的应用程序使用uaukr语言,这仍然意味着它是乌克兰语?在这种情况下,您可以按以下方式为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文件示例。