国際相対時間フォーマットAPI:Intel.RelativeTimeFormat
5033 ワード
原文:The Intel.RelativeTimeFormat API作者:Mathias Bynens(@mathias)
現代のWebアプリケーションでは、完全な日付やタイムスタンプではなく、「昨日」、「42秒前」、「3ヶ月」などのフレーズが一般的に使用されています.この相対的な時間フォーマットは、いくつかのポピュラーなライブラリがローカライズフォーマットの関数を実現するほど一般的になっています.(Moment.js、Globalize、date-fnsなど)
ローカライズされた相対時間フォーマットを実装する問題の1つは、「昨日」や「前四半期」など、各言語に慣習語やフレーズのリストを提供する必要があることです.Unicode CLDRはこのデータを提供していますが、JavaScriptで使用するには、ライブラリコードに埋め込んで一緒に提供する必要があります.残念なことに、これらのライブラリのパケットサイズは、スクリプトのロード時間、解析/コンパイルコスト、メモリ消費に影響を与えるに違いありません.
新しい
使用法と例
次の例では、英語を使用して相対時間フォーマットプログラムを作成する方法を示します.
以下に、他の言語(中国語簡体字中国語)を用いた例を示す.
また、
上記のフォーマットプログラムでは、
この動作を変更するには、
Analogous to other
他の
その他のオプションとその動作の詳細については、API docs in the proposal repositoryを参照してください.
結論
関連リンク Intl.RelativeTimeFormat Spec Proposal The ECMAScript Internationalization API
現代のWebアプリケーションでは、完全な日付やタイムスタンプではなく、「昨日」、「42秒前」、「3ヶ月」などのフレーズが一般的に使用されています.この相対的な時間フォーマットは、いくつかのポピュラーなライブラリがローカライズフォーマットの関数を実現するほど一般的になっています.(Moment.js、Globalize、date-fnsなど)
ローカライズされた相対時間フォーマットを実装する問題の1つは、「昨日」や「前四半期」など、各言語に慣習語やフレーズのリストを提供する必要があることです.Unicode CLDRはこのデータを提供していますが、JavaScriptで使用するには、ライブラリコードに埋め込んで一緒に提供する必要があります.残念なことに、これらのライブラリのパケットサイズは、スクリプトのロード時間、解析/コンパイルコスト、メモリ消費に影響を与えるに違いありません.
新しい
Intl.RelativeTimeFormat
APIはこの負担をJavaScriptエンジンに移行し、JavaScriptエンジンは言語環境データを提供し、JavaScript開発者に直接使用させることができる.Intl.RelativeTimeFormat
相対時間のローカライズフォーマットは、パフォーマンスを犠牲にすることなく実現される.使用法と例
次の例では、英語を使用して相対時間フォーマットプログラムを作成する方法を示します.
const rtf = new Intl.RelativeTimeFormat('en');
rtf.format(3.14, 'second');
// → 'in 3.14 seconds'
rtf.format(-15, 'minute');
// → '15 minutes ago'
rtf.format(8, 'hour');
// → 'in 8 hours'
rtf.format(-2, 'day');
// → '2 days ago'
rtf.format(3, 'week');
// → 'in 3 weeks'
rtf.format(-5, 'month');
// → '5 months ago'
rtf.format(2, 'quarter');
// → 'in 2 quarters'
rtf.format(-42, 'year');
// → '42 years ago'
Intl.RelativeTimeFormat
コンストラクション関数に渡されるパラメータは、BCP 47言語タグ、または複数の言語タグを含む配列である必要があることに留意されたい.以下に、他の言語(中国語簡体字中国語)を用いた例を示す.
const rtf = new Intl.RelativeTimeFormat('zh'); // 'zh-Hans-CN'
rtf.format(3.14, 'second');
// → '3.14 '
rtf.format(-15, 'minute');
// → '15 '
rtf.format(8, 'hour');
// → '8 '
rtf.format(-2, 'day');
// → '2 '
rtf.format(3, 'week');
// → '3 '
rtf.format(-5, 'month');
// → '5 '
rtf.format(2, 'quarter');
// → '2 '
rtf.format(-42, 'year');
// → '42 '
また、
Intl.RelativeTimeFormat
コンストラクション関数は、出力を細粒度制御できるオプションoptions
パラメータを受け入れる.柔軟性を説明するには、デフォルト設定に基づいてより多くの出力を表示します.// , 。
// ,
const rtf = new Intl.RelativeTimeFormat('zh', {
localeMatcher: 'best fit', // : 'lookup'
style: 'long', // : 'short' 'narrow'
numeric: 'always', // : 'auto'
});
rtf.format(-1, 'day');
// → '1 '
rtf.format(0, 'day');
// → '0 '
rtf.format(1, 'day');
// → '1 '
rtf.format(-1, 'week');
// → '1 '
rtf.format(0, 'week');
// → '0 '
rtf.format(1, 'week');
// → '1 '
上記のフォーマットプログラムでは、
'1 '
ではなく文字列' '
が生成され、'0 '
ではなく、' '
が弱いように見えます.これは、デフォルトでフォーマットプログラムが数値を使用して出力されるためです.この動作を変更するには、
numeric
オプションを'auto'
に設定します(デフォルトは'always'
です).const rtf = new Intl.RelativeTimeFormat('zh', { numeric: 'auto' });
rtf.format(-1, 'day');
// → ' '
rtf.format(-2, 'day');
// → ' '
rtf.format(0, 'day');
// → ' '
rtf.format(1, 'day');
// → ' '
rtf.format(2, 'day');
// → ' '
rtf.format(-1, 'week');
// → ' '
rtf.format(0, 'week');
// → ' '
rtf.format(1, 'week');
// → ' '
Analogous to other
Intl
classes, Intl.RelativeTimeFormat
has a formatToParts
method in addition to the format method. Although format covers the most common use case, formatToParts
can be helpful if you need access to the individual parts of the generated output: 他の
Intl
クラスと同様に、Intl.RelativeTimeFormat
メソッドに加えて、format
メソッドがあります.formatToParts
は最も一般的な例をカバーしていますが、生成された出力の各セクションにアクセスする必要がある場合は、format
が役立ちます.const rtf = new Intl.RelativeTimeFormat('zh', { numeric: 'auto' });
rtf.format(-1, 'day');
// → ' '
rtf.formatToParts(-1, 'day');
// → [{ type: 'literal', value: ' ' }]
rtf.format(3, 'week');
// → '3 '
rtf.formatToParts(3, 'week');
// → [
// { type: 'integer', value: '3', unit: 'week' },
// { type: 'literal', value: ' ' }
// ]
その他のオプションとその動作の詳細については、API docs in the proposal repositoryを参照してください.
結論
formatToParts
デフォルトではV 8 v 7.1.179およびChrome 71で使用可能です.このAPIがより広く利用できるようになるにつれて、MomentなどのAPIが発見されます.js、Globalize、date-fnsなどのライブラリは、コードライブラリからハードコーディングCLDRデータベースへの依存性を除去し、ネイティブの相対時間フォーマット機能を使用することで、ロード時のパフォーマンス、分析、コンパイル時のパフォーマンス、実行時のパフォーマンス、メモリの使用を向上させます.関連リンク