i18n(ar): register Arabic as the first right-to-left language

- Add ar to LOCALES (picker name العربية) and RTL_LOCALES, so <html dir>
  turns rtl; any ar-* tag maps to it.
- Intl formatters get ar-u-nu-latn: numbers and dates keep Western digits
  like the catalog, whatever the browser's ICU picks for Arabic regions.
- HUD quantities keep a space before an Arabic unit (2069.0 كم), as in
  Chinese, instead of running digits into the word.
- Codes and product names that stay Latin go to same-as-english.json.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Opus 5.5 committed 2026-10-28 12:55:20 +04:00
1 parent 94dc2736e1
commit 0b928b6810
8 files changed
+239 -8

No files matched your search

+7 -1
View File
@@ -8,6 +8,12 @@ import { formatNumber, getLocale, t } from './i18n/index.js';
import { unitLabel } from './ui/unitLabels.js';
import { localizePlaceName } from './ui/placeNames.js';
/**
* Scripts without letter case keep a space before the unit: `13 km`, `13 كم`.
* Arabic would otherwise run the digits into the word.
*/
const UNCASED_UNITS = /^(?:zh-|ar$)/;
/** An upper-case HUD quantity such as `13KM` / `13КМ`, in the active language. */
export function hudQuantity(value, unit, digits = 0) {
const number = formatNumber(value, {
@@ -16,7 +22,7 @@ export function hudQuantity(value, unit, digits = 0) {
maximumFractionDigits: digits,
});
const label = unitLabel(unit);
if (getLocale().startsWith('zh-'))
if (UNCASED_UNITS.test(getLocale()))
return label ? `${number} ${label}` : number;
return `${number}${label.toUpperCase()}`;
}