Meta+LibUnicode+LibJS: Upgrade to ICU 76.1

This updates our local ICU overlay port to use ICU 76.1. This includes
Unicode 16 and CLDR 46.

Upstream vcpkg is not able to supply versions past 74 yet due to various
dependency issues, but we are able to use this version ourselves. The
overlay port now includes a patch to revert ICU's dependence on autoconf
2.72 for now, as this version is not yet available on all systems.

All of the test changes were cross-referenced with Firefox to ensure
correctness.
This commit is contained in:
Timothy Flynn 2025-01-18 13:29:28 -05:00 committed by Tim Flynn
commit 6a564376fc
Notes: github-actions[bot] 2025-01-18 22:57:42 +00:00
13 changed files with 95 additions and 52 deletions

View file

@ -308,9 +308,9 @@ describe("day", () => {
describe("dayPeriod", () => {
// prettier-ignore
const data = [
{ dayPeriod: "narrow", en0: "5 in the afternoon", en1: "7 in the morning", ar0: "٥ بعد الظهر", ar1: "٧ صباحًا", as0: "অপৰাহ্ন ৫", as1: "পূৰ্বাহ্ন "},
{ dayPeriod: "short", en0: "5 in the afternoon", en1: "7 in the morning", ar0: "٥ بعد الظهر", ar1: "٧ ص", as0: "অপৰাহ্ন ৫", as1: "পূৰ্বাহ্ন "},
{ dayPeriod: "long", en0: "5 in the afternoon", en1: "7 in the morning", ar0: "٥ بعد الظهر", ar1: "٧ صباحًا", as0: "অপৰাহ্ন ৫", as1: "পূৰ্বাহ্ন "},
{ dayPeriod: "narrow", en0: "5 in the afternoon", en1: "7 in the morning", ar0: "٥ بعد الظهر", ar1: "٧ صباحًا", as0: "pm ৫", as1: "am "},
{ dayPeriod: "short", en0: "5 in the afternoon", en1: "7 in the morning", ar0: "٥ بعد الظهر", ar1: "٧ ص", as0: "PM ৫", as1: "AM "},
{ dayPeriod: "long", en0: "5 in the afternoon", en1: "7 in the morning", ar0: "٥ بعد الظهر", ar1: "٧ صباحًا", as0: "PM ৫", as1: "AM "},
];
test("all", () => {
@ -404,9 +404,9 @@ describe("dayPeriod", () => {
test("dayPeriod without time", () => {
// prettier-ignore
const data = [
{ dayPeriod: "narrow", en0: "in the afternoon", en1: "in the morning", ar0: "بعد الظهر", ar1: "صباحًا", as0: "অপৰাহ্ন", as1: "পূৰ্বাহ্ন"},
{ dayPeriod: "short", en0: "in the afternoon", en1: "in the morning", ar0: "بعد الظهر", ar1: "ص", as0: "অপৰাহ্ন", as1: "পূৰ্বাহ্ন"},
{ dayPeriod: "long", en0: "in the afternoon", en1: "in the morning", ar0: "بعد الظهر", ar1: "صباحًا", as0: "অপৰাহ্ন", as1: "পূৰ্বাহ্ন"},
{ dayPeriod: "narrow", en0: "in the afternoon", en1: "in the morning", ar0: "بعد الظهر", ar1: "صباحًا", as0: "pm", as1: "am"},
{ dayPeriod: "short", en0: "in the afternoon", en1: "in the morning", ar0: "بعد الظهر", ar1: "ص", as0: "PM", as1: "AM"},
{ dayPeriod: "long", en0: "in the afternoon", en1: "in the morning", ar0: "بعد الظهر", ar1: "صباحًا", as0: "PM", as1: "AM"},
];
data.forEach(d => {

View file

@ -124,13 +124,13 @@ describe("correct behavior", () => {
});
test("timeZone", () => {
const en = new Intl.DateTimeFormat("en", { timeZone: "EST5EDT" });
expect(en.resolvedOptions().timeZone).toBe("EST5EDT");
const en = new Intl.DateTimeFormat("en", { timeZone: "America/New_York" });
expect(en.resolvedOptions().timeZone).toBe("America/New_York");
const el = new Intl.DateTimeFormat("el", { timeZone: "UTC" });
expect(el.resolvedOptions().timeZone).toBe("UTC");
["UTC", "EST5EDT", "+01:02", "-20:30", "+00:00"].forEach(timeZone => {
["UTC", "America/New_York", "+01:02", "-20:30", "+00:00"].forEach(timeZone => {
const en = new Intl.DateTimeFormat("en", { timeZone: timeZone });
expect(en.resolvedOptions().timeZone).toBe(timeZone);

View file

@ -124,7 +124,7 @@ describe("correct behavior", () => {
expect(es419.of("Latn")).toBe("latín");
const zhHant = new Intl.DisplayNames(["zh-Hant"], { type: "script" });
expect(zhHant.of("Latn")).toBe("拉丁");
expect(zhHant.of("Latn")).toBe("拉丁字母");
expect(en.of("Aaaa")).toBe("Aaaa");
expect(es419.of("Aaaa")).toBe("Aaaa");
@ -211,14 +211,14 @@ describe("correct behavior", () => {
test("option type dateTimeField, style long", () => {
// prettier-ignore
const data = [
{ dateTimeField: "era", en: "era", es419: "era", zhHant: "年代" },
{ dateTimeField: "era", en: "era", es419: "era", zhHant: "紀元" },
{ dateTimeField: "year", en: "year", es419: "año", zhHant: "年" },
{ dateTimeField: "quarter", en: "quarter", es419: "trimestre", zhHant: "季" },
{ dateTimeField: "quarter", en: "quarter", es419: "trimestre", zhHant: "季" },
{ dateTimeField: "month", en: "month", es419: "mes", zhHant: "月" },
{ dateTimeField: "weekOfYear", en: "week", es419: "semana", zhHant: "週" },
{ dateTimeField: "weekday", en: "day of the week", es419: "día de la semana", zhHant: "週天" },
{ dateTimeField: "weekday", en: "day of the week", es419: "día de la semana", zhHant: "星期" },
{ dateTimeField: "day", en: "day", es419: "día", zhHant: "日" },
{ dateTimeField: "dayPeriod", en: "AM/PM", es419: "a.m./p.m.", zhHant: "上午/下午" },
{ dateTimeField: "dayPeriod", en: "AM/PM", es419: "a.m./p.m.", zhHant: "時段" },
{ dateTimeField: "hour", en: "hour", es419: "hora", zhHant: "小時" },
{ dateTimeField: "minute", en: "minute", es419: "minuto", zhHant: "分鐘" },
{ dateTimeField: "second", en: "second", es419: "segundo", zhHant: "秒" },
@ -239,16 +239,16 @@ describe("correct behavior", () => {
test("option type dateTimeField, style short", () => {
// prettier-ignore
const data = [
{ dateTimeField: "era", en: "era", es419: "era", zhHant: "年代" },
{ dateTimeField: "era", en: "era", es419: "era", zhHant: "紀元" },
{ dateTimeField: "year", en: "yr.", es419: "a", zhHant: "年" },
{ dateTimeField: "quarter", en: "qtr.", es419: "trim.", zhHant: "季" },
{ dateTimeField: "quarter", en: "qtr.", es419: "trim.", zhHant: "季" },
{ dateTimeField: "month", en: "mo.", es419: "m", zhHant: "月" },
{ dateTimeField: "weekOfYear", en: "wk.", es419: "sem.", zhHant: "週" },
{ dateTimeField: "weekday", en: "day of wk.", es419: "día de sem.", zhHant: "週天" },
{ dateTimeField: "weekday", en: "day of wk.", es419: "día de sem.", zhHant: "星期" },
{ dateTimeField: "day", en: "day", es419: "d", zhHant: "日" },
{ dateTimeField: "dayPeriod", en: "AM/PM", es419: "a.m./p.m.", zhHant: "上午/下午" },
{ dateTimeField: "hour", en: "hr.", es419: "h", zhHant: "時" },
{ dateTimeField: "minute", en: "min.", es419: "min", zhHant: "分" },
{ dateTimeField: "dayPeriod", en: "AM/PM", es419: "a.m./p.m.", zhHant: "時段" },
{ dateTimeField: "hour", en: "hr.", es419: "h", zhHant: "時" },
{ dateTimeField: "minute", en: "min.", es419: "min", zhHant: "分" },
{ dateTimeField: "second", en: "sec.", es419: "s", zhHant: "秒" },
{ dateTimeField: "timeZoneName", en: "zone", es419: "zona", zhHant: "時區" },
];
@ -267,16 +267,16 @@ describe("correct behavior", () => {
test("option type dateTimeField, style narrow", () => {
// prettier-ignore
const data = [
{ dateTimeField: "era", en: "era", es419: "era", zhHant: "年代" },
{ dateTimeField: "era", en: "era", es419: "era", zhHant: "紀元" },
{ dateTimeField: "year", en: "yr", es419: "a", zhHant: "年" },
{ dateTimeField: "quarter", en: "qtr", es419: "trim.", zhHant: "季" },
{ dateTimeField: "quarter", en: "qtr", es419: "trim.", zhHant: "季" },
{ dateTimeField: "month", en: "mo", es419: "m", zhHant: "月" },
{ dateTimeField: "weekOfYear", en: "wk", es419: "sem.", zhHant: "週" },
{ dateTimeField: "weekday", en: "day of wk.", es419: "día de sem.", zhHant: "週天" },
{ dateTimeField: "weekday", en: "day of wk.", es419: "día de sem.", zhHant: "星期" },
{ dateTimeField: "day", en: "day", es419: "d", zhHant: "日" },
{ dateTimeField: "dayPeriod", en: "AM/PM", es419: "a.m./p.m.", zhHant: "上午/下午" },
{ dateTimeField: "hour", en: "hr", es419: "h", zhHant: "時" },
{ dateTimeField: "minute", en: "min", es419: "min", zhHant: "分" },
{ dateTimeField: "dayPeriod", en: "AM/PM", es419: "a.m./p.m.", zhHant: "時段" },
{ dateTimeField: "hour", en: "hr", es419: "h", zhHant: "時" },
{ dateTimeField: "minute", en: "min", es419: "min", zhHant: "分" },
{ dateTimeField: "second", en: "sec", es419: "s", zhHant: "秒" },
{ dateTimeField: "timeZoneName", en: "zone", es419: "zona", zhHant: "時區" },
];

View file

@ -24,9 +24,9 @@ describe("special values", () => {
expect(en.format(undefined)).toBe("NaN");
const ar = new Intl.NumberFormat("ar-u-nu-arab");
expect(ar.format()).toBe("ليس رقم");
expect(ar.format(NaN)).toBe("ليس رقم");
expect(ar.format(undefined)).toBe("ليس رقم");
expect(ar.format()).toBe("ليس رقمًا");
expect(ar.format(NaN)).toBe("ليس رقمًا");
expect(ar.format(undefined)).toBe("ليس رقمًا");
});
test("Infinity", () => {

View file

@ -20,9 +20,9 @@ describe("special values", () => {
expect(en.formatToParts(undefined)).toEqual([{ type: "nan", value: "NaN" }]);
const ar = new Intl.NumberFormat("ar-u-nu-arab");
expect(ar.formatToParts()).toEqual([{ type: "nan", value: "ليس رقم" }]);
expect(ar.formatToParts(NaN)).toEqual([{ type: "nan", value: "ليس رقم" }]);
expect(ar.formatToParts(undefined)).toEqual([{ type: "nan", value: "ليس رقم" }]);
expect(ar.formatToParts()).toEqual([{ type: "nan", value: "ليس رقمًا" }]);
expect(ar.formatToParts(NaN)).toEqual([{ type: "nan", value: "ليس رقمًا" }]);
expect(ar.formatToParts(undefined)).toEqual([{ type: "nan", value: "ليس رقمًا" }]);
});
test("Infinity", () => {

View file

@ -19,7 +19,7 @@ describe("special values", () => {
test("NaN", () => {
expect(NaN.toLocaleString()).toBe("NaN");
expect(NaN.toLocaleString("en")).toBe("NaN");
expect(NaN.toLocaleString("ar-u-nu-arab")).toBe("ليس رقم");
expect(NaN.toLocaleString("ar-u-nu-arab")).toBe("ليس رقمًا");
});
test("Infinity", () => {