摘要:在不犧牲性能的情況下實現(xiàn)相對時間的本地化格式化。用法與示例以下示例展示了如何使用英語創(chuàng)建相對時間格式化程序。需要注意的是傳遞給構(gòu)造函數(shù)的參數(shù)必須是一個語言標記,或者是一個包括多個語言標記的數(shù)組。
原文:The Intl.RelativeTimeFormat API
作者:Mathias Bynens(@mathias)
現(xiàn)代 Web 應(yīng)用程序通常使用“昨天”,“42秒前”或“3個月”之類的短語,而不是完整的日期和時間戳。這種相對時間格式已經(jīng)變得非常普遍,以至于幾個流行的庫都實現(xiàn)了本地化格式化的函數(shù)。(例如 Moment.js,Globalize 和 date-fns。)
實現(xiàn)本地化相對時間格式化的一個問題是,您需要為每種語言提供習(xí)慣詞或短語列表(例如“昨天”或“上一季度”)。Unicode CLDR 提供了此數(shù)據(jù),但要在 JavaScript 中使用它,必須將其嵌入到庫代碼中一起提供。遺憾的是,這無疑會增加這些庫的包大小,這會影響到腳本的加載時間、解析/編譯成本和內(nèi)存消耗。
全新的 Intl.RelativeTimeFormat API 將此負擔轉(zhuǎn)移到了 JavaScript 引擎,JavaScript 引擎可以提供語言環(huán)境數(shù)據(jù)并使其直接供 JavaScript 開發(fā)人員使用。 Intl.RelativeTimeFormat 在不犧牲性能的情況下實現(xiàn)相對時間的本地化格式化。
用法與示例以下示例展示了如何使用英語創(chuàng)建相對時間格式化程序。
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 構(gòu)造函數(shù)的參數(shù)必須是一個 BCP 47 語言標記,或者是一個包括多個語言標記的數(shù)組。
以下是使用其他語言(漢語簡體中文)的示例:(譯注:原文是西班牙語)
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 構(gòu)造函數(shù)還接受一個可選 options 參數(shù),該參數(shù)可以對輸出進行細粒度控制。為了說明靈活性,讓我們根據(jù)默認設(shè)置查看更多輸出:
// 創(chuàng)建一個簡體中文相對時間格式化示例,使用默認設(shè)置。 // 在這個例子中,我們將默認參數(shù)顯式的傳進去 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周后"
您可能已經(jīng)注意到上面的格式化程序生成了字符串 "1天前" 而不是 "昨天",還有顯得比較弱智的 "0周后" 而不是 "本周"。發(fā)生這種情況是因為默認情況下,格式化程序使用數(shù)值進行輸出。
要更改此行為,請將 numeric 選項設(shè)置為 "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 涵蓋了最常見的用例,但如果您需要訪問生成的輸出的各個部分,formatToParts 會很有幫助:
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: "周后" } // ]
有關(guān)其余選項及其行為的詳細信息,請參閱 API docs in the proposal repository.
結(jié)論Intl.RelativeTimeFormat 默認情況下在 V8 v7.1.179 和 Chrome 71 中可用。隨著此 API 變得更加廣泛可用,您將發(fā)現(xiàn)諸如 Moment.js、Globalize、date-fns 之類的庫,會從代碼庫中移除對硬編碼 CLDR 數(shù)據(jù)庫的依賴性,而使用本機相對時間格式化功能,從而提高加載時性能、分析和編譯時性能、運行時性能和內(nèi)存使用。
相關(guān)鏈接Intl.RelativeTimeFormat Spec Proposal
The ECMAScript Internationalization API
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98596.html
摘要:舉例來說即便某個失敗了,也不會導(dǎo)致的發(fā)生,這樣在不在乎是否有項目失敗,只要拿到都結(jié)束的信號的場景很有用。對于則稍有不同只要有子項,就會完成,哪怕第一個了,而第二個了,也會,而對于,這種場景會直接。 1. 引言 本周精讀的內(nèi)容是:Google I/O 19。 2019 年 Google I/O 介紹了一些激動人心的 JS 新特性,這些特性有些已經(jīng)被主流瀏覽器實現(xiàn),并支持 polyfill...
摘要:相對時間本土化支持昨天前天數(shù)字本土化分組逗號分隔科學(xué)計數(shù)保留位小數(shù)保留位百分制貨幣人民幣漢字一二三四五六七八九一二三四五六二日期時間本土化時間本土化上午日期本土化配置項 相對時間本土化 支持 second, minute, hour, day, week, month, quarter, year var rtf = new Intl.RelativeTimeFormat(zh-Han...
摘要:在和中都保留了數(shù)組的強引用,所以在中簡單的清除變量內(nèi)存并沒有得到釋放,因為還存在引用計數(shù)。而在中,它的鍵是弱引用,不計入引用計數(shù)中,所以當被清除之后,數(shù)組會因為引用計數(shù)為而被回收掉。其實我們主要注意的引用是不計引用計數(shù)的,就好理解了。 showImg(https://segmentfault.com/img/remote/1460000019147368?w=900&h=383); 前...
摘要:可能不會包括所有的語法提案。事實上,有些提案已經(jīng)被擱置很多年了。因此,很可能也會在今年月份發(fā)布。 譯者按: 又過了1年... 原文:Whats New in JavaScript for 2019 譯者: Fundebug 為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。 最近這些年,ECMASCript標準發(fā)展節(jié)奏非常穩(wěn)定,每年都會發(fā)布新的特...
閱讀 2998·2021-11-23 09:51
閱讀 2820·2021-11-11 16:55
閱讀 2935·2021-10-14 09:43
閱讀 1403·2021-09-23 11:22
閱讀 1045·2019-08-30 11:04
閱讀 1674·2019-08-29 11:10
閱讀 969·2019-08-27 10:56
閱讀 3124·2019-08-26 12:01