ch02-02-crate-localization: initial documentation
* the text is representing the functinality found in OrbTK v0.3.1-alpha4 Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
This commit is contained in:
@@ -1,3 +1,108 @@
|
|||||||
# The Localization Crate
|
# The Localization Crate
|
||||||
|
|
||||||
WIP: all about the OrbTK localization
|
Localization is a research task by itself, if you want to resolve all syntactic
|
||||||
|
rules that are found when writing prose in different languages.
|
||||||
|
OrbTK's localization crate isn't ready to resolve all this complexity, but
|
||||||
|
this may improve in further releases.
|
||||||
|
|
||||||
|
Starting with the given implementation, `localization` can offer methods, that
|
||||||
|
are able to match and replace text strings. The usage of the `localization` crate is
|
||||||
|
optional. If you don't need any multi lingual adaptions inside your widgets, simply
|
||||||
|
do not include the `localization` sugar.
|
||||||
|
|
||||||
|
## The building blocks of `localization`
|
||||||
|
|
||||||
|
If you want to enable the users to select and change the desired display
|
||||||
|
languare of the GUI at runtime, the toolkit needs to match up a requested
|
||||||
|
text strings (the key) that should be presented inside the view and substitute
|
||||||
|
it with the corresponding translation string (the target value). Dictionaries
|
||||||
|
are used to organize the keys as word lists.
|
||||||
|
|
||||||
|
OrbTK's `localization` implementation has choosen to persitently store the
|
||||||
|
translation strings inside a `ron` file. When introducing the new syntax
|
||||||
|
structure used inside a `ron` filetype, it was one goal of the authors to
|
||||||
|
easily match rust types to ron types.
|
||||||
|
|
||||||
|
You can save each supported language in its individual ron file. The language
|
||||||
|
files need to be destinctable. A natural way to implement this requirement
|
||||||
|
is the usage of unique `language ids`. Most **operating systems* take advantage
|
||||||
|
of a `locale subsystem`, and save the identification of the active language in
|
||||||
|
the `lang` enviroment variable. It's good practice to include the language id in
|
||||||
|
the corresponding ron file name.
|
||||||
|
|
||||||
|
When you include the `localization` functionality in your OrbTK code, you
|
||||||
|
should define constants for each supported `language id`, that will reference the
|
||||||
|
ron file in question.
|
||||||
|
|
||||||
|
When calling the `RonLocalization` methods addressing the combination of a language
|
||||||
|
id and the corresponding dictionary you are able to store the result in `language`
|
||||||
|
variable. The crate methods will handle all the havy lifting to substitute the
|
||||||
|
source values of the text attributes inside the views with their matching translation
|
||||||
|
strings in the addressed dictionary.
|
||||||
|
|
||||||
|
## The ron file structure
|
||||||
|
|
||||||
|
In OrbTK, the structure `RonLocalizationBuilder` is defined to take values for
|
||||||
|
the following parameters
|
||||||
|
|
||||||
|
* language: a String
|
||||||
|
* dictionaries: a HashMap
|
||||||
|
|
||||||
|
The ron filename representing a language localization should include the language
|
||||||
|
identifier to ease its distiction from another.
|
||||||
|
|
||||||
|
Dictionaries itself are stored
|
||||||
|
The dictionary is represended by a key value pair
|
||||||
|
|
||||||
|
A class `Dictionary` will include a `map` named **words**.
|
||||||
|
The ron type `map` is like a type `struct**, but keys are also values instead of
|
||||||
|
just beenig identifiers.
|
||||||
|
|
||||||
|
** using a ron file
|
||||||
|
|
||||||
|
Activationg the `localization` crate inside your source code boils down this
|
||||||
|
short example code.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
pub const EN_US: &str = include_str!("../assets/dictionary_en_US.ron");
|
||||||
|
pub const DE_DE: &str = include_str!("../assets/dictionary_de_DE.ron");
|
||||||
|
pub const ES_ES: &str = include_str!("../assets/dictionary_es_ES.ron");
|
||||||
|
|
||||||
|
let mut localization = RonLocalization::create()
|
||||||
|
.language("en_US")
|
||||||
|
.dictionary("en_US", EN_US)
|
||||||
|
.build();
|
||||||
|
if let Some(text) = localization.text("hello") {
|
||||||
|
println!("{}", text);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut localization = RonLocalization::create()
|
||||||
|
.language("en_US")
|
||||||
|
.dictionary("en_US", EN_US)
|
||||||
|
.build();
|
||||||
|
if let Some(text) = localization.text("hello") {
|
||||||
|
println!("{}", text);
|
||||||
|
}
|
||||||
|
|
||||||
|
let localization = RonLocalization::create()
|
||||||
|
.language("de_DE")
|
||||||
|
.dictionary("de_DE", DE_DE)
|
||||||
|
.build();
|
||||||
|
if let Some(text) = localization.text("hello") {
|
||||||
|
println!("{}", text);
|
||||||
|
}
|
||||||
|
|
||||||
|
let localization = RonLocalization::create()
|
||||||
|
.language("es_ES")
|
||||||
|
.dictionary("es_ES", ES_ES)
|
||||||
|
.build();
|
||||||
|
if let Some(text) = localization.text("hello") {
|
||||||
|
println!("{}", text);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Sure, this code isn't elegant nor will it suite a real applications demands.
|
||||||
|
What is does show is the logic, to bind a ron file (storing the translations
|
||||||
|
of a given language) to a const. When calling `RonLocalization`, the `text`
|
||||||
|
method will resolve text attributes inside a view or any rust primitive with
|
||||||
|
the translation text resolved in the language dictionary.
|
||||||
|
|||||||
Reference in New Issue
Block a user