I've never actually done i18n so I might be full of crap, but I think a nice way to do it would be something along these lines:

1) (optionally) all printing functions actually take a different type than just plain string, forcing you to use the translation function

2) the function looks something like this:

PrintableString tr(string fmt, T...)(T t) {
    version(getstrings)
         pragma(msg, "string: " ~ fmt);
    return PrintableString(format(translation[lang][fmt], t));
}


So if you compile with -version=getstrings, the output from dmd can then be used to make your translation key file. It takes a format string so the translator can use positional arguments if they need to be reordered.

I've got half a mind to make those params commentable too so you can name them or something but not sure how to do that without being annoying. Maybe they can be alias arguments to the template, and then use stringof to get the variable name and annotations, but idk.

Reply via email to