Currently, the General registry has no guidelines regarding natural languages, other than that registered packages should be useful to others […, not only] for a closed group.
Given that the General registry addresses a wide international audience, it makes sense to me that packages should use “international English” both in their code (comments) and their documentation as the “lingua franca” of computing. Very occasionally, we get registrations for non-English packages, such as New package: RadarDOU v1.0.3 · Pull Request #155076 · JuliaRegistries/General.
I completely appreciate the usefulness of “localized” software in many contexts. In education at the pre-university level, having to work in a non-native language can be a significant barrier. Also, a package might have a “local” focus, such as the submission cited above that interfaces with a database specific to Brazil, and thus sensibly involves Portuguese.
The question is how we should treat such packages in the General registry. Portuguese, as a Western language, is probably something that English speakers could manage to interface with. But an API with function names that is entirely in Chinese or Hindi (non-latin scripts), while technically possible due to Julia’s unicode support, would be a considerable barrier to a wide audience.
It would make sense to me to explicitly exclude such packages from General, but to recommend alternative registries that aim at different natural languages. I don’t think we have any such registries, certainly none that are “official”, but I wonder what people think about this, or if there are any organizations who might be interested in taking up something like “national” Julia registries.
What I think should definitely be fine is multilingual packages, as I suggested in a PR to the package in question. At the very least, packages should probably have a README in English, while keeping any non-English versions as a secondary resource for non-native English speakers. Current coding agents and LLMs make such translations relatively easy to maintain. Not that automatic translation is entirely without pitfalls. Clearly, it’s preferably for a qualified human to have a hand in the translation. But, realistically, LLMs are getting pretty good at translation. (Of course, the general LLM guidelines still apply).
There are also possibilities for a full bilingual API, by exploiting Julia’s ability to have keyword arguments refer to each other. For example, what I suggested in the PR is an alias search for the function buscar
function buscar(
client::RadarDOUClient;
query::Union{String, Nothing} = nothing,
date_from::Union{String, Nothing} = nothing,
date_to::Union{String, Nothing} = nothing,
section::Union{String, Nothing} = nothing,
secao::Union{String, Nothing} = section,
type::Union{String, Nothing} = nothing,
tipo::Union{String, Nothing} = type,
page::Int = 1,
limit::Int = 20
)
if isnothing(query) && isnothing(date_from) && isnothing(date_to) &&
isnothing(secao) && isnothing(tipo)
throw(RadarDOUError(
"Pelo menos um filtro e obrigatorio: query, date_from, date_to, secao ou tipo.",
"FILTER_REQUIRED",
nothing
))
end
q = Dict{String, Any}("page" => page, "limit" => min(limit, 100))
!isnothing(query) && (q["query"] = query)
!isnothing(date_from) && (q["date_from"] = date_from)
!isnothing(date_to) && (q["date_to"] = date_to)
!isnothing(secao) && (q["secao"] = secao)
!isnothing(tipo) && (q["tipo"] = tipo)
_request(client, :GET, "/publications"; query = q)
end
"""
search(client; query=nothing, date_from=nothing, date_to=nothing, section=nothing, type=nothing, page=1, limit=20)
Search publications in the DOU (Diario Oficial da Uniao). At least one filter is required.
# Example
```julia
search(client; date_from="2026-05-01", limit=10)
search(client; query="licitacao", date_from="2026-05-01")
search(client; query="edital", section="DO3", type="Edital",
date_from="2026-01-01", date_to="2026-05-08")
```
"""
function search(client::RadarDOUClient; kwargs...)
buscar(client; kwargs...)
end
Note each version documenting its own localized keyword arguments, while actually accepting the full range of bilingual arguments.
This trick also works very well for the somewhat related use case of having “mathy” unicode APIs with an ASCII-fallback, following the usual style guide recommendation that public APIs should not have mandatory unicode:
function f(; eta=1.0, η=eta)
# ...
end
Are there other techniques or creative ideas that might be useful for maintaining multi-lingual packages?