g18n #
A small, platform-agnostic translation library for Gleam webpages.
Installation #
gleam add g18n
Quick start #
Keep one JSON file per language and load the file selected by your application:
{
"page": {
"title": "Welcome",
"greeting": "Hello {name}!",
"navigation": {
"home": "Home",
"contact": "Contact"
}
}
}
import g18n
pub fn translations(json_source: String) {
let assert Ok(strings) =
g18n.translations_from_nested_json(json_source)
let translator = g18n.new_translator(strings)
let params =
g18n.new_format_params()
|> g18n.add_param("name", "Alice")
g18n.translate(translator, "page.title")
// "Welcome"
g18n.translate_with_params(translator, "page.greeting", params)
// "Hello Alice!"
}
Your application decides which language file to load. g18n only stores and looks up its strings; it does not impose locale or language rules.
Lookup behavior #
Translations use dotted keys such as page.navigation.contact.
translate checks the primary translations and then optional fallback
translations. If neither contains the key, it returns the original key. This
makes missing strings visible without crashing the page.
let fallback =
g18n.new_translations()
|> g18n.add_translation("page.title", "Welcome")
let translator =
g18n.new_translator(selected_language)
|> g18n.with_fallback(fallback)
translate_with_params replaces supplied {parameter} placeholders. A
placeholder without a value remains unchanged.
Adding translations in Gleam #
let translations =
g18n.new_translations()
|> g18n.add_translation("page.title", "Welcome")
|> g18n.add_translation("page.greeting", "Hello {name}!")
let translator = g18n.new_translator(translations)
Context-specific strings use the exact key@context convention:
let translations =
g18n.new_translations()
|> g18n.add_translation("open", "Open")
|> g18n.add_context_translation("open", "file", "Open file")
let translator = g18n.new_translator(translations)
g18n.translate_with_context(translator, "open", g18n.Context("file"))
// "Open file"
JSON formats #
Flat JSON stores dotted keys directly:
{
"page.title": "Welcome",
"page.greeting": "Hello {name}!"
}
Use translations_from_json and translations_to_json for flat JSON.
Nested JSON stores the same keys as objects:
{
"page": {
"title": "Welcome",
"greeting": "Hello {name}!"
}
}
Use translations_from_nested_json and translations_to_nested_json for
nested JSON.
Development tooling #
PO generation, source scanning, and translation analytics belong in the
separately published g18n-dev package.
License #
MIT