الانتقال إلى المحتوى الرئيسي

الإعدادات

يعمل Champollion بدون أي إعدادات مسبقة — فهو يكتشف تلقائيًا ملفات اللغات (locale files) وصيغتها واللغات المستهدفة من مشروعك. لمزيد من التحكم، أنشئ champollion.config.json في جذر مشروعك، أو نفّذ:

npx champollion init

المرجع الكامل للإعدادات

champollion.config.json
{
"version": 3,
"inputLocale": "en",
"localesDir": "./locales",
"contentDir": null,
"translatableFields": null,
"format": "auto",
"model": "google/gemini-3.5-flash",
"temperature": 0.3,
"defaultMethod": "llm",
"batchSize": 80,
"coachingFile": null,
"promptContext": null,
"jsonConcurrency": 200,
"contentConcurrency": 48,
"fallbackPrefix": "[EN] ",
"apiKeyEnvVar": "OPENROUTER_API_KEY",
"baseUrl": "",
"pairs": {},
"languages": {},
"lint": {
"srcDir": null,
"ignore": ["node_modules", ".next", "dist"],
"minLength": 2
},
"seo": {
"urlPattern": "/:locale/:path",
"pages": null
},
"typegen": {
"output": null,
"autoGenerate": false
}
}

:::note لم يتم تنفيذ typegen بعد يتعرف محمّل الإعدادات على كتلة الإعدادات typegen ويحافظ عليها، لكن توليد أنواع TypeScript لم يُنفَّذ بعد. هذه الكتلة مجرد عنصر نائب لميزة مخطط لها. تعيين هذه القيم ليس له أي تأثير. :::

الحقول

الحقلالنوعالقيمة الافتراضيةالوصف
versionnumber3إصدار مخطط الإعدادات. دائمًا 3.
inputLocalestring"en"رمز اللغة المصدر (BCP 47).
localesDirstring"./locales"مسار ملفات اللغات. يفحص Champollion هذا المجلد.
contentDirstringnullمجلد محتوى Hugo. يفعّل ترجمة نصوص Markdown.
translatableFieldsstring[]nullتجاوز حقول الـ frontmatter الافتراضية القابلة للترجمة في ترجمة المحتوى. null يستخدم القيم الافتراضية المدمجة (title، description، summary).
formatstring"auto"صيغة الملف: json أو toml أو yaml أو auto (الكشف من الامتداد).
modelstring"google/gemini-3.5-flash"النموذج الافتراضي لطرق LLM. يقبل معرّفات OpenRouter الكاملة (provider/model) أو الأسماء المختصرة من shared/model-aliases.json (مثل gemini-flash). يستخدم المزودون المباشرون أسماء مجردة (مثل gpt-4o).
temperaturenumber0.3درجة حرارة نموذج LLM ‏(0.0–2.0). كلما انخفضت القيمة، زادت الحتمية.
defaultMethodstring"llm"طريقة الترجمة الافتراضية: llm، llm-coached، google-translate، deepl، microsoft-translator، libretranslate، openai، anthropic، gemini، api. تتجاوزها راية سطر الأوامر --method.
batchSizenumber80عدد المفاتيح في كل دفعة ترجمة. القيمة الأعلى = استدعاءات API أقل، لكن مطالبات (prompts) أكبر.
coachingFilestringnullمسار ملف نصي حر يحتوي على مطالبة توجيهية (نسبيًا إلى جذر المشروع). تُقرأ المحتويات عند بدء التشغيل وتُحقَن في مطالبة النظام داخل كتلة Coaching guidance:.
promptContextstringnullنص يصف سياق التطبيق ويُحقَن في مطالبة النظام (مثل "أوصاف منتجات تجارة إلكترونية"). يساعد النموذج على تكييف الترجمات مع مجالك.
jsonConcurrencynumber200الحد الأقصى لترجمات اللغات المتوازية في مزامنة مفاتيح JSON. تتجاوزه راية سطر الأوامر --json-concurrency.
contentConcurrencynumber48الحد الأقصى لاستدعاءات API المتوازية لترجمة المحتوى (Markdown/MDX). تتجاوزه راية سطر الأوامر --content-concurrency.
fallbackPrefixstring"[EN] "بادئة علامة تستخدمها audit وverify للكشف عن القيم القديمة غير المترجمة من عمليات تشغيل سابقة. لا يكتب Champollion هذه البادئة — بل يقرؤها فقط لأغراض الكشف.
apiKeyEnvVarstring"OPENROUTER_API_KEY"اسم متغير البيئة الخاص بمفتاح API. يمكن تجاوزه لاستخدام أسماء متغيرات بيئة مخصصة.
baseUrlstring""الرابط الأساسي لتوليد عناصر SEO ‏(hreflang، خرائط المواقع، JSON-LD).
pairsobject{}تجاوزات الطريقة والنموذج والجودة لكل زوج لغوي. راجع إعدادات الأزواج.
languagesobject{}تجاوزات لكل لغة. راجع إعدادات اللغات.
lint.srcDirstringnullمجلد المصدر لفحص lint. null = الكشف التلقائي من إطار العمل.
lint.ignorestring[]["node_modules", ...]أنماط glob لاستثنائها من lint.
lint.minLengthnumber2الحد الأدنى لطول النص لتمييزه كنص مضمَّن (hardcoded).
seo.urlPatternstring"/:locale/:path"قالب نمط الروابط لتوليد وسوم hreflang.
seo.pagesstring[]nullقائمة صفحات صريحة لـ SEO. null = الكشف التلقائي من مفاتيح اللغات.
typegen.outputstringnullمسار الإخراج لأنواع TypeScript المولَّدة. null = معطّل.
typegen.autoGeneratebooleanfalseإعادة توليد الأنواع تلقائيًا بعد كل مزامنة.

إعدادات الأزواج

يمكن إعداد كل زوج مصدر→هدف بشكل مستقل:

{
"pairs": {
"en:fr": {
"method": "google-translate",
"qualityTier": "high"
},
"en:ja": {
"method": "llm",
"model": "google/gemini-2.5-pro"
},
"en:crk": {
"methodPlugin": "crk-coached-v1"
}
}
}

حقول الأزواج

الحقلالنوعالوصف
methodstringطريقة الترجمة: llm، llm-coached، google-translate، deepl، microsoft-translator، libretranslate، openai، anthropic، gemini، api
methodPluginstringاسم إضافة مثبّتة (من .champollion/methods/)
modelstringتجاوز النموذج الافتراضي لهذا الزوج
temperaturenumberتجاوز درجة الحرارة الافتراضية لهذا الزوج
batchSizenumberتجاوز حجم الدفعة الافتراضي لهذا الزوج
registerstringتجاوز مستوى الأسلوب/النبرة (مفتاح إعداد مسبق أو نص حر)
endpointstringرابط نقطة نهاية API البعيدة. مطلوب عندما يكون method هو api.
coachingFilestringمسار ملف مطالبة توجيهية لهذا الزوج
promptContextstringسياق التطبيق لهذا الزوج
qualityTierstringمستوى العرض: standard، high، research، verified

إعدادات اللغات

تقبل اللغات ثلاث صيغ:

مصفوفة من الرموز (الأبسط)

{
"languages": ["fr", "de", "ja"]
}

تحصل كل لغة على مستوى الأسلوب الافتراضي الخاص بها من جدول الأساليب المدمج. اللغات التي ليس لها قيمة افتراضية تحصل على "Professional register.".

كائن مع نصوص أسلوب

يمكن أن تكون القيمة مفتاح إعداد مسبق من بطاقة اللغة، أو نص أسلوب مخصص:

{
"languages": {
"fr": "casual-tu",
"ko": "formal-hapsyo",
"ja": "Custom: Polite Japanese for a gaming app."
}
}

يتحقق Champollion مما إذا كان النص يطابق مفتاح إعداد مسبق في بطاقة اللغة. إذا تطابق، تُستخدم مطالبة الأسلوب الكاملة من البطاقة. وإن لم يتطابق، يُستخدم النص كما هو. راجع اللغات المدعومة للاطلاع على الإعدادات المسبقة المتاحة.

كائن مع إعدادات كاملة

{
"languages": {
"crk": {
"name": "Plains Cree",
"register": "SRO syllabics with grammatical precision.",
"model": "google/gemini-2.5-pro",
"batchSize": 5,
"maxRetries": 5,
"script": "cans"
}
}
}

يمكنك المزج بين الصيغة المختصرة والكائنات الكاملة في الكتلة نفسها.

حقول اللغات

الحقلالنوعالوصف
registerstringتعليمات الأسلوب/النبرة. يمكن أن تكون مفتاح إعداد مسبق (مثل casual-tu أو formal-hapsyo) أو نصًا مخصصًا. راجع بطاقات اللغات.
namestringاسم اللغة بصيغة مقروءة (لعرض الحالة)
modelstringتجاوز النموذج الافتراضي
temperaturenumberتجاوز درجة الحرارة الافتراضية
batchSizenumberتجاوز حجم الدفعة الافتراضي
coachingFilestringمسار ملف مطالبة توجيهية لهذه اللغة
promptContextstringسياق التطبيق لهذه اللغة
maxRetriesnumberالحد الأقصى لمحاولات إعادة المحاولة للدفعات الفاشلة (الافتراضي: 3)
scriptstringرمز نظام الكتابة وفق ISO 15924. يفعّل التحقق من نظام الكتابة في بوابة الجودة.

:::info سلسلة الوراثة تُحَل الإعدادات بهذا الترتيب (الأول يفوز):

مستوى الزوجمستوى اللغةالإعدادات العامةالقيم الافتراضية

على سبيل المثال، إذا عيّن pairs["en:fr"] القيمة model، فإنها تتجاوز قيمتي model على مستوى اللغة وعلى المستوى العام معًا. :::

مصدر بلغة غير الإنجليزية

إذا لم تكن لغتك المصدر هي الإنجليزية:

# CLI flag (one-time)
npx champollion sync --source fr
champollion.config.json (permanent)
{
"inputLocale": "fr"
}

ملف القفل

ينشئ Champollion .champollion.lock لتتبع تجزئات SHA-256 لقيم المصدر المترجمة. قم بإيداع هذا الملف (commit) حتى يتشارك جميع المطورين خط الأساس نفسه للترجمة.

عندما تتغير قيمة في المصدر، لا تعود التجزئة متطابقة، فيعيد champollion ترجمة ذلك المفتاح في المزامنة التالية.

.champollionignore

أنشئ .champollionignore في جذر مشروعك لاستثناء ملفات من فحص lint. يستخدم أنماط glob، مثل .gitignore:

.champollionignore
src/components/legacy/**
src/utils/constants.js
**/*.test.js

مجلد .champollion/

ينشئ Champollion مجلد .champollion/ في جذر مشروعك للحالة الداخلية. ينبغي بشكل عام إضافته إلى .gitignore — فهو تحسين محلي وليس جزءًا من مصدر المشروع:

.champollion/
الملفالغرضيُودَع؟
tm.jsonذاكرة الترجمة المؤقتة — تخزّن الترجمات السابقة مفهرسة بالنص المصدر + اللغة + الطريقةلا (ذاكرة مؤقتة محلية)
xliff/*.xliffملفات تصدير XLIFF لمراجعة المترجمين المحترفينلا (مؤقتة)
methods/بيانات وصف إضافات الطرق المثبّتةنعم (إعدادات مشتركة)
backups/نسخ احتياطية ما قبل التغليف (ينشئها wrap --undo)لا (شبكة أمان)

راجع ذاكرة الترجمة لمزيد من التفاصيل حول tm.json وكيف يوفّر تكاليف API.


واجهة برمجية للاستخدام البرمجي

لسكربتات البناء والتكاملات المخصصة، استورد مباشرة من الحزمة:

import { GeminiMethod, runSync, resolveConfig } from 'champollion';

// Use a method class directly
const gemini = new GeminiMethod();
const result = await gemini.translate(
['greeting', 'farewell'],
{ greeting: 'Hello', farewell: 'Goodbye' },
{ target: 'fr', name: 'French', register: 'formal', model: 'gemini-2.5-flash' },
{ cwd: process.cwd() }
);
// result = { greeting: 'Bonjour', farewell: 'Au revoir' }

عمليات التصدير المتاحة

التصديرالوظيفة
TranslationMethodالفئة الأساسية لجميع الطرق
LLMMethodالفئة الأساسية لطرق LLM ‏(OpenRouter)
DirectLLMMethodالفئة الأساسية لمزودي LLM المباشرين (OpenAI، Anthropic، Gemini)
OpenAIMethod، AnthropicMethod، GeminiMethodفئات مزودي LLM المباشرين
DeepLMethod، MicrosoftTranslatorMethod، LibreTranslateMethodفئات الترجمة الآلية التقليدية
GoogleTranslateMethodGoogle Cloud Translation
LLMCoachedMethodنموذج LLM موجَّه (OpenRouter + بيانات توجيه)
APIMethodعميل API بعيد
runSync، runContentSyncخط أنابيب المزامنة الكامل
resolveConfig، resolvePairsحل الإعدادات
validateTranslationsبوابة الجودة
loadCoachingData، findDictionaryMatchesأدوات التوجيه

إضافة مزود مخصص

وسّع DirectLLMMethod لإضافة مزود LLM جديد بنحو 40 سطرًا:

import { DirectLLMMethod } from 'champollion';

class MistralMethod extends DirectLLMMethod {
constructor(options) {
super(options);
this.name = 'mistral';
}
_getApiKeyEnvVar() { return 'MISTRAL_API_KEY'; }
_getApiKeyOptionsKey() { return 'mistralApiKey'; }
_getDefaultModel() { return 'mistral-large-latest'; }
_getProviderLabel() { return 'Mistral'; }

_buildApiRequest({ prompt, systemMessage, apiKey, model, temperature }) {
return {
url: 'https://api.mistral.ai/v1/chat/completions',
headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
body: {
model,
messages: [
...(systemMessage ? [{ role: 'system', content: systemMessage }] : []),
{ role: 'user', content: prompt },
],
temperature,
},
};
}

_extractResponseText(json) {
return json.choices?.[0]?.message?.content;
}

// Optional but recommended: provider-specific setup help when translation fails
getSetupHelp() {
if (!process.env.MISTRAL_API_KEY) {
return [
'',
' ┌─ Missing API Key ─────────────────────────────────────────────┐',
' │ Mistral requires an API key from https://console.mistral.ai │',
' │ Run: export MISTRAL_API_KEY=... │',
' └────────────────────────────────────────────────────────────────┘',
];
}
return [' API key is set but translation failed. Check your Mistral dashboard.'];
}
}

تحصل مجانًا على الترجمة، والتوجيه، وحلقات إعادة المحاولة، والتحقق من النماذج، ومستويات الجودة، ومساعدة الإعداد. شكل طلب HTTP وحده هو الخاص بكل مزود. بالنسبة للمحوّلات غير المعتمدة على LLM والتي تستخدم fetch() مباشرة، استخدم الأداة المساعدة المشتركة fetchWithRetry() من lib/methods/fetch-with-retry.js بدلًا من كتابة حلقة إعادة محاولة خاصة بك.


انظر أيضًا