مواصفات بطاقة اللغة
المصدر الوحيد للحقيقة. يُحدِّد هذا المستند الشكل المعياري لكل بطاقة لغة. يجب أن تحتوي كل بطاقة على كل حقل من الحقول العليا المذكورة هنا، حتى عندما تكون القيمة
nullأو[]. البطاقة التي ينقصها حقل تُعتبر غير مطابقة للمواصفات. هذا التوحيد هو ما يتيح للأدوات الآلية وأدوات الفحص (linters) وسكربتات الإثراء والمراجعين البشريين الوثوق ببنية البطاقة.
مبادئ التصميم
-
شكل موحَّد. جميع البطاقات التي يزيد عددها على 8,000 بطاقة لها نفس الحقول العليا. القيم غير المعروفة هي
null، والمصفوفات الفارغة هي[]، والكائنات الفارغة هيnull(وليس{}). هذا يعني أن الشيفرة لا تحتاج أبدًا إلى التحقق من "هل هذا الحقل موجود؟" — بل فقط "هل هو معبَّأ بالبيانات؟" -
توثيق مصدر كل شيء. كل ادعاء واقعي يُسنَد إلى مصدر أولي مُسمّى ومُحدَّد الإصدار. الادعاءات غير الموثَّقة المصدر هي ادعاءات لا يمكن التحقق منها. حقل
dataSources(وتعليقاتsourceعلى مستوى كل حقل في الكائنات الفرعية) تجعل مصدر البيانات صريحًا. -
الحفاظ على الاختلاف. عندما تختلف المراجع (تقول Wikidata إن عدد المتحدثين 50,000 بينما تقول Ethnologue 20,000)، نُخزِّن كلتا القيمتين مع نسبة كل منهما إلى مصدرها. لا نحسب المتوسط ولا نحسم الخلاف ولا ننحاز لطرف. يمكن للمستخدمين التعامل مع هذه الفروق الدقيقة.
-
القيمة الفارغة (null) تعني "غير معروف" وليس "غير قابل للتطبيق". إذا كان حقل ما
null، فهذا يعني "لم نعثر على بيانات لهذا الحقل بعد." أما إذا كان الحقل غير قابل للتطبيق فعلاً (مثلgrammatical genderللغة إشارة)، فينبغي أن توضِّح القيمة ذلك:{ "grammatical": false, "inclusiveGuidance": "Not applicable — ASL does not have grammatical gender." } -
الدمج فقط. سكربتات الإثراء تضيف البيانات ولا تستبدلها أبدًا. القيم المنسَّقة يدويًا لها الأولوية على البيانات الآلية.
بنية الطبقات الثلاث
| الطبقة | الموقع | الغرض |
|---|---|---|
| بطاقات اللغة | shared/language-cards/<code>.json | إعدادات لكل لغة: الهوية، التصنيف، الموارد، كل شيء |
| بطاقات المجموعة (genus) | shared/language-cards/genera/<genus>.json | خصائص وقت التشغيل المشتركة للغات ذات الصلة (منسَّقة يدويًا، وليست مولَّدة آليًا) |
| شجرة اللغات | shared/language-cards/language-tree.json | التسلسل الهرمي الكامل من Glottolog — بيانات مرجعية لواجهة Lab واستكشاف اللغات |
نموذج الوراثة
عندما تُعيِّن بطاقة ما "extends": "family-dravidian"، يقوم وقت التشغيل بدمج البطاقة الأم
في البطاقة الفرعية باستخدام _deepMerge() (في lib/registers.js). هذا يتيح
لبطاقات المجموعة (genus) تعريف السجلات اللغوية المشتركة وأنظمة الرسمية وإرشادات النوع الاجتماعي
بحيث تنتقل إلى جميع اللغات الأعضاء — دون تكرار البيانات عبر مئات
البطاقات الفردية.
دلالات الدمج
| قيمة البطاقة الفرعية | السلوك | السبب |
|---|---|---|
null | الوراثة من البطاقة الأم | null تعني "أنا لا أُعرِّف هذا" — قيمة البطاقة الأم تنتقل إلى الفرعية |
| غير فارغة | استبدال قيمة البطاقة الأم | بيانات البطاقة الفرعية أكثر تحديدًا — لها الأولوية |
| كائن متداخل | دمج تكراري | حقول البطاقة الفرعية تستبدل، وحقول البطاقة الأم تُحفظ |
| مصفوفة | استبدال كامل | المصفوفات لا تُدمج عنصرًا بعنصر — مصفوفة البطاقة الفرعية هي التي تسود |
حقول الهوية (لا تُورَّث أبدًا)
بعض الحقول تخص البطاقة نفسها ويجب ألا تُورَّث أبدًا من البطاقة الأم:
code, extends, _migration, aliases, iso639_1, iso639_3
حتى لو عرَّفت بطاقة أم aliases: ["macro-code"]، فإن البطاقة الفرعية لن
ترث تلك الأسماء البديلة. هذه الحقول هي دائمًا قيم البطاقة الفرعية الخاصة (بما في ذلك
null إذا لم تُعيَّن).
السبب: بدون هذه القاعدة، سترث كل لغة من لغات الكري (Cree) قيمة aliases: ["cre"]
من بطاقة اللغة الكلية (macrolanguage) الأم، مما يجعل كل تنويعة اسمًا بديلًا للغة الكلية.
مثال: كيف تُحلَّل بطاقة لغة الكري
┌───────────────────────┐
│ family-algic.json │ formality: null, registers: null
│ (no registers) │
└──────────┬────────────┘
│ extends
┌──────────┴────────────┐
│ genus-cree.json │ formality: { system: "obviative-animate", ... }
│ (sourced registers) │ registers: { formal: {...}, informal: {...} }
└──────────┬────────────┘
│ extends
┌──────────┴────────────┐
│ crk.json │ code: "crk", extends: "genus-cree"
│ (Plains Cree) │ formality: null → inherits from genus-cree
│ │ registers: null → inherits from genus-cree
│ │ script: "Cans" → own value, no inheritance
│ │ code: "crk" → identity field, never inherited
└───────────────────────┘
في وقت التشغيل، يُرجع getLanguageCard("crk") كائنًا مدموجًا يضم سجلات genus-cree
- خصائص family-algic (إن وُجدت) + هوية crk وبياناتها الوصفية الخاصة.
قالب بطاقة المجموعة (genus)
تقع بطاقات المجموعة في shared/language-cards/genera/ وتُعرِّف الخصائص المشتركة
لمجموعة لغوية. وهي تتبع نفس مخطط البطاقات العادية ولكن
باصطلاحات مختلفة:
{
// Identity — genus cards use a prefixed code, NOT an ISO 639-3 code
"code": "genus-cree", // "genus-", "family-", or "macrolanguage-" prefix
"name": "Cree Languages", // Human-readable group name
"extends": "family-algic", // Genus cards can extend family cards (chaining)
// Formality — shared across the group, sourced from typological databases
"formality": {
"system": "obviative-animate",
"description": "Cree languages use an obviative/proximate system...",
"default": "formal",
"source": "WALS 37A, 38A + Wolfart 1973"
},
// Registers — shared presets, if the group shares a formality system
"registers": {
"formal": {
"label": "Formal (Proximate)",
"description": "...",
"prompt": "...",
"isDefault": true
},
"informal": {
"label": "Informal",
"description": "...",
"prompt": "..."
}
},
// Gender — shared grammatical gender behavior
"gender": {
"grammatical": false, // Cree doesn't have grammatical gender
"inclusiveGuidance": null // so no inclusive guidance needed
},
// Everything else is null — individual cards provide their own
// classification, geography, resources, etc.
"classification": null,
"methodSupport": null,
// ...
}
قاعدة أساسية: يجب ألا تحتوي بطاقات المجموعة إلا على بيانات مشتركة فعلًا عبر المجموعة بأكملها ومستندة إلى مراجع موثوقة. إذا كان نظام الرسمية يختلف بين الأعضاء، فمكانه البطاقات الفردية وليس بطاقة المجموعة.
القالب المعياري
يجب أن يكون لكل بطاقة هذا الشكل الأعلى بالضبط. مخططات الكائنات الفرعية موثَّقة في مرجع الحقول أدناه.
{
// ═══════════════════════════════════════════════════════════════════════
// § 1. IDENTITY
// Who is this language? What codes identify it?
// Sources: ISO 639-3 registry, ISO 639-1, BCP 47/IANA.
// ═══════════════════════════════════════════════════════════════════════
"code": "xxx", // REQUIRED. ISO 639-3 code. This IS the card ID and filename.
"name": "English Name", // REQUIRED. English reference name from ISO 639-3 registry.
"nativeName": null, // Endonym (name in the language itself). Source: Wikidata P1705.
// Examples: "nêhiyawêwin / ᓀᐦᐃᔭᐍᐏᐣ", "日本語", "Esperanto".
"alternateNames": [], // Other names this language is known by. Source: Glottolog, Ethnologue.
// Not aliases (those are code-level). These are name-level variants.
// Example: ["Qafar af", "Afaraf", "'Afar Af"] for Afar (aar).
"iso639_3": "xxx", // REQUIRED. Three-letter ISO 639-3 code. Same as `code`.
"iso639_1": null, // Two-letter ISO 639-1 code (e.g., "en", "fr"). null if none.
"bcp47": null, // IETF BCP 47 tag. Often same as iso639_1. Can include subtags
// (e.g., "iu-Cans-CA"). null if unknown.
"aliases": [], // Alternative code-level identifiers that resolve to this card.
// Example: ["fil"] for tl (Tagalog), ["iu"] for iku (Inuktitut).
// Used by code resolution: user types "fil", system loads tl.json.
"isoScope": "I", // REQUIRED. ISO 639-3 scope:
// "I" = Individual language
// "M" = Macrolanguage (e.g., Chinese, Arabic, Cree)
// "S" = Special (e.g., mis, mul, zxx)
"isoType": "L", // REQUIRED. ISO 639-3 type:
// "L" = Living "E" = Extinct "A" = Ancient
// "H" = Historical "C" = Constructed
"macrolanguage": null, // If this language is part of a macrolanguage, the macrolanguage
// ISO 639-3 code (e.g., "cre" for Plains Cree, "ara" for Arabic
// varieties). Source: ISO 639-3 macrolanguages.tab.
"extends": null, // Genus card key if shared properties are inherited from a genus
// card (e.g., "genus-cree", "genus-eskimo-aleut").
// null for most languages.
// ═══════════════════════════════════════════════════════════════════════
// § 2. CLASSIFICATION
// Where does this language sit in the family tree?
// Source: Glottolog. NEVER hand-build classifications.
// ═══════════════════════════════════════════════════════════════════════
"glottocode": null, // Glottolog identifier (e.g., "plai1258", "stan1293").
// null if the language is not in Glottolog.
"classification": null, // Genealogical classification from Glottolog. When populated:
// {
// "family": "Algic", // Top-level family. null for isolates.
// "familyGlottocode": "algi1248", // Glottocode of the family.
// "genus": "Plains Creeic", // WALS-style genus.
// "genusGlottocode": "plai1264", // Glottocode of the genus.
// "ancestry": ["Algic", "Algonquian-Blackfoot", "Algonquian",
// "Cree-Montagnais-Naskapi", "Cree", "Plains Creeic"]
// }
// For isolates: family = language name, genus = language name,
// ancestry = [language name].
"isIsolate": false, // true if a language isolate (no known genetic relatives).
// Source: Glottolog CLDF.
// ═══════════════════════════════════════════════════════════════════════
// § 3. GEOGRAPHY
// Where is this language spoken?
// Sources: Glottolog (coordinates, countries), census data, Ethnologue.
// ═══════════════════════════════════════════════════════════════════════
"macroarea": null, // Glottolog macroarea. One of: "Africa", "Australia",
// "Eurasia", "North America", "Papunesia", "South America".
// null if unknown. Source: Glottolog CLDF.
"coordinates": null, // Representative geographic point. When populated:
// { "lat": 52.1, "lng": -106.6, "source": "glottolog-5.3" }
// This is a representative point, not a boundary.
"countries": [], // ISO 3166-1 alpha-2 country codes where this language is spoken.
// Example: ["CA", "US"]. Source: Glottolog.
"regions": [], // Detailed regional breakdown with admin codes & speaker estimates.
// Each entry:
// {
// "country": "Canada",
// "countryCode": "CA",
// "officialStatus": "recognized", // official, co-official,
// // recognized, none
// "region": "Saskatchewan, Alberta, Manitoba",
// "speakerEstimate": "~20,000",
// "coordinates": [-106.6, 52.1], // [lng, lat]
// "admin1Codes": ["CA-SK", "CA-AB", "CA-MB"]
// }
"arealContext": null, // Linguistic area / Sprachbund membership. DISTINCT from
// contactInfluences (which is language-specific contact history).
// This field captures zone-level typological convergence patterns
// — i.e., what linguistic area the language exists within and
// what features are common across that area.
// {
// "zone": "Mainland Southeast Asian Sprachbund",
// "arealFeatures": "Tonal convergence, classifier systems,
// topic-prominence, monosyllabicity trend.",
// "typicalContacts": ["Classical Chinese", "Sanskrit/Pali"],
// "source": "areal-linguistics (Enfield 2005)"
// }
// NOT the same as contactInfluences. A language can exist within
// a convergence area without having specific contact history with
// any particular language in that area.
// ═══════════════════════════════════════════════════════════════════════
// § 4. WRITING SYSTEMS
// How is this language written?
// Sources: Wikidata P282, ISO 15924, manual research.
// Note: Some languages have NO standardized orthography. Some have
// competing orthographies. Some use multiple scripts routinely (e.g.,
// Serbian: Cyrillic + Latin; Japanese: Kanji + Hiragana + Katakana).
// Sign languages may use notation systems (SignWriting, HamNoSys) or
// none at all.
// ═══════════════════════════════════════════════════════════════════════
"script": null, // Primary ISO 15924 script code (e.g., "Latn", "Cyrl", "Cans",
// "Jpan"). null if no written form or unknown.
"scriptUnicodeName": null, // Unicode script block name derived from the script field.
// e.g., "Latin", "Cyrillic", "Canadian_Aboriginal", "CJK".
// Used by code_switching metric plugin. Auto-populated by
// enrich-script-unicode-names.mjs. null if script is null.
"scripts": [], // All writing systems with detail. Array of:
// {
// "code": "Cans",
// "name": "Unified Canadian Aboriginal Syllabics",
// "primary": true
// }
// A language with multiple scripts has multiple entries.
// A language with no written form has [].
"dir": null, // Writing direction: "ltr" (left-to-right) or "rtl" (right-to-left).
// null if no written form or unknown.
"scriptConverter": null, // Script converter key if we have a converter for this language
// (e.g., "crk" for SRO↔Syllabics). null for most languages.
"orthographicStatus": null, // Writing system standardization status. When populated:
// {
// "status": "standardized",
// // "standardized" — official/agreed orthography exists
// // "competing" — multiple orthographies in active use
// // "emerging" — orthography under development
// // "none" — primarily oral, no standard writing
// "notes": "Uses SIL-developed Latin orthography since 1960s.",
// "source": "ethnologue" // or "manual-curation"
// }
// Crucial for LRLs where orthographic variation directly impacts
// MT training data quality and evaluation consistency.
// ═══════════════════════════════════════════════════════════════════════
// § 5. DEMOGRAPHICS & VITALITY
// How many people speak this language? Is it endangered?
// Sources: Census, Ethnologue, UNESCO Atlas, Wikidata, Glottolog AES.
//
// CRITICAL: Store ALL estimates separately with source attribution.
// Never average or "resolve" conflicting data. Speaker counts are
// politically contested for many languages. Present the evidence,
// let the reader assess.
// ═══════════════════════════════════════════════════════════════════════
"speakerEstimates": [], // Array of speaker count estimates from different authorities.
// Each entry:
// {
// "source": "wikidata", // or "ethnologue-28",
// // "census-ph-2020", etc.
// "count": 20000, // Point estimate. null if range-only.
// "date": "2026-06-07", // When this data was retrieved.
// "countRange": { "min": 15000, "max": 25000 }, // Optional range.
// "note": "Wikidata has 2 estimates: 15,000 and 25,000"
// }
// Empty array means we have not yet found speaker count data.
"vitality": null, // Endangerment / vitality assessment. When populated:
// {
// "unescoStatus": "severely-endangered",
// // Enum: "safe", "vulnerable", "definitely-endangered",
// // "severely-endangered", "critically-endangered",
// // "extinct"
// "aesStatus": "shifting",
// // Glottolog AES label (free text from AES data).
// "egids": "6b",
// // Ethnologue Expanded Graded Intergenerational Disruption
// // Scale. Levels: 0 (international) to 10 (extinct).
// "trend": "declining",
// // Qualitative trend: "stable", "growing", "declining",
// // "shifting", "moribund", "awakening"
// "source": "glottolog-aes-5.3",
// "notes": "Intergenerational transmission breaking down."
// }
// ═══════════════════════════════════════════════════════════════════════
// § 5.5. DOCUMENTATION & DIGITAL PRESENCE
// How well-documented is this language? What digital footprint does it
// have? These fields answer the practical question: "What can I
// actually DO with this language?"
// Sources: Glottolog (references), Wikipedia, Common Voice, Tatoeba.
// ═══════════════════════════════════════════════════════════════════════
"documentationDepth": null, // How well-documented is this language in the literature?
// {
// "referenceCount": 42,
// // Number of published references in Glottolog.
// "med": "grammar",
// // Most Extensive Description type. One of:
// // "long_grammar", "grammar", "grammar_sketch",
// // "dictionary", "phonology", "text", "wordlist",
// // "comparative", "minimal", "unknown"
// "source": "glottolog-5.3"
// }
"digitalPresence": null, // Digital footprint across web platforms. When populated:
// {
// "wikipedia": {
// "edition": true, // Has its own Wikipedia edition?
// "articleCount": 75000, // Number of articles.
// "editionCode": "crk", // Wikipedia subdomain code.
// "source": "wikimedia-api-2026"
// },
// "commonVoice": {
// "validatedHours": 12.5,
// "totalHours": 25.0,
// "speakers": 45,
// "sentences": 1200,
// "source": "common-voice-20.0"
// },
// "tatoeba": {
// "sentenceCount": 342,
// "source": "tatoeba-2026"
// }
// }
"dialectCount": null, // Number of recognized dialects in Glottolog.
// Derived from child_dialect_count in languoid.csv.
// Simple integer. null if 0 or unknown.
// Source: glottolog-5.3.
// ═══════════════════════════════════════════════════════════════════════
// § 6. FORMALITY, REGISTERS & GENDER
// How does politeness work in this language? What translation registers
// do we offer? How should gender be handled?
//
// This section drives Champollion's register-preset system — the
// mechanism by which users select formal/informal/professional tone.
// These fields require genuine linguistic research, not automation.
// ═══════════════════════════════════════════════════════════════════════
"formality": null, // Formality system description. When populated:
// {
// "system": "T-V",
// // One of: "T-V", "speech-levels", "keigo", "particles",
// // "register-levels", "register-and-code-switching",
// // "code-switching", "none"
// "description": "French uses a vous/tu distinction...",
// "default": "formal-vous" // Key into the `registers` object.
// }
"registers": null, // Translation register presets. When populated, keyed by preset ID:
// {
// "formal-vous": {
// "label": "Formal (vouvoiement)",
// "description": "One sentence: when to use this preset.",
// "prompt": "The actual LLM system prompt instruction that
// steers translation tone. Must name specific
// linguistic features (pronouns, verb forms, particles).",
// "deeplFormality": "prefer_more"
// // Only if methodSupport.deepl.formality is true.
// // One of: "prefer_more", "prefer_less", "default".
// }
// }
"gender": null, // Grammatical gender and inclusive guidance. When populated:
// {
// "grammatical": true, // Does the language have gram. gender?
// "inclusiveGuidance": "Use gender-neutral forms when possible.
// Prefer 'iel' (neologism) or rephrase to
// avoid gendered agreement."
// }
// For languages without grammatical gender (Turkish, Finnish):
// { "grammatical": false, "inclusiveGuidance": null }
"codeSwitching": null, // Code-switching behavior (for languages where mixing with another
// language is the norm, not an error). When populated:
// {
// "contactLanguage": "Spanish",
// "contactIso639_3": "spa",
// "mixedVarietyName": "Jopará", // null if no named mixed variety
// "prevalence": "dominant", // "rare", "common", "dominant"
// "morphologicalIntegration": true,
// "pipelineStrategy": "hybrid-fst",
// "notes": "Jopará IS the everyday language of most Paraguayans..."
// }
// ═══════════════════════════════════════════════════════════════════════
// § 7. LINGUISTIC PROFILE
// What makes this language what it is? What are the specific challenges
// for machine translation? What rules govern its typography?
// What languages have shaped it through contact?
//
// These fields require genuine linguistic expertise. For many languages
// (especially low-resource), this section will remain null until a
// qualified researcher or community member contributes.
// ═══════════════════════════════════════════════════════════════════════
"linguisticChallenges": null, // MT-relevant challenges, keyed by challenge ID.
// When populated:
// {
// "polysynthesis": "Cree is highly polysynthetic. A single verb
// can incorporate subject, object, tense...",
// "animacy": "Verb conjugation changes based on whether the
// subject/object is animate or inanimate...",
// "neologisms": "Avoid literal translations of modern software
// concepts. Maintain Cree metaphorical logic..."
// }
// Aim for 3–6 challenges per language when researched.
"contactInfluences": [], // How other languages have shaped this one. Array of:
// {
// "source": "English",
// "sourceIso639_3": "eng", // null if proto-language/unknown
// "type": "superstrate",
// // Enum: "superstrate", "substrate", "adstrate",
// // "learned_borrowing", "lexical_borrowing",
// // "relexification"
// "domains": ["education", "government", "technology"],
// "depth": "deep",
// // Enum: "light", "moderate", "heavy", "structural",
// // "defining"
// "period": "1870–present",
// "notes": "Residential school era and ongoing...",
// "citation_needed": false
// // true if no published academic source found.
// // See language-card-citation-procedure.md.
// }
"rules": null, // Typography, plural, and capitalization rules. When populated:
// {
// "typography": {
// "quoteStart": "\u201c",
// "quoteEnd": "\u201d",
// "usesSpaces": true, // false for CJK, Thai, Lao, Khmer
// "punctuationSpacing": {
// "doublePunctuation": "none" // "thin-nbsp" for French
// }
// },
// "plurals": {
// "categories": ["one", "other"]
// // From CLDR. Possible values:
// // "zero", "one", "two", "few", "many", "other"
// },
// "capitalization": {
// "hasCase": true
// // true for Latin, Cyrillic, Greek, Armenian scripts.
// // false for CJK, Arabic, Devanagari, etc.
// }
// }
// Source: CLDR + ISO 15924 derivation.
"typologicalProfile": null, // Grambank typological features. When populated:
// {
// "featuresDocumented": 195,
// "featuresCoverage": 1, // 0.0–1.0 fraction of features
// "wordOrderDominant": "SVO",
// "hasDefiniteArticle": true,
// "hasIndefiniteArticle": true,
// "hasGenderSystem": true,
// "hasCaseMorphology": true,
// "hasEvidentiality": false,
// "hasToneSystem": false,
// "source": "grambank-1.0.3"
// }
// Auto-populated by enrich-grambank-typology.mjs.
"phonologicalInventory": null, // PHOIBLE phoneme inventory. When populated:
// {
// "consonants": 24,
// "vowels": 16,
// "tones": 0,
// "totalPhonemes": 40,
// "isTonal": false,
// "inventorySize": "moderately-large",
// // Enum: "small", "moderately-small", "average",
// // "moderately-large", "large"
// "source": "phoible-2.0"
// }
// Auto-populated by enrich-phoible-phonemes.mjs.
// ═══════════════════════════════════════════════════════════════════════
// § 8. ENCYCLOPEDIC
// General knowledge about the language for human context. History,
// dialect situation, institutional resources, representative sayings.
// This section is for understanding, not computation.
// ═══════════════════════════════════════════════════════════════════════
"encyclopedic": null, // General knowledge. When populated:
// {
// "family": "Algic", // Redundant with classification
// // but useful for human readers.
// "dialects": {
// "split": true, // Is there significant variation?
// "classification": "Plains Cree (y-dialect)",
// "variants": ["crk", "cwd", "csw"] // ISO codes of variants
// },
// "demographics": {
// "speakers": "Approx. 20,000 active speakers",
// "regions": ["Saskatchewan", "Alberta", "Manitoba"]
// },
// "history": "Plains Cree is the most widely spoken Algonquian
// language in western Canada...",
// "resources": {
// "wikipedia": "https://en.wikipedia.org/wiki/Plains_Cree",
// "foundations": [{ "name": "ALTLab", "url": "https://..." }],
// "dictionaries": [{ "name": "itwêwina", "url": "https://..." }]
// }
// }
"culturalAphorism": null, // A representative saying, proverb, or teaching in the language.
// When populated:
// {
// "text": "ê-wîcêhtonaniwahk kâ-kî-isi-wâpahtamâhk ôma pimâtisiwin",
// "transliteration": null, // Romanized form if non-Latin script.
// "translation": "Through helping each other we come to understand
// this life",
// "literal": "By-helping-one-another we-have-come-to-see this life",
// "source": "Cree teaching, documented in nêhiyawêwin educational
// resources"
// }
// Choose sayings that reveal something about the language's
// worldview or structure. Must be sourced.
"varieties": [], // For macrolanguages or languages with significant dialectal
// variation, the individual varieties with their own tool coverage.
// Each entry:
// {
// "name": "Cusco Quechua",
// "iso639_3": "quz",
// "region": "Cusco, Peru",
// "fstCoverage": true,
// "corpusCoverage": true,
// "nllbCoverage": false,
// "mutualIntelligibility": "Primary variety for this card",
// "notes": "SQUOIA FST was built for this variety."
// }
// ═══════════════════════════════════════════════════════════════════════
// § 9. DIGITAL RESOURCES & TOOLING
// What NLP tools, corpora, models, and datasets exist for this language?
// What translation APIs support it? What eval benchmarks are available?
//
// This is Champollion's operational core — these fields determine what
// we can actually DO with this language.
// ═══════════════════════════════════════════════════════════════════════
"resources": null, // NLP resources available for this language. When populated:
// {
// "fsts": [{ // Finite-state transducers
// "name": "GiellaLT Plains Cree FST (lang-crk)",
// "url": "https://github.com/giellalt/lang-crk/releases",
// "type": "morphological-analyzer"
// }],
// "corpora": [{ // Text corpora
// "name": "EDTeKLA Cree Language Textbook Corpus",
// "type": "parallel", // "parallel", "monolingual"
// "pairs": ["en-crk"],
// "url": "https://...",
// "exposure": "open-web" // "open-web", "restricted",
// // "holdout"
// }],
// "models": [{ // Pre-trained models
// "name": "NLLB-200 (crk_Cans)",
// "url": "https://...",
// "type": "nmt"
// }],
// "tools": [], // Other NLP tools
// "wordlists": [{ // Standardized wordlists
// "name": "Lexibank",
// "conceptCount": 200,
// "source": "lexibank"
// }],
// "treebanks": [{ // Syntactic treebanks
// "name": "UD_Korean-GSD",
// "tokens": 80000,
// "source": "universal-dependencies-2.14"
// }]
// }
// IMPORTANT: Only actual NLP/digital resources belong here.
// "This language has a WALS entry" is NOT a resource — that
// goes in databaseCoverage.
"databaseCoverage": null, // Which typological/reference databases cover this language.
// Separated from resources to avoid conflating "has a database
// entry" with "has usable NLP tooling."
// {
// "wals": true,
// "grambank": true,
// "phoible": true,
// "cldr": true,
// "lexibank": true,
// "commonVoice": true,
// "source": "derived"
// }
"corpusAvailability": null, // What text/parallel corpora exist for NLP use?
// {
// "bibleTranslation": {
// "textAvailable": true,
// "audioAvailable": true,
// "source": "bible-brain-api"
// },
// "opusCorpora": ["wikimedia", "ubuntu", "gnome"],
// "source": "multi-source"
// }
"keyboardSupport": null, // Input method / keyboard availability. When populated:
// {
// "keymanKeyboards": 3,
// // Number of Keyman keyboards available.
// "cldrKeyboard": true,
// // CLDR has keyboard layout data.
// "source": "keyman-api + cldr"
// }
"methodSupport": { // REQUIRED. Which Champollion translation methods support this
// language. Each method is an object with at minimum
// { "supported": boolean }.
"googleTranslate": { "supported": false },
"deepl": { "supported": false },
"microsoftTranslator": { "supported": false },
"libreTranslate": { "supported": false },
"nllb": { "supported": false },
// When NLLB is supported, include the code:
// { "supported": true, "code": "crk_Cans" }
"llm": { "supported": true }
// LLM is always true (quality varies by language).
// Optional: "verifiedDate": "2026-06-07" for audit trail.
},
"metricModelSupport": null, // Which MT evaluation models produce reliable scores.
// When populated:
// {
// "xlmr": "high", // "high", "medium", or "low"
// // XLM-R training representation tier.
// "africomet": false // true if AfriCOMET covers this language.
// }
// Drives automatic COMET model selection in metrics_comet.py.
// Auto-populated by enrich-metric-model-support.mjs.
"metricPlugins": null, // Which per-language metric plugin packs are available.
// When populated:
// {
// "formalityMarkers": true // Formality marker resource file exists
// // at plugins/resources/formality/{code}.json
// }
// Each key corresponds to a resource pack in
// arena/mt_eval_harness/plugins/resources/{packName}/.
// To add a new metric pack for a language, create the resource
// file and set the flag here. No code changes required.
"evalPack": null, // Evaluation dependency pack for language-specific metrics.
// When populated, declares the Python dependencies and
// post-install steps required by this language's eval standards.
// The harness uses this for dependency gating: if deps are
// missing, the harness warns the user and skips LYSS metrics
// (rather than crashing).
// When populated:
// {
// "pythonDeps": {
// "pyhfst": "pyhfst>=1.4", // PyPI package specs
// "requests": "requests>=2.28",
// "spacy": "spacy>=3.7"
// },
// "postInstall": [ // Commands to run after pip
// {
// "command": "spacy download en_core_web_md",
// "label": "spaCy English model (for LYSS-sem)"
// }
// ],
// "requiresFst": true, // true if GiellaLT FST needed
// "description": "LYSS equivalence linter + FST validation"
// }
"evalMetrics": null, // Language-specific evaluation metrics (LYSS standards).
// When populated, the harness dynamically imports these
// MetricPlugin classes from eval_standards/<lang>/ and applies
// them to every run targeting this language — regardless of
// which method (contestant) is being evaluated.
// Keyed by metric ID:
// {
// "lyss-eq": {
// "module": "eval_standards.crk.metrics",
// "class": "CrkLinterMetric",
// "description": "LYSS deterministic variant-class linter"
// },
// "lyss-sem": {
// "module": "eval_standards.crk.metrics",
// "class": "CrkSemanticMetric",
// "description": "LYSS FST-based semantic validator",
// "dependencies": ["spacy>=3.7"],
// "spacy_models": ["en_core_web_md"]
// }
// }
// Architecture: eval standards are referees, not contestants.
// They live in the harness (eval_standards/), not in method
// plugins. This ensures all methods are scored equally.
// Discovery: plugin_discovery.py reads this field via
// language_cards.get_eval_metrics() and instantiates metrics
// using importlib. Dependencies are checked against evalPack.
"omt1600": null, // Meta's OMT-1600 (One Model for Translation) coverage assessment.
// When populated:
// {
// "covered": true,
// "tier": "R1", // Meta's resource tier
// "evalMetrics": ["chrF++", "BLASER-3"],
// "notes": "Plains Cree: no web-crawled bitext..."
// }
"evalDatasets": [], // Evaluation dataset IDs available for this language.
// Example: ["flores-plus-devtest", "edtekla-dev-v1"].
// Empty means no standardized eval set exists.
"pipelineReadiness": null, // Assessment of readiness for Champollion's translation pipeline.
// When populated:
// {
// "tier": "tier-2-feasible",
// // "watch-list" — cataloged but no path to translation
// // "tier-3-cataloged" — basic metadata present
// // "tier-2-feasible" — tools exist, pipeline possible
// // "tier-1-ready" — pipeline operational
// "hasFST": true,
// "hasParallelCorpus": true,
// "hasEvalBenchmark": true,
// "blockers": ["Syllabics post-processing validation"],
// "notes": "FST-gated pipeline operational. EDTeKLA corpus..."
// }
// ═══════════════════════════════════════════════════════════════════════
// § 10. PROVENANCE & METADATA
// Where does this data come from? Who reviewed it? When was it
// generated? What's its overall quality level?
//
// This section exists to make the card auditable. Every automated
// enrichment, every human review, every source consulted should
// leave a trace here.
// ═══════════════════════════════════════════════════════════════════════
"dataSources": [], // REQUIRED. Sources consulted for this card's data.
// Can be a flat array (backwards-compatible):
// ["iso639-3-2024", "glottolog-5.3", "wikidata"]
//
// Or a structured per-field object (preferred for new cards):
// {
// "classification": ["glottolog-5.3"],
// "vitality": ["glottolog-aes-5.3", "unesco-atlas-2024"],
// "speakerEstimates": ["wikidata", "census-ca-2021"],
// "rules": ["cldr-48"],
// "methodSupport": ["google-translate-2026-06"]
// }
"supportTier": "cataloged", // Auto-derived tier summarizing the card's depth:
// "cataloged" — identity + classification only
// "emerging" — + vitality + speakerEstimates
// "developing" — + resources + methodSupport
// "supported" — full research: registers, challenges, etc.
"humanReviewed": null, // null until a qualified human reviews the card. When populated:
// {
// "reviewer": "Prof. Kenneth Jamandre",
// "affiliation": "University of the Philippines Diliman",
// "date": "2026-06-08",
// "scope": "full", // "full", "partial", "vitality-only"
// "notes": "Verified speaker count, vitality assessment,
// and contact influences for Tagalog."
// }
"notes": null, // Free-text notes about this language or this card's data quality.
// Example: "Low-resource language under active development.
// Translation pipeline uses FST-gated approach."
"firstDocumented": null, // Year of first known documentation. Negative for BCE.
// Example: -1500 (Sanskrit, ~1500 BCE), 1787 (some languages).
// Source: Glottolog CLDF.
"lastDocumented": null, // Year of last known documentation (relevant for extinct languages).
// Source: Glottolog CLDF.
"_generated": null // Auto-populated by enrichment scripts. When populated:
// {
// "by": "generate-all-cards.mjs",
// "at": "2026-06-07T12:34:56Z",
// "sources": ["iso639-3", "glottolog-5.3", "wikidata"],
// "completeness": "partial",
// // "partial" — has identity + classification + coords
// // "substantial" — + vitality + speakerEstimates + script
// // "complete" — all automatable fields populated
// "lastEnriched": "2026-06-07"
// }
}
مرجع الحقول
§ 1. حقول الهوية
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
code | string | ✅ | ✅ | سجل ISO 639-3 |
name | string | ✅ | ✅ | سجل ISO 639-3 |
nativeName | string | null | — | ✅ | Wikidata P1705 |
alternateNames | string[] | — | ✅ | Glottolog، Ethnologue |
iso639_3 | string | ✅ | ✅ | سجل ISO 639-3 |
iso639_1 | string | null | — | ✅ | ISO 639-1 |
bcp47 | string | null | — | جزئي | سجل IANA للوسوم الفرعية |
aliases | string[] | — | ❌ | تنسيق يدوي |
isoScope | string | ✅ | ✅ | سجل ISO 639-3 |
isoType | string | ✅ | ✅ | سجل ISO 639-3 |
macrolanguage | string | null | — | ✅ | ISO 639-3 macrolanguages.tab |
extends | string | null | — | ❌ | تنسيق يدوي |
§ 2. حقول التصنيف
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
glottocode | string | null | — | ✅ | Glottolog |
classification | object | null | — | ✅ | Glottolog |
isIsolate | boolean | — | ✅ | Glottolog CLDF |
§ 3. حقول الجغرافيا
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
macroarea | string | null | — | ✅ | Glottolog CLDF |
coordinates | object | null | — | ✅ | Glottolog |
countries | string[] | — | ✅ | Glottolog |
regions | object[] | — | ❌ | تعداد سكاني، Ethnologue، يدوي |
arealContext | object | null | — | ✅ | الإحداثيات + مناطق المساحات اللغوية |
§ 4. حقول نظام الكتابة
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
script | string | null | — | ✅ | Wikidata P282 |
scriptUnicodeName | string | null | — | ✅ | مشتق من script عبر تحويل ISO 15924 → Unicode |
scripts | object[] | — | جزئي | Wikidata، يدوي |
dir | string | null | — | ✅ | قابل للاشتقاق من نظام الكتابة |
scriptConverter | string | null | — | ❌ | يدوي |
orthographicStatus | object | null | — | جزئي | Ethnologue، يدوي |
§ 5. الحقول الديموغرافية وحقول الحيوية اللغوية
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
speakerEstimates | object[] | — | ✅ | Wikidata، Ethnologue، تعداد سكاني |
vitality | object | null | — | ✅ | Glottolog AES، UNESCO |
§ 5.5 حقول التوثيق والحضور الرقمي
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
documentationDepth | object | null | — | ✅ | مراجع Glottolog |
digitalPresence | object | null | — | ✅ | Wikipedia، Common Voice، Tatoeba |
dialectCount | number | null | — | ✅ | Glottolog |
§ 6. حقول الرسمية والسجل اللغوي والنوع الاجتماعي
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
formality | object | null | — | ❌ | بحث لغوي |
registers | object | null | — | ❌ | بحث لغوي |
gender | object | null | — | ❌ | بحث لغوي |
codeSwitching | object | null | — | ❌ | بحث لغوي |
§ 7. حقول الملف اللغوي
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
linguisticChallenges | object | null | — | ❌ | بحث لغوي |
contactInfluences | object[] | — | ❌ | دراسات لغوية منشورة |
rules | object | null | — | ✅ | CLDR |
typologicalProfile | object | null | — | ✅ | Grambank 1.0.3 — يُعبَّأ تلقائيًا بواسطة enrich-grambank-typology.mjs |
phonologicalInventory | object | null | — | ✅ | PHOIBLE 2.0 — يُعبَّأ تلقائيًا بواسطة enrich-phoible-phonemes.mjs |
§ 8. الحقول الموسوعية
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
encyclopedic | object | null | — | ❌ | بحث يدوي |
culturalAphorism | object | null | — | ❌ | مساهمة مجتمعية |
varieties | object[] | — | ❌ | بحث يدوي |
§ 9. حقول الموارد الرقمية
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
resources | object | null | — | جزئي | يدوي + آلي |
databaseCoverage | object | null | — | ✅ | مشتق من الإثراء |
corpusAvailability | object | null | — | ✅ | Bible Brain، OPUS، Lexibank |
keyboardSupport | object | null | — | ✅ | Keyman API، CLDR |
methodSupport | object | ✅ | جزئي | تحقق عبر API |
metricModelSupport | object | null | — | ✅ | ورقة XLM-R البحثية، ورقة AfriCOMET البحثية |
metricPlugins | object | null | — | ✅ | إثراء البطاقات — يُعلِن حِزم إضافات المقاييس المنطبقة (مثل { formalityMarkers: true }) |
omt1600 | object | null | — | ✅ | تقييم وصفي |
evalDatasets | string[] | — | ✅ | سجل مجموعات البيانات |
pipelineReadiness | object | null | — | جزئي | مشتق + يدوي |
resources.fsts[].install: يمكن أن تتضمن مدخلات FST في كائنresourcesكائنًا فرعيًاinstallبالحقول التالية:repoوreleaseTagوassetPatternوformatوmaturityواختياريًاbundlePattern. يحل هذا محل القاموس الثابت السابقGIELLALT_FST_REGISTRY. انظرget_fst_install_info()فيlanguage_cards.py.
§ 10. حقول مصدر البيانات (Provenance)
| الحقل | النوع | مطلوب | قابل للأتمتة | المصدر |
|---|---|---|---|---|
dataSources | array | object | ✅ | ✅ | آلي + يدوي |
supportTier | string | — | ✅ | مشتق من اكتمال البطاقة |
humanReviewed | object | null | — | ❌ | مراجع بشري |
notes | string | null | — | ❌ | يدوي |
firstDocumented | number | null | — | ✅ | Glottolog CLDF |
lastDocumented | number | null | — | ✅ | Glottolog CLDF |
_generated | object | null | — | ✅ | سكربتات الإثراء |
سياسة رموز اللغات
يستخدم Champollion ISO 639-3 كمعرِّف معياري. أما الرموز القياسية الأخرى فتُسجَّل كأسماء بديلة وتُحلَّل إلى رمز ISO 639-3 في وقت التشغيل.
| الأولوية | المعيار | مثال | الحقل | الاستخدام |
|---|---|---|---|---|
| 1 (معياري) | ISO 639-3 | crk | code | اسم ملف البطاقة، مفاتيح الإعدادات، معاملات API |
| 2 (اسم بديل) | ISO 639-1 | iu | aliases[] | مقبول في واجهة سطر الأوامر، يُحلَّل إلى ISO 639-3 |
| 3 (اسم بديل) | BCP 47 | fil | aliases[] | مقبول في واجهة سطر الأوامر، يُحلَّل إلى ISO 639-3 |
| مرجعي | Glottocode | plai1258 | glottocode | للتصنيف فقط، ليس لوقت التشغيل |
ترتيب التحليل: عندما يقدِّم المستخدم رمزًا:
- تطابق مباشر مع
card.code→ وُجد - تطابق مع
card.aliases[]→ وُجد، تُعاد البطاقة المعيارية - تطابق مع
card.iso639_1→ وُجد (حل احتياطي) - لم يوجد → خطأ
تاريخ الترحيل: ISO 639-1 ← ISO 639-3
قبل الإصدار v8، كانت أسماء ملفات البطاقات تستخدم رموز ISO 639-1 حيثما توافرت (fr.json،
de.json، ja.json). في ترحيل 639-3، أُعيدت تسمية جميع البطاقات إلى
مكافئاتها في ISO 639-3:
| قبل | بعد | السبب |
|---|---|---|
fr.json | fra.json | 639-3 هو المعيار |
de.json | deu.json | 639-3 هو المعيار |
zh.json | cmn.json | لغة كلية ← اللغة الفردية الافتراضية |
ar.json | arb.json | لغة كلية ← العربية الفصحى الحديثة |
ms.json | zsm.json | لغة كلية ← الملايو القياسية |
ماذا حدث للرموز القديمة؟
- رمز 639-1 القديم موجود في
card.iso639_1 - رمز 639-1 القديم موجود في
card.aliases[] resolveCode("fr")يُرجع"fra"في وقت التشغيل — متوافق مع الإصدارات السابقة- لا يزال بإمكان المستخدمين كتابة
"fr"في إعداداتهم — يُحلَّل بشفافية
ما الذي تغيّر معماريًا:
_deepMerge()يتخطى الآن قيمnull(يرث من البطاقة الأم)_deepMerge()يتضمن الآن مجموعة حقول الهوية (الرمز و extends والأسماء البديلة لا تُورَّث أبدًا)formality.defaultبات يُشتق الآن من أعلامisDefault: trueفي السجلات- 205 بطاقة مشتقة من Grambank حصلت على إصلاح بنيوي لحقل
formality.default - 38 بطاقة مجموعة/عائلة/لغة كلية توفِّر أهدافًا للوراثة
الحالات الخاصة
لغات الإشارة
لغات الإشارة (مثل ASE — لغة الإشارة الأمريكية) لغات مشروعة لها رموز ISO 639-3. لها جغرافيا وأعداد متحدثين، ولكن:
scriptعادةً ما تكونnull(لا توجد صيغة مكتوبة قياسية)scriptsقد تتضمن"Sgnw"(SignWriting) إذا كان هناك نظام تدوين مستخدمdirهيnulllinguisticChallengesينبغي أن يتناول القواعد المكانية والمصنِّفات وما إلى ذلكgender.grammaticalعادةً ما تكونfalse
اللغات القديمة والتاريخية
لغات مثل اللاتينية (lat، isoType H) والسنسكريتية (san، isoType H) لا تزال
تُستخدم في سياقات محددة (طقسية، أكاديمية) لكن ليس لها متحدثون أصليون:
vitalityقد يشير إلى "لا متحدثين أصليين" مع"trend": "stable"(ليست في تراجع — المجتمع الذي يستخدمها مستقر، لكنه صغير فحسب)speakerEstimatesينبغي أن يوضح أن هؤلاء متحدثون بلغة ثانية (L2) وليس لغة أولى (L1)firstDocumented/lastDocumentedيحددان موقعها الزمني
اللغات المصطنعة
الإسبرانتو (epo، isoType C)، Lojban، إلخ:
classificationقد يشير إلى عائلة "مصطنعة" أو يكون فارغًا (null)contactInfluencesيعكس المادة المصدرية (مثلًا، تستمد الإسبرانتو من اللغات الرومانسية والجرمانية والسلافية)vitalityغير اعتيادي — مجتمع متحدثين متنامٍ لكن دون وطن أصلي
اللغات الكلية (Macrolanguages)
العربية (ara) والصينية (zho) والكري (cre) والكيتشوا (que) لغات كلية
تضم عدة لغات فردية:
isoScope: "M"varietiesينبغي أن يسرد اللغات الفردية مع رموز ISO الخاصة بهاmethodSupportينبغي أن يعكس ما تدعمه بطاقة اللغة الكلية (عادةً التنويعة المعيارية)- ينبغي أن تكون للتنويعات الفردية بطاقاتها الخاصة أيضًا
لغات بلا نظام كتابة موحَّد
كثير من اللغات (خاصةً لغات التقاليد الشفهية) ليس لها نظام كتابة موحَّد، أو لها أنظمة إملائية متنافسة:
scriptهيnullscriptsهي[]dirهيnullnotesينبغي أن يشرح الوضع الإملائيlinguisticChallengesينبغي أن يوضح كيف يؤثر ذلك على الترجمة الآلية (مثلًا، عدم وجود بيانات تدريب)
الازدواجية اللغوية (Diglossia)
لغات مثل العربية (الفصحى الحديثة مقابل اللهجات) أو الغوارانية (Jopará مقابل الغوارانية الخالصة):
codeSwitchingيرصد حالة التنويعات المختلطةregistersيمكن أن يوفر إعدادات مسبقة لمستويات مختلفةvarietiesيمكن أن يسرد الثنائية الازدواجية
أنواع التأثير الاحتكاكي بين اللغات
| النوع | المعنى | مثال |
|---|---|---|
superstrate | لغة مهيمنة فُرضت على مجتمع | الفرنسية ← الإنجليزية (بعد 1066) |
substrate | لغة أصلية تؤثر في لغة مفروضة | الكلتية ← الإنجليزية |
adstrate | لغة مجاورة بتأثير متبادل | النوردية ← الإنجليزية |
learned_borrowing | استعارات عبر التعليم والبحث العلمي | اللاتينية ← الإنجليزية |
lexical_borrowing | استعارات مفردات مباشرة عبر الاحتكاك | الإسبانية ← الفلبينية |
relexification | استبدال شامل للمفردات | البرتغالية ← Papiamentu |
أعماق التأثير الاحتكاكي
| العمق | المعنى |
|---|---|
light | بضع كلمات مستعارة، تأثير بنيوي محدود |
moderate | مفردات معتبرة في مجالات محددة |
heavy | مفردات منتشرة وبعض السمات البنيوية |
structural | تأثُّر القواعد والتراكيب والصوتيات |
defining | هوية أساسية تشكَّلت بالاحتكاك (اللغات الكريولية، اللغات المختلطة) |
كتابة إعدادات مسبقة جيدة للسجلات اللغوية
موجِّهات الإعدادات المسبقة الجيدة:
- تُسمِّي سمة الرسمية صراحةً (مثل "해요체"، "vous-form"، "siz-form")
- تشرح الضمير أو صيغة الفعل المحددة الواجب استخدامها
- تقدِّم سياقًا لمتى يكون هذا السجل اللغوي مناسبًا
- تذكر اعتبارات نظام الكتابة إن وُجدت
لا تضع إرشادات الشمول الجندري في موجِّه الإعداد المسبق. إرشادات النوع الاجتماعي
مكانها card.gender.inclusiveGuidance — فهي تُحقَن بشكل منفصل.
❌ Bad: "Standard Thai. Professional register."
✔ Good: "Professional Thai. Use คุณ (khun) for second person, เรา (rao)
for first person when needed. Clear, concise phrasing
appropriate for digital interfaces."
اصطلاح تسمية الإعدادات المسبقة
ينبغي أن تكون مفاتيح الإعدادات المسبقة وصفية وبأحرف صغيرة مفصولة بشرطات:
- لغات T-V:
formal-vous،informal-tu،formal-Sie،casual-du - مستويات الخطاب:
polite-haeyo،formal-hapsyo،casual-hae - محايد:
professional،neutral-professional - التناوب اللغوي:
taglish-professional،pure-filipino
إجراءات الإثراء
ترتيب معالجة كل بطاقة
عند إثراء بطاقة، راجع المصادر بهذا الترتيب. وثِّق كل مصدر تمت مراجعته، حتى لو لم يُرجع أي بيانات.
- سجل ISO 639-3 ←
code،name،isoScope،isoType - ISO 639-3 macrolanguages.tab ←
macrolanguage - Glottolog languoid.csv ←
glottocode،classification،coordinates،countries - Glottolog CLDF ←
macroarea،isIsolate،firstDocumented،lastDocumented - Glottolog AES ←
vitality(حالة التعرض للخطر) - Wikidata SPARQL ←
nativeName،speakerEstimates،script،scripts،dir - CLDR ←
rules(الطباعة، صيغ الجمع، الأحرف الكبيرة) - NLLB-200 / FLORES+ ←
methodSupport.nllb،evalDatasets - التحقق عبر API ← مدخلات
methodSupportالمتبقية - أوراق نماذج تعلم الآلة البحثية ←
metricModelSupport(بيانات تدريب XLM-R، تغطية AfriCOMET) السكربت:node scripts/enrich-metric-model-support.mjs
التعامل مع التعارضات
عندما تتعارض المصادر:
- خزِّن القيمتين معًا مع نسبة كل منهما إلى مصدرها
- لا تحسب المتوسط ولا تنحز لطرف
- دوِّن التعارض في حقل
noteالمعني - فضِّل المصدر الأولي الأحدث فقط عندما تكون قيمة واحدة ضرورية للحساب
التحقق من الصحة
شغِّل أداة الفحص (linter) بعد أي إثراء أو تعديل يدوي:
node scripts/lint-language-cards.mjs # all cards
node scripts/lint-language-cards.mjs --lang crk # single card
قائمة التحقق لطلبات الدمج (PR)
عند تقديم بطاقة لغة جديدة أو معدَّلة:
- الملف مُسمّى
<code>.jsonفيshared/language-cards/ - جميع الحقول العليا من القالب المعياري موجودة
-
classificationمعبَّأ من Glottolog (وليس مبنيًا يدويًا) -
dataSourcesيسرد جميع المصادر التي تمت مراجعتها - مدخلات
methodSupportمتحقَّق منها مقابل قوائم اللغات الفعلية في واجهات API - مدخلات
contactInfluencesلها مصادر منشورة أوcitation_needed: true -
linguisticChallengesيتضمن 3–6 تحديات ذات صلة بالترجمة الآلية (إذا أُجري البحث) -
rulesمعبَّأ من CLDR (إذا توافرت بيانات اللغة المحلية) - أداة الفحص تنجح دون أخطاء
المراجع المهنية
| المعيار | الجهة المسؤولة | استخدامنا |
|---|---|---|
| ISO 639-3 | SIL International | رموز اللغات المعيارية، علاقات اللغات الكلية |
| Glottolog | Max Planck Institute | التصنيف، الإحداثيات، تصنيف AES للتعرض للخطر |
| WALS | Max Planck Institute | تعريفات المجموعات (genus)، السمات التصنيفية |
| ISO 15924 | Unicode/ISO | رموز أنظمة الكتابة |
| CLDR | Unicode Consortium | بيانات اللغة المحلية، قواعد الجمع، الطباعة |
| Wikidata | Wikimedia Foundation | أعداد المتحدثين، الأسماء الذاتية، بيانات أنظمة الكتابة |
| Ethnologue | SIL International | EGIDS، تقديرات المتحدثين، DLS |
| UNESCO Atlas | UNESCO | تصنيف التعرض للخطر |
| Katig Collective | UP Diliman | كبسولات اللغات الفلبينية |
انظر أيضًا: إجراءات الاستشهاد في بطاقات اللغة للحصول على إرشادات تفصيلية لكل مصدر على حدة.