2020-03-08 12:04:18 +01:00
|
|
|
module I18N
|
|
|
|
|
|
|
|
using Dates
|
|
|
|
|
|
|
|
language_map = include("codes.jl")
|
|
|
|
|
|
|
|
translationpath(langcode, domain = "base") =
|
|
|
|
joinpath(realpath("."), "locales/$(langcode)/LC_MESSAGES/$(domain).pot")
|
|
|
|
|
|
|
|
macro __str(phrase)
|
|
|
|
push!(Main.i18n_cache, (file = __source__.file,
|
|
|
|
line = __source__.line,
|
|
|
|
strid = phrase))
|
|
|
|
return esc(quote
|
2020-03-08 12:17:51 +01:00
|
|
|
get(get(i18n, @language, Dict()),
|
2020-03-08 12:04:18 +01:00
|
|
|
$phrase, $phrase)
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
macro translations(languages...)
|
|
|
|
return esc(quote
|
|
|
|
i18n = Dict{String,Dict{String,String}}()
|
|
|
|
# (lang, file.jl, line) => translation
|
|
|
|
i18n_cache = Any[]
|
|
|
|
# lang => [(name, mail, year)]
|
|
|
|
i18n_translators = Dict{String,Array{Tuple{String,String,String}}}()
|
|
|
|
for language in $languages
|
|
|
|
i18n[string(language)] = Dict{String,String}()
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
macro translate(lang, id, translation)
|
|
|
|
return esc(:(i18n[string($lang)][$id] = $translation))
|
|
|
|
end
|
|
|
|
|
|
|
|
function translator_list(translators)
|
|
|
|
join(map(t -> string("# ", t[1], " ", "<", t[2], ">", " ",
|
|
|
|
t[3], "."),
|
|
|
|
translators),
|
|
|
|
"\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
function po_header(LANG, PROGRAM, VERSION, C_YEARS, C_AUTHORS, TRANSLATORS)
|
|
|
|
"""# $LANG translation for $PROGRAM $VERSION
|
|
|
|
# Copyright (C) $C_YEARS $C_AUTHORS
|
|
|
|
# This file is distributed under the same license as $PROGRAM.
|
|
|
|
$(translator_list(TRANSLATORS))
|
|
|
|
#
|
|
|
|
msgid ""
|
|
|
|
msgstr ""
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
|
|
|
function format(file, line, phrase, translation = "")
|
|
|
|
string("#: ", relpath(string(file)), ":", line, "\n",
|
|
|
|
"msgid ", "\"", phrase, "\"", "\n",
|
|
|
|
"msgstr ", "\"", translation, "\"", "\n\n")
|
|
|
|
end
|
|
|
|
|
|
|
|
lang_expand(lang) = language_map[lang]
|
|
|
|
|
|
|
|
current_year() = Dates.today() |> year
|
|
|
|
|
|
|
|
macro write_po_files(name = nothing, version = nothing,
|
|
|
|
authors = nothing, year = nothing)
|
|
|
|
return esc(quote
|
|
|
|
unique!(i18n_cache)
|
|
|
|
# Sort by line & by file
|
|
|
|
sort!(i18n_cache, by = x -> x[2])
|
|
|
|
sort!(i18n_cache, by = first)
|
|
|
|
# Write to file
|
|
|
|
for language in keys(i18n)
|
|
|
|
translationfile = I18N.translationpath(string(language))
|
|
|
|
mkpath(dirname(translationfile))
|
|
|
|
open(translationfile, "w") do io
|
|
|
|
translators = get(i18n_translators, language, [])
|
|
|
|
write(io, I18N.po_header(lang_expand(language),
|
|
|
|
something($name, uppercasefirst(basename(realpath(".")))),
|
|
|
|
something($version, "0.1.0-dev"),
|
|
|
|
something($year, I18N.current_year()),
|
|
|
|
join(something($authors,
|
|
|
|
first.(translators)),
|
|
|
|
", "), translators))
|
|
|
|
for tr in i18n_cache
|
|
|
|
translation = get(get(i18n, language, Dict()), tr.strid, "")
|
|
|
|
write(io,
|
|
|
|
I18N.format(tr.file, tr.line, tr.strid, translation))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
macro translator(lang, name, email, copyright)
|
|
|
|
# @show $lang
|
|
|
|
return esc(quote
|
|
|
|
if !($lang in keys(i18n_translators))
|
|
|
|
i18n_translators[$lang] = []
|
|
|
|
end
|
|
|
|
push!(i18n_translators[$lang], ($name, $email, $copyright))
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
2020-03-08 12:17:51 +01:00
|
|
|
macro language()
|
|
|
|
"en"
|
|
|
|
end
|
2020-03-08 12:04:18 +01:00
|
|
|
|
|
|
|
export @__str, @translations, @translate,
|
|
|
|
@translator, @write_po_files, lang_expand
|
|
|
|
|
|
|
|
end # module
|