diff --git a/README.md b/README.md index 0e73a6ea36..e8e5e1e752 100755 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ List of Definitions * [i18next](http://i18next.com/) (by [Maarten Docter](https://github.com/mdocter)) * [iCheck](http://damirfoy.com/iCheck/) (by [Dániel Tar](https://github.com/qcz)) * [Impress.js](https://github.com/bartaz/impress.js) (by [Boris Yankov](https://github.com/borisyankov)) +* [Intl](http://www.ecma-international.org/ecma-402/1.0/) (by [Jeffery Grajkowski](http://github.com/pushplay)) * [iScroll](http://cubiq.org/iscroll-4) (by [Boris Yankov](https://github.com/borisyankov)) * [jake](https://github.com/mde/jake) (by [Kon](http://phyzkit.net/)) * [Jasmine](http://pivotal.github.com/jasmine/) (by [Boris Yankov](https://github.com/borisyankov)) diff --git a/intl/intl-tests.ts b/intl/intl-tests.ts new file mode 100644 index 0000000000..d2a9967393 --- /dev/null +++ b/intl/intl-tests.ts @@ -0,0 +1,90 @@ +/// + +// Collator + +alert(Intl.Collator.supportedLocalesOf(["ban", "id-u-co-pinyin", "de-ID"], { localeMatcher: "lookup" }).join(", ")); +// → "id-u-co-pinyin, de-ID" + +// in German, ä sorts with a +alert(new Intl.Collator("de").compare("ä", "z").toString()); +// → a negative value + +// in Swedish, ä sorts after z +alert(new Intl.Collator("sv").compare("ä", "z").toString()); +// → a positive value + +// in German, ä has a as the base letter +alert(new Intl.Collator("de", { sensitivity: "base" }).compare("ä", "a").toString()); +// → 0 + +// in Swedish, ä and a are separate base letters +alert(new Intl.Collator("sv", { sensitivity: "base" }).compare("ä", "a").toString()); +// → a positive value + +var a = ["Offenbach", "Österreich", "Odenwald"]; +var collator = new Intl.Collator("de-u-co-phonebk"); +a.sort(collator.compare); +alert(a.join(", ")); +// → "Odenwald, Österreich, Offenbach" + + +// DateTimeFormat + +alert(Intl.DateTimeFormat.supportedLocalesOf(["ban", "id-u-co-pinyin", "de-ID"], { localeMatcher: "lookup" }).join(", ")); +// → "id-u-co-pinyin, de-ID" + +// toLocaleString without arguments depends on the implementation, +// the default locale, and the default time zone +alert(new Intl.DateTimeFormat().format(new Date(Date.UTC(2012, 11, 20, 3, 0, 0)))); +// → "12/19/2012" if run in en-US locale with time zone America/Los_Angeles + +alert(new Intl.DateTimeFormat("sr-RS", { weekday: "long", year: "numeric", month: "long", day: "numeric" }).format(new Date())); +// → "недеља, 7. април 2013." + +alert([new Date(2012, 08), new Date(2012, 11), new Date(2012, 03)].map(new Intl.DateTimeFormat("pt-BR", { year: "numeric", month: "long" }).format).join("; ")); +// → "setembro de 2012; dezembro de 2012; abril de 2012" + + +// NumberFormat + +alert(Intl.NumberFormat.supportedLocalesOf(["ban", "id-u-co-pinyin", "de-ID"], { localeMatcher: "lookup" }).join(", ")); +// → "id-u-co-pinyin, de-ID" + +alert(new Intl.NumberFormat("ru-RU", { style: "currency", currency: "RUB" }).format(654321.987)); +// → "654 321,99 руб." + +alert([123456.789, 987654.321, 456789.123].map(new Intl.NumberFormat("es-ES").format).join("; ")); +// → "123.456,789; 987.654,321; 456.789,123" + +// German uses comma as decimal separator and period for thousands +alert(new Intl.NumberFormat("de-DE").format(123456.789)); +// → 123.456,789 + +// Arabic in most Arabic speaking countries uses real Arabic digits +alert(new Intl.NumberFormat("ar-EG").format(123456.789)); +// → ١٢٣٤٥٦٫٧٨٩ + +// India uses thousands/lakh/crore separators +alert(new Intl.NumberFormat("en-IN").format(123456.789)); +// → 1,23,456.789 + +// the nu extension key requests a numbering system, e.g. Chinese decimal +alert(new Intl.NumberFormat("zh-Hans-CN-u-nu-hanidec").format(123456.789)); +// → 一二三,四五六.七八九 + +// when requesting a language that may not be supported, such as +// Balinese, include a fallback language, in this case Indonesian +alert(new Intl.NumberFormat(["ban", "id"]).format(123456.789)); +// → 123.456,789 + +// request a currency format +alert(new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR" }).format(123456.789)); +// → 123.456,79 € + +// the Japanese yen doesn't use a minor unit +alert(new Intl.NumberFormat("ja-JP", { style: "currency", currency: "JPY" }).format(123456.789)) +// → ¥123,457 + +// limit to three significant digits +alert(new Intl.NumberFormat("en-IN", { maximumSignificantDigits: 3 }).format(123456.789)); +// → 1,23,000 \ No newline at end of file diff --git a/intl/intl.d.ts b/intl/intl.d.ts new file mode 100644 index 0000000000..bc3359483e --- /dev/null +++ b/intl/intl.d.ts @@ -0,0 +1,102 @@ +// Type definitions for Intl +// Project: http://www.ecma-international.org/ecma-402/1.0/ +// Definitions by: Jeffery Grajkowski +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +declare module Intl { + + export interface SupportedLocalesOfOptions { + localeMatcher?: string; + } + + export interface CollatorOptions { + localeMatcher?: string; + usage?: string; + sensitivity?: string; + ignorePunctuation?: boolean; + numeric?: boolean; + caseFirst?: string; + } + + export class Collator { + constructor(locales?: string, options?: CollatorOptions); + constructor(locales?: string[], options?: CollatorOptions); + static supportedLocalesOf(locales: string, options?: SupportedLocalesOfOptions): string[]; + static supportedLocalesOf(locales: string[], options?: SupportedLocalesOfOptions): string[]; + compare(string1: string, string2: string): number; + resolvedOptions(): { + locale: string; + usage: string; + sensitivity: string; + ignorePunctuation: boolean; + collation: string; + numeric: boolean; + caseFirst: string; + }; + } + + export interface DateTimeFormatOptions { + localeMatcher?: string; + timeZone?: string; + hour12?: boolean; + formatMatcher?: boolean; + } + + export class DateTimeFormat { + constructor(locales?: string, options?: DateTimeFormatOptions); + constructor(locales?: string[], options?: DateTimeFormatOptions); + static supportedLocalesOf(locales: string, options?: SupportedLocalesOfOptions): string[]; + static supportedLocalesOf(locales: string[], options?: SupportedLocalesOfOptions): string[]; + format(date: Date): string; + resolvedOptions(): { + locale: string; + calendar: string; + numberingSystem: string; + timeZone: string; + hour12?: boolean; + weekday?: string; + era?: string; + year?: string; + month?: string; + day?: string; + hour?: string; + minute?: string; + second?: string; + timeZoneName?: string; + }; + } + + export interface NumberFormatOptions { + localeMatcher?: string; + style?: string; + currency?: string; + currencyDisplay?: string; + useGrouping?: boolean; + minimumIntegerDigits?: number; + minimumFractionDigits?: number; + maximumFractionDigits?: number; + minimumSignificantDigits?: number; + maximumSignificantDigits?: number; + } + + export class NumberFormat { + constructor(locales?: string, options?: NumberFormatOptions); + constructor(locales?: string[], options?: NumberFormatOptions); + static supportedLocalesOf(locales: string, options?: SupportedLocalesOfOptions): string[]; + static supportedLocalesOf(locales: string[], options?: SupportedLocalesOfOptions): string[]; + format(n: number): string; + resolvedOptions(): { + locale: string; + numberingSystem: string; + style: string; + useGrouping: boolean; + currency?: string; + currencyDisplay?: string; + minimumIntegerDigits?: number; + minimumFractionDigits?: number; + maximumFractionDigits?: number; + minimumSignificantDigits?: number; + maximumSignificantDigits?: number; + } + } +} \ No newline at end of file