kellpossible / cargo-i18n

A Rust Cargo sub-command and libraries to extract and build localization resources to embed in your application/library
MIT License
121 stars 25 forks source link

Make implementation of current language configurable #82

Open bikeshedder opened 2 years ago

bikeshedder commented 2 years ago

Right now the current language is set at application level. This causes tests to fail (#48) and makes it impossible to change languages for a single thread or worker (#59).

While it is desirable to add new methods like get_lang it would also help a lot if the way the current language is determined was configurable. Therefore I'm proposing a CurrentLanguage trait which can be implemented for different ways of storing the current language:

That's all the possible Implementations I can think of at the moment.

This is blocked by #59 as switching the current language requires a call to load_languages which is not desired when switching the language at runtime for single thread or task.

kellpossible commented 2 years ago

Thanks for this idea!

With regards to #59 how would you compare this proposal to wip PR https://github.com/kellpossible/cargo-i18n/pull/62 ?

The gettext language loader uses the https://docs.rs/tr/latest/tr/ library under the hood, which has a global static store for current language, I guess these implementations might only be possible with Fluent?

bikeshedder commented 2 years ago

I consider those to be complementary. I'm currently working on #59 but have diverged from #62 and added the methods directly to the FluentLanguageLoader as it introduces way less code duplication. I have added a few methods to the loader:

Those methods work exactly like their conterpart without the _lang_ part, but take a &[&LanguageIdentifier] as argument.

Once this PR is ready to merge adding support for the CurrentLanguage trait is just a matter of storing a Box<dyn CurrentLanguage> in the loader and moving the logic of the get, get_args and get_args_concrete, get_args_fluent methods into the CurrentLanguage implementation of ApplicationCurrentLanguage.

After that is done adding the other CurrentLanguage implementations should be a breeze.