mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
Separate the I18N calls for immutable strings and for pluraliseable strings.
Also update tests.
This commit is contained in:
+123
-39
@@ -84,64 +84,149 @@ DEFAULT_PARSE_OPTIONS :: Parse_Options{
|
||||
merge_sections = false,
|
||||
}
|
||||
|
||||
/*
|
||||
Several ways to use:
|
||||
- get(key), which defaults to the singular form and i18n.ACTIVE catalog, or
|
||||
- get(key, number), which returns the appropriate plural from the active catalog, or
|
||||
- get(key, number, catalog) to grab text from a specific one.
|
||||
*/
|
||||
get_single_section :: proc(key: string, number := 1, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
/*
|
||||
A lot of languages use singular for 1 item and plural for 0 or more than 1 items. This is our default pluralize rule.
|
||||
*/
|
||||
plural := 1 if number != 1 else 0
|
||||
// *****************
|
||||
// get() PROC GROUP
|
||||
// *****************
|
||||
|
||||
if catalog.pluralize != nil {
|
||||
plural = catalog.pluralize(number)
|
||||
}
|
||||
return get_by_slot(key, plural, catalog)
|
||||
/*
|
||||
Returns the first translation string for the passed `key`.
|
||||
It is also aliases with `get( )`.
|
||||
|
||||
Two ways to use it:
|
||||
- get(key), which defaults to the `i18n.ACTIVE`` catalogue, or
|
||||
- get(key, catalog) to grab text from a specific loaded catalogue.
|
||||
|
||||
Inputs:
|
||||
- key: the string to translate.
|
||||
- catalog: the catalogue to use for the translation (defaults to i18n.ACTIVE)
|
||||
|
||||
Returns: the translated string or the original `key` if no translation was found.
|
||||
*/
|
||||
get_single_section :: proc(key: string, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
return get_by_slot(key, 0, catalog)
|
||||
}
|
||||
|
||||
/*
|
||||
Several ways to use:
|
||||
- get(section, key), which defaults to the singular form and i18n.ACTIVE catalog, or
|
||||
- get(section, key, number), which returns the appropriate plural from the active catalog, or
|
||||
- get(section, key, number, catalog) to grab text from a specific one.
|
||||
*/
|
||||
get_by_section :: proc(section, key: string, number := 1, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
/*
|
||||
A lot of languages use singular for 1 item and plural for 0 or more than 1 items. This is our default pluralize rule.
|
||||
*/
|
||||
plural := 1 if number != 1 else 0
|
||||
Returns the first translation string for the passed `key` in a specific section or context.
|
||||
It is also aliases with `get( )`.
|
||||
|
||||
if catalog.pluralize != nil {
|
||||
plural = catalog.pluralize(number)
|
||||
}
|
||||
return get_by_slot(section, key, plural, catalog)
|
||||
Two ways to use it:
|
||||
- get(section, key), which defaults to the `i18n.ACTIVE`` catalogue, or
|
||||
- get(section, key, catalog) to grab text from a specific loaded catalogue.
|
||||
|
||||
Inputs:
|
||||
- section: the catalogue section (sometime also called 'context') from which to lookup the translation
|
||||
- key: the string to translate.
|
||||
- catalog: the catalogue to use for the translation (defaults to i18n.ACTIVE)
|
||||
|
||||
Returns: the translated string or the original `key` if no translation was found.
|
||||
*/
|
||||
get_by_section :: proc(section, key: string, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
return get_by_slot(section, key, 0, catalog)
|
||||
}
|
||||
|
||||
get :: proc{get_single_section, get_by_section}
|
||||
|
||||
// *****************
|
||||
// get_n() PROC GROUP
|
||||
// *****************
|
||||
|
||||
/*
|
||||
Several ways to use:
|
||||
- get_by_slot(key), which defaults to the singular form and i18n.ACTIVE catalog, or
|
||||
- get_by_slot(key, slot), which returns the requested plural from the active catalog, or
|
||||
- get_by_slot(key, slot, catalog) to grab text from a specific one.
|
||||
Returns the translation string for the passed `key` in a specific plural form (if present in the catalogue).
|
||||
It is also aliases with `get_n( )`.
|
||||
|
||||
Two ways to use it:
|
||||
- get_n(key, quantity), which returns the appropriate plural from the active catalogue, or
|
||||
- get_n(key, quantity, catalog) to grab text from a specific loaded catalogue.
|
||||
|
||||
Inputs:
|
||||
- key: the string to translate.
|
||||
- qantity: the quantity of item to be used to select the correct plural form.
|
||||
- catalog: the catalogue to use for the translation (defaults to i18n.ACTIVE)
|
||||
|
||||
Returns: the translated string or the original `key` if no translation was found.
|
||||
*/
|
||||
get_single_section_w_plural :: proc(key: string, quantity: int, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
/*
|
||||
A lot of languages use singular for 1 item and plural for 0 or more than 1 items. This is our default pluralize rule.
|
||||
*/
|
||||
slot := 1 if quantity != 1 else 0
|
||||
|
||||
if catalog.pluralize != nil {
|
||||
slot = catalog.pluralize(quantity)
|
||||
}
|
||||
return get_by_slot(key, slot, catalog)
|
||||
}
|
||||
|
||||
/*
|
||||
Returns the translation string for the passed `key` in a specific plural form (if present in the catalogue)
|
||||
in a specific section or context.
|
||||
It is also aliases with `get_n( )`.
|
||||
|
||||
Two ways to use it:
|
||||
- get(section, key, quantity), which returns the appropriate plural from the active catalogue, or
|
||||
- get(section, key, quantity, catalog) to grab text from a specific loaded catalogue.
|
||||
|
||||
Inputs:
|
||||
- section: the catalogue section (sometime also called 'context') from which to lookup the translation
|
||||
- key: the string to translate.
|
||||
- qantity: the quantity of item to be used to select the correct plural form.
|
||||
- catalog: the catalogue to use for the translation (defaults to i18n.ACTIVE)
|
||||
|
||||
Returns: the translated string or the original `key` if no translation was found.
|
||||
*/
|
||||
get_by_section_w_plural :: proc(section, key: string, quantity: int, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
/*
|
||||
A lot of languages use singular for 1 item and plural for 0 or more than 1 items. This is our default pluralize rule.
|
||||
*/
|
||||
slot := 1 if quantity != 1 else 0
|
||||
|
||||
if catalog.pluralize != nil {
|
||||
slot = catalog.pluralize(quantity)
|
||||
}
|
||||
return get_by_slot(section, key, slot, catalog)
|
||||
}
|
||||
get_n :: proc{get_single_section_w_plural, get_by_section_w_plural}
|
||||
|
||||
// *****************
|
||||
// get_by_slot() PROC GROUP
|
||||
// *****************
|
||||
|
||||
/*
|
||||
Two ways to use:
|
||||
- get_by_slot(key, slot), which returns the requested plural from the active catalogue, or
|
||||
- get_by_slot(key, slot, catalog) to grab text from a specific loaded catalogue.
|
||||
|
||||
If a file format parser doesn't (yet) support plural slots, each of the slots will point at the same string.
|
||||
- section: the catalogue section (sometime also called 'context') from which to lookup the translation
|
||||
|
||||
Inputs:
|
||||
- key: the string to translate.
|
||||
- qantity: the translation slot to choose (slots refer to plural forms specific for each language and their meaning changes from catalogue to catalogue).
|
||||
- catalog: the catalogue to use for the translation (defaults to i18n.ACTIVE)
|
||||
|
||||
Returns: the translated string or the original `key` if no translation was found.
|
||||
*/
|
||||
get_by_slot_single_section :: proc(key: string, slot := 0, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
get_by_slot_single_section :: proc(key: string, slot: int, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
return get_by_slot_by_section("", key, slot, catalog)
|
||||
}
|
||||
|
||||
/*
|
||||
Several ways to use:
|
||||
- get_by_slot(key), which defaults to the singular form and i18n.ACTIVE catalog, or
|
||||
Two ways to use:
|
||||
- get_by_slot(key, slot), which returns the requested plural from the active catalog, or
|
||||
- get_by_slot(key, slot, catalog) to grab text from a specific one.
|
||||
|
||||
If a file format parser doesn't (yet) support plural slots, each of the slots will point at the same string.
|
||||
|
||||
Inputs:
|
||||
- section: the catalogue section (sometime also called 'context') from which to lookup the translation
|
||||
- key: the string to translate.
|
||||
- qantity: the translation slot to choose (slots refer to plural forms specific for each language and their meaning changes from catalogue to catalogue).
|
||||
- catalog: the catalogue to use for the translation (defaults to i18n.ACTIVE)
|
||||
|
||||
Returns: the translated string or the original `key` if no translation was found.
|
||||
*/
|
||||
get_by_slot_by_section :: proc(section, key: string, slot := 0, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
get_by_slot_by_section :: proc(section, key: string, slot: int, catalog: ^Translation = ACTIVE) -> (value: string) {
|
||||
if catalog == nil || section not_in catalog.k_v {
|
||||
/*
|
||||
Return the key if the catalog catalog hasn't been initialized yet, or the section is not present.
|
||||
@@ -161,7 +246,6 @@ get_by_slot_by_section :: proc(section, key: string, slot := 0, catalog: ^Transl
|
||||
get_by_slot :: proc{get_by_slot_single_section, get_by_slot_by_section}
|
||||
|
||||
/*
|
||||
Same for destroy:
|
||||
- destroy(), to clean up the currently active catalog catalog i18n.ACTIVE
|
||||
- destroy(catalog), to clean up a specific catalog.
|
||||
*/
|
||||
@@ -181,4 +265,4 @@ destroy :: proc(catalog: ^Translation = ACTIVE, allocator := context.allocator)
|
||||
delete(catalog.k_v)
|
||||
strings.intern_destroy(&catalog.intern)
|
||||
free(catalog)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user