Skip to content

Internationalisation

Challenge factories that emit human-readable prompts (EmojiGrid, Math) accept an optional PromptTranslator and locale so you can show the prompt in the user's language.

Bundled translator

from captchakit import (
    DefaultTranslator,
    EmojiGridChallengeFactory,
    MathChallengeFactory,
)

translator = DefaultTranslator()

grid = EmojiGridChallengeFactory(translator=translator, locale="tr")
math = MathChallengeFactory(translator=translator, locale="de")

Built-in locales: en, tr, de, es. Unknown locales fall back to English.

Keys

Key Used by Params
grid.pick EmojiGridChallengeFactory emoji
math.ask MathChallengeFactory a, op, b

TextChallengeFactory and WordChallengeFactory emit the solution as the prompt — no translation needed.

Custom catalog

from captchakit import DefaultTranslator

translator = DefaultTranslator(
    catalog={
        "fr": {
            "grid.pick": "Quelle case contient {emoji} ? Réponds avec le numéro.",
            "math.ask": "{a} {op} {b} = ?",
        },
    },
)

The constructor starts from the bundled catalogue; your overrides merge on top per-locale.

Bring your own

PromptTranslator is a Protocol: any object with translate(key, locale, /, **params) -> str works. Wire it to gettext, Django's translation engine, or a pre-loaded JSON bundle — captchakit doesn't care.