Files
Sameh Khamis bc5d038afd Merge Core main into german/hal-644-ar: Arabic on the Vue UI
Main moved the UI to Vue views and Pinia stores, so the Arabic changes to
the old DOM controllers now live in their views: the rail legend range
comes from formatScaleRange (keeping units a source supplies as given),
the voice timeout options are worded by Intl unit formatting in
VoiceControl, and the scene editor's JSON fields stay left to right in
SceneDialog. Main's CCTV status line, launch panel and calibration values
keep the Arabic isolates and Western-digit formatting.

isolate() and keepCodesWithValues() read the locale through getLocale(),
which follows the page's vue-i18n instance, and the Intl formatters take
intlLocale(getLocale()). A language switch now applies in place, and
applyDocumentLanguage sets <html dir> on every switch, so the page mirrors
without a reload.

The icon rails and their tips are placed with logical properties, so they
stay on the outer side of the mirrored stacks; Cyber's new stack offsets,
padding and edge lines are logical too, and rtl.css moves Cyber's right
stack to its new rail clearance. Main removed the Context mini radio, so its
right-to-left rules and test go.

The Arabic catalog gains main's new strings and drops the ones main no
longer uses; the other catalogs keep main's new keys and the branch's
landing labels.
2026-11-01 20:15:02 -08:00

15 KiB
Raw Permalink Blame History

Arabic (ar)

Catalog: src/i18n/locales/ar.json. General rules: TRANSLATORS.md.

Translation sources: abiyeenzo (#915).

Style

  • Modern Standard Arabic, neutral across regions. Address the user with plain imperatives: «انقر»، «فعّل»، «أعد المحاولة».
  • Arabic has no letter case: an UPPERCASE English HUD label becomes the same short Arabic label. Keep labels as short as the English: «مباشر»، «متقادم»، «متوقف».
  • Status words in progress use «جارٍ …» («جارٍ التحميل»، «جارٍ الضبط»، «… جارٍ تشغيل اللقطة»), so a status chip never reads as the command next to it («ضبط» is the TUNE button); finished actions use the passive («تم الحفظ»، «أُلغي التحميل»). Data that refreshes itself «يُحدَّث» (يتحدّث means "speaks"). A sentence about a {placeholder} whose gender and number vary (tool, layer and cohort names, call signs, vessel names) stays impersonal: «{layers}: تم التفعيل للتو»، ««{name}» قيد الاستخدام»، «{id}: لا بيانات واردة الآن»، «لم يعد {name} ضمن البيانات المحمّلة».
  • A label followed by its value takes a colon, so it does not read as a sentence: «الصوت: نشط»، «السياق: {value}»، «الاحتواء: {percent}%». A named mode or control quoted in a sentence takes «»: «يظهر في وضع «كثيف» فقط».
  • Arabic punctuation in Arabic text: ، ؛ ؟ and «» for quotes. Keep · as the HUD separator, — with spaces, and ….
  • Arrows that show a sequence point the way Arabic reads: «الإشارات ← الأخبار ← المحلي», «{origin} ← {destination}».
  • Product names, provider names and codes stay in Latin letters: Google, Cesium ion, CelesTrak, NOAA, FIRMS, AIS, ADS-B, GNSS, CCTV, HUD, CRT, NVG, FLIR, WHOT/BHOT, Ironbow, Street View, Mapillary. Aviation and camera abbreviations stay Latin too: HDG, FOV, BRG, CRS, GS, TRK, V/S, SQUAWK. Local place names from the Bhote Koshi scene (Rasuwagadhi, Bidur, Timure…) stay Latin, and a site known by two names takes one Arabic noun in front: «جسر Mailung / Upper Trishuli»; well-known cities and countries are written in Arabic (أوستن، طوكيو، نيبال).
  • Months are the international names used across the Arab world: يناير، فبراير … أغسطس.

Digits and direction

  • Western digits (0–9), as in the catalog. The HUD reads like an instrument panel, and mixing ٠–٩ with Latin codes and coordinates misreads. intlLocale('ar') in src/i18n/locale.js passes ar-u-nu-latn to every Intl formatter, so browsers that default to Arabic-Indic digits for an Arabic region still show 0–9.
  • Right to left. ar is in RTL_LOCALES, so the page gets <html dir="rtl">. The title, style indicator, both panel stacks and their icon rails swap sides; the dock and the corner row reverse. The intel HUD (classification block, MGRS, coordinates, GSD) stays a left-to-right instrument overlay; its translated lines read right to left inside it. FM seek and the radio dial stay left to right, as on any receiver. The rails' screen-reader names follow the mirrored layout: «Left panels» is «اللوحات اليمنى». Layout rules: src/ui/styles/rtl.css.
  • Latin runs inside Arabic sentences (product names, codes, {placeholders} filled with English data) are isolated by the bidi algorithm; write them as plain text, without manual direction marks.
  • Position counters: a translated counter says «من» («القناة {index} من {total}», «الإطار {index} من {total}»); a spaced slash between two isolated numbers swaps them in right-to-left text. Counters the code builds from bare numbers (01 / 25, 1 / 3) are shown left to right by rtl.css.
  • Code stays left to right: the JSON fields of the scene editor are LTR in every language.
  • Comparison signs < and > are mirrored glyphs in right-to-left text («< 2%» shows as «> 2%»). Write them as words: «أقل من 2%»، «أكثر من 10%»، «أقل من ساعة». A legend's open upper bound («300+», «-40») is isolated by formatScaleLabel(), so its sign stays where it is written; formatScaleRange() isolates the unit after the range too («°C», not «C°»).

Units

Distances and speeds take Arabic abbreviations after the number, with a space: كم، م، كم/س، كم/ث، م/ث، ميل/س، عقدة (knots)، قدم (feet)، مم. Time: ث (seconds)، د (minutes)، س (hours)، يوم; compact age labels («3d», «5D AGO») use ي: «{count} ي»، «قبل {count} ي», since a plain string cannot make يوم agree with the count. Area: آكر (acres, the value is not converted; فدان is a different unit). Money: the word دولار after the amount, not a bare $: «{amount} مليون دولار». Scientific and radio units stay Latin: MHz، dB، dBFS، dBZ، hPa، MW، MiB. ° and % stay. Hemisphere letters in coordinates: ش (N)، ج (S)، ق (E)، غ (W), as in 21.33ش.

Plurals

Intl.PluralRules('ar') uses all six CLDR categories, and a tn() entry needs every one:

Form Counts Example
zero 0 0 مصدر
one 1 مصدر واحد (1)
two 2 مصدران (2)
few 3–10, 103–110… 3 مصادر
many 11–99, 111–199… 11 مصدرًا
other 100–102, 200–202, fractions 100 مصدر

Every form must keep {count}. For one and two, Arabic names the quantity with the noun itself (مصدر واحد، مصدران), so the number follows in parentheses. few takes the plural noun; many the accusative singular (مصدرًا، مفتاحًا); zero and other the genitive singular. When a word next to the number cannot agree in every form, or a short chip has no room, put the number after a colon instead: «القريبة: {count}»، «الملفات المحددة: {count}». Where neither fits, «من أصل {total} من السجلات» agrees with any number. A standalone unit label («الدقائق») is never glued after a number: the voice-timeout options («3 دقائق»، «15 دقيقة») come from Intl.NumberFormat unit formatting, not from the catalog.

Glossary

English العربية
layer / data layer طبقة / طبقة بيانات
feed / source مصدر بيانات (short: مصدر) / مصدر
LIVE (status) / live data مباشر / البيانات المباشرة (not حي)
Live ships, live detections (descriptions) بيانات مباشرة عن السفن، رصد مباشر (not the adverb مباشرةً)
track, tracking تتبّع (always with the shadda)
SIMULATED محاكى (status) / محاكاة
stale / degraded / unavailable متقادم / متدهور / غير متاح
ON / OFF (state) مفعّل / متوقف
retry إعادة المحاولة
key (API key) / POWER UP مفتاح (مفتاح API) / تشغيل
Provider Settings إعدادات المزوّدين
globe / map / map source / basemap الكرة الأرضية / الخريطة / مصدر الخريطة / الخريطة الأساسية
globe map (map source drawn on the globe) خريطة على الكرة الأرضية (not خريطة كروية)
tiles بلاطات
aircraft / flight / military flights طائرة / رحلة / الرحلات العسكرية
Live Flights / Live Vessels (layers) تتبّع الرحلات / السفن المباشر (not الرحلات المباشرة)
call sign رمز النداء
vessel, ship سفينة
satellite قمر صناعي
launch (rocket) / space mission إطلاق / مهمة فضائية
contact (tracked object) هدف
installation, site / mapped منشأة، موقع / مرسوم
camera / CCTV camera كاميرا / كاميرا CCTV
earthquake / active fire / fire perimeter زلزال / حريق نشط / محيط حريق
containment (wildfire) احتواء (not السيطرة)
cyclone advisory نشرة إعصار
scene / shot / scene recipe مشهد / لقطة / قالب المشهد
briefing / panel / dock إحاطة / لوحة / الشريط السفلي
preset / visual preset إعداد مسبق / نمط بصري
Scope (circular viewport mask) / keyhole المنظار / الفتحة
Clean UI / EXIT CLEAN VIEW واجهة نظيفة / الخروج من الواجهة النظيفة (not العرض)
cockpit القمرة (قمرة القيادة)
heading / altitude / ground speed الاتجاه (HDG) / الارتفاع / السرعة الأرضية
Street Level / Street View مستوى الشارع / Street View
Recent Imagery الصور الحديثة
Global Context / Context السياق العالمي / السياق
radio station / tuner / gain محطة / موالف / الكسب
broadcaster (radio stream) محطة البث (not المحطة المُذيعة)
VOLUME (slider) / VOICE مستوى الصوت / الصوت
decoder (SDR) مفكّك
transit / bike share النقل العام / الدراجات المشتركة
Previous / Next السابق / التالي
compass points (N, NNE, …) شمال، شمال شمال شرق، …
forecast / valid (time) / issued توقع / عند، وقت التوقع (not صالح حتى) / صدر
observation / observed رصد / مرصود
heard (aircraft received by the SDR) الملتقطة
upstream (camera feed) المصدر الأصلي (in every CCTV message, not bare المصدر)
field (weather) / model حقل / نموذج
parameters / ellipsoid المعلمات / المجسّم الإهليلجي
scene cloud غيوم المشهد
box (Recent Imagery area) / pin منطقة / تثبيت
width (box size) / view (current camera) اتساع / العرض الحالي (عرض alone reads as display)
N/A غير متاح (no abbreviation)
METRO (view band) / REGIONAL حضري (not حاضرة) / إقليمي
THIS (voice pointer) هذا
outline / mark (map annotation) مخطط / علامة، تعليم
share (a view or link) مشاركة
AI agent وكيل ذكاء اصطناعي
spacecraft مركبة فضائية (مركبة alone is any vehicle)
stage (rocket) / downrange مرحلة / على امتداد المسار
landing position: CONFIRMED / PAD (RTLS) مؤكَّد / منصة الإطلاق
recovery (rocket stage) استعادة (not استرجاع)
Arrive at your destination (route step) الوصول إلى وجهتك (a step, not وصلت)
forecast lead hours مدة التوقع بالساعات (not ساعات المهلة)
cel-shaded بتظليل كرتوني
(debris-)dammed lake بحيرة خلف سدّ (ركامي)
frame (bring into view) إظهار في الإطار
story beat مرحلة القصة