I18n with gettext for Hugo.
Currently compliant with Hugo 0.110.0.
pip install hugo-gettext
There are three commands corresponding to three steps that hugo-gettext supports:
hugo-gettext extract
extracts messages from source files (files in the source language) to one or many POT files;hugo-gettext compile
compiles PO files to binary MO files;hugo-gettext generate
uses MO files to generate target files (files in target languages).
These are types of text that hugo-gettext can extract messages from and can generate in target languages:
- Front matter and content in content files;
- Strings in string file (i.e. "translation table") in
i18n
folderother
keys- Support
comment
- Menu item names, site title, and site description in site config file:
all in
languages.en
config key:- title:
title
- description:
params.description
- menu:
menu.main.<entry>.name
- title:
- Data in data files: processed as Markdown (front matter text aren't processed as Markdown).
Each project can specify multiple text domains to work with (i.e. messages are extracted to multiple POT files and subsequently multiple PO files are available to use for generation), however all types of text outside content files always belong to a default domain which is derived from a name that each project must have. Content files can be associated with the default domain or custom domains.
- From a folder containing subdirectories with PO files inside,
in the form of
<dir>/<lang_code>/<domain>.po
- To a
locale
folder - Structure:
locale/<lang_code>/LC_MESSAGES/<domain>.po
- Conditions in front matter
hugo_lang_code
s are prepended to absolute links inaliases
dict in front matter- How data file generation works
- Requirement for a language to be qualified
(a config block is added and data files are generated, string file is generated anyway):
- there's no content file to translate but string file is translated, or
- there are content files to translate and some files are translated
- A content file is considered translated if
- The front matter is translated, or
- There's nothing in the content, or
- The translation rate of the content is higher than 50%
CommonMark compliant. All core Markdown elements are supported, as well as table, and definition list.
Some notes about how different elements are handled:
- Inlines: hard line breaks are replaced with
, newlines and consecutive spaces are not kept; - Content of each HTML block isn't parsed into finer tokens but processed as a whole;
- If the string contains only one shortcode
- Newlines are kept for arguments quoted with backticks
- hg_stop shortcode to stop processing a content file
package
:Project-Id-Version
in POT metadatareport_address
andteam_address
:Report-Msgid-Bugs-To
andLanguage-Team
in POT metadataexcluded_keys
: in front matterexcluded_data_keys
: in data filesrtl_langs
shortcodes
: can use*
wildcard to indicate all shortcodes
The path of the file should be passed as an argument to the command line with -c
or --customs
option,
or set in the config file with customs
key.
The following functions are called to make default_domain_name
, excluded_keys
,
report_address
, team_address
, and rtl_langs
attributes of Config
:
get_default_domain_name
: will be called withpackage
as an argument, returnspackage
by defaultget_custom_excluded_keys
: returns an empty set by defaultget_pot_fields
: returns a dictionary of'report_address'
and'team_address'
keysget_rtl_langs
: returns a list of codes of RTL languages
Two functions are called during the generation step:
load_lang_names
: returns an empty dictionary by defaultconvert_lang_code
: function to convert gettext language codes to Hugo language codes, returns gettext language codes by default
- With Conda
conda env create -f environment.yml
conda activate hg
poetry install