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
- Use a valid ISO 639 code: en, fr, zh, etc.
- Convert region/underscore forms: zh_CN -> zh-hans or zh (lowercase + hyphen only)
- Drop extra subtags beyond one region segment (en-US is fine, en-US-POSIX is not)
- 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
- Convert locale formats: zh_CN -> zh-hans, never underscores
- Use 2-3 letter ISO 639 codes with at most one region subtag
- Omit --language to get the 'en' default
- Normalize language input to lowercase before passing it
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
- ${label} is required
- ${label} must be a positive integer
- ${label} must be <= ${maxValue}
- arxiv ${label} must be a positive integer
- arxiv ${label} must be <= ${maxValue}
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/3f4bcbe1eb4d87b6.
Report an issue: GitHub.