Mag-skip sa main content

Configuration

Gumagana ang Rosetta nang zero-config — nag-a-auto-detect ito ng locale files, format, at target languages mula sa project mo. Para sa mas maraming control, gumawa ng i18n-rosetta.config.json sa project root mo, o i-run ang:

npx i18n-rosetta init

Full Config Reference

i18n-rosetta.config.json
{
"version": 3,
"inputLocale": "en",
"localesDir": "./locales",
"contentDir": null,
"translatableFields": null,
"format": "auto",
"model": "google/gemini-3.5-flash",
"defaultMethod": "llm",
"batchSize": 30,
"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 hindi pa implemented ang typegen Ang typegen config block ay nire-recognize at pini-preserve ng config loader, pero hindi pa implemented ang TypeScript type generation. Placeholder po ito para sa isang planned feature. Walang effect ang pag-set ng mga values na ito. :::

Fields

FieldTypeDefaultDescription
versionnumber3Config schema version. Laging 3.
inputLocalestring"en"Source language code (BCP 47).
localesDirstring"./locales"Path papunta sa locale files. Ini-scan ng Rosetta ang directory na ito.
contentDirstringnullHugo content directory. Ine-enable nito ang Markdown body translation.
translatableFieldsstring[]nullI-override ang default translatable frontmatter fields para sa content translation. Gumagamit ang null ng built-in defaults (title, description, summary).
formatstring"auto"File format: json, toml, yaml, o auto (ide-detect mula sa extension).
modelstring"google/gemini-3.5-flash"Default model para sa LLM methods. Nakadepende ang format sa method: Gumagamit ang OpenRouter ng provider/model (hal., google/gemini-3.5-flash); gumagamit naman ang direct providers ng bare names (hal., gpt-4o, gemini-2.5-flash).
defaultMethodstring"llm"Default translation method: llm, llm-coached, google-translate, deepl, microsoft-translator, libretranslate, openai, anthropic, gemini, api. Mao-override ito ng --method CLI flag.
batchSizenumber30Keys per translation batch. Mas mataas = mas kaunting API calls, pero mas malalaking prompts.
fallbackPrefixstring"[EN] "Prefix na idinadagdag sa untranslated fallback values. Ginagamit ng audit para ma-detect ang incomplete translations.
apiKeyEnvVarstring"OPENROUTER_API_KEY"Environment variable name para sa API key. I-override para sa custom env var names.
baseUrlstring""Base URL para sa SEO artifact generation (hreflang, sitemaps, JSON-LD).
pairsobject{}Per-pair method, model, at quality overrides. Tingnan ang Pair Configuration.
languagesobject{}Per-language overrides. Tingnan ang Language Configuration.
lint.srcDirstringnullSource directory para sa lint scanning. null = auto-detect mula sa framework.
lint.ignorestring[]["node_modules", ...]Glob patterns na ie-exclude sa lint.
lint.minLengthnumber2Minimum string length para i-flag bilang hardcoded.
seo.urlPatternstring"/:locale/:path"URL pattern template para sa hreflang tag generation.
seo.pagesstring[]nullExplicit page list para sa SEO. null = auto-detect mula sa locale keys.
typegen.outputstringnullOutput path para sa generated TypeScript types. null = disabled.
typegen.autoGeneratebooleanfalseMag-auto-regenerate ng types pagkatapos ng bawat sync.

Pair Configuration

Pwedeng i-configure nang independently ang bawat source→target pair:

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

Pair Fields

FieldTypeDescription
methodstringTranslation method: llm, llm-coached, google-translate, deepl, microsoft-translator, libretranslate, openai, anthropic, gemini, api
methodPluginstringPangalan ng installed plugin (mula sa .rosetta/methods/)
modelstringI-override ang default model para sa pair na ito
endpointstringRemote API endpoint URL. Required ito kapag ang method ay api.
qualityTierstringDisplay tier: standard, high, research, verified

Language Configuration

Tumatanggap ang languages ng tatlong formats:

Array of codes (pinakasimple)

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

Kinukuha ng bawat language ang default register nito mula sa built-in register table. Ang mga languages na walang default ay makakakuha ng "Professional register.".

Object na may register strings

Ang value ay pwedeng isang preset key mula sa language card, o custom register text:

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

Tinitingnan ng Rosetta kung nagma-match ang string sa isang preset key sa language card. Kung oo, gagamitin ang buong register prompt mula sa card. Kung hindi, gagamitin ang string as-is. Tingnan ang Supported Languages para sa available presets.

Object na may full config

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

Pwede mong paghaluin ang shorthand at full objects sa iisang block.

Language Fields

FieldTypeDescription
registerstringStyle/tone instructions. Pwedeng isang preset key (hal., casual-tu, formal-hapsyo) o custom text. Tingnan ang Language Cards.
namestringHuman-readable language name (para sa status display)
modelstringI-override ang default model
batchSizenumberI-override ang default batch size
maxRetriesnumberMaximum retry budget para sa failed batches (default: 3)
scriptstringISO 15924 script code. Tini-trigger nito ang script validation sa quality gate.

:::info Inheritance chain Nare-resolve ang settings sa ganitong order (first wins):

pair-levellanguage-levelglobal configdefaults

Halimbawa, kung nag-set ang pairs["en:fr"] ng model, ino-override nito ang parehong language-level at global model values. :::

Non-English Source

Kung hindi English ang source language mo:

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

Lock File

Gumagawa ang Rosetta ng .i18n-rosetta.lock para i-track ang SHA-256 hashes ng translated source values. I-commit ang file na ito para pareho ang translation baseline ng lahat ng developers.

Kapag nagbago ang isang source value, hindi na magmamatch ang hash, at ire-retranslate ng rosetta ang key na iyon sa susunod na sync.

.rosettaignore

Gumawa ng .rosettaignore sa project root mo para i-exclude ang files mula sa lint scanning. Gumagamit ito ng glob patterns, tulad ng .gitignore:

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

Programmatic API

Para sa build scripts at custom integrations, mag-import nang direkta mula sa package:

import { GeminiMethod, runSync, resolveConfig } from 'i18n-rosetta';

// 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' }

Available Exports

ExportAno ang Ginagawa Nito
TranslationMethodBase class para sa lahat ng methods
LLMMethodBase class para sa LLM methods (OpenRouter)
DirectLLMMethodBase class para sa direct LLM providers (OpenAI, Anthropic, Gemini)
OpenAIMethod, AnthropicMethod, GeminiMethodDirect LLM provider classes
DeepLMethod, MicrosoftTranslatorMethod, LibreTranslateMethodTraditional MT classes
GoogleTranslateMethodGoogle Cloud Translation
LLMCoachedMethodCoached LLM (OpenRouter + coaching data)
APIMethodRemote API client
runSync, runContentSyncFull sync pipeline
resolveConfig, resolvePairsConfig resolution
validateTranslationsQuality gate
loadCoachingData, findDictionaryMatchesCoaching utilities

Custom Provider Extension

I-extend ang DirectLLMMethod para magdagdag ng bagong LLM provider sa ~40 lines:

import { DirectLLMMethod } from 'i18n-rosetta';

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.'];
}
}

Makukuha mo ang translate, coaching, retry loops, model validation, quality tiers, at setup help nang libre. Ang HTTP request shape lang ang provider-specific. Para sa non-LLM adapters na gumagamit ng raw fetch(), gamitin ang shared fetchWithRetry() helper mula sa lib/methods/fetch-with-retry.js imbes na magsulat ng sarili mong retry loop.


Tingnan Din