jackwener/OpenCLI · error · ArgumentError

wikidata language "${value}" is not a valid language code

Error message

wikidata language "${value}" is not a valid language code

What it means

requireLanguage validates the language option for wikidata commands against /^[a-z]{2,3}(-[a-z]{2,8})?$/ — an ISO 639 code of 2-3 letters plus optional region suffix. Invalid codes throw this ArgumentError. The default is 'en' when the option is omitted.

Source

Thrown at clis/wikidata/utils.js:53

export function requireEntityId(value) {
    const raw = String(value ?? '').trim().toUpperCase();
    if (!raw) throw new ArgumentError('wikidata entity id is required (e.g. "Q937")');
    // Tolerate URL-paste like `https://www.wikidata.org/wiki/Q937`.
    const stripped = raw.replace(/^HTTPS?:\/\/[^/]+\/WIKI\//i, '');
    if (!ENTITY_ID_PATTERN.test(stripped)) {
        throw new ArgumentError(
            `wikidata entity id "${value}" is not a valid Q/P/L identifier`,
            'Expected format: "Q<digits>" (item), "P<digits>" (property), or "L<digits>" (lexeme).',
        );
    }
    return stripped;
}

export function requireLanguage(value, defaultValue = 'en') {
    const raw = String(value ?? defaultValue).trim().toLowerCase();
    // Wikidata language codes are 2-3 letter ISO 639 codes plus optional region (`zh-hans`).
    if (!/^[a-z]{2,3}(-[a-z]{2,8})?$/.test(raw)) {
        throw new ArgumentError(
            `wikidata language "${value}" is not a valid language code`,
            'Expected an ISO 639 language code such as "en", "fr", "zh", "zh-hans".',
        );
    }
    return raw;
}

export async function wikidataFetch(url, label) {
    let resp;
    try {
        resp = await fetch(url, { headers: { 'user-agent': UA, accept: 'application/json' } });
    }
    catch (err) {
        throw new CommandExecutionError(
            `${label} request failed: ${err?.message ?? err}`,
            'Check that www.wikidata.org is reachable from this network.',
        );
    }

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Use a valid ISO 639 code: en, fr, zh, etc.
  2. Convert region/underscore forms: zh_CN -> zh-hans or zh (lowercase + hyphen only)
  3. Drop extra subtags beyond one region segment (en-US is fine, en-US-POSIX is not)
  4. Omit the flag entirely to use the default language 'en'

Example fix

// before
await runCli(['wikidata', 'search', 'cat', '--language', 'zh_CN']);
// after
await runCli(['wikidata', 'search', 'cat', '--language', 'zh-hans']);
Defensive patterns

Strategy: validation

Validate before calling

const LANG_RE = /^[a-z]{2,3}(-[a-z]{2,8})?$/;
const lang = String(rawLang ?? 'en').trim().toLowerCase();
if (!LANG_RE.test(lang)) throw new Error(`invalid language code: ${rawLang}`);
await runCli(['wikidata', 'search', query, '--language', lang]);

Type guard

function isValidLanguageCode(v) { return typeof v === 'string' && /^[a-z]{2,3}(-[a-z]{2,8})?$/.test(v.trim().toLowerCase()); }

Try / catch

try {
    await runCli(['wikidata', 'search', query, '--language', lang]);
} catch (e) {
    if (/not a valid language code/.test(e.message)) {
        console.error(`Bad --language "${lang}"; falling back to en`);
        await runCli(['wikidata', 'search', query, '--language', 'en']);
    } else throw e;
}

Prevention

When it happens

Trigger: Calling a wikidata command with `--language` set to something like 'english', 'en-US-x-foo' (region too long), 'e', 'zh_CN' (underscore instead of hyphen), or an empty string that overrides the default.

Common situations: Typing the language name instead of its code ('english' vs 'en'); using underscores (zh_CN) from locale env vars like LC_ALL; overly specific BCP-47 tags like 'en-US-POSIX' that exceed the pattern; passing '' explicitly instead of omitting the flag.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/3f4bcbe1eb4d87b6. Report an issue: GitHub.