aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-05-17 15:50:37 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2024-05-17 15:50:37 +0200
commitf8c4ee3d3cda65b9f6cf790160cbedff618cb0e3 (patch)
tree526facc6269d1ac9fe01fa2d5c910b60aef0afaa
parent6139da3d41b9e1c2eebd5f323bb0126775233d1b (diff)
i18n: Add section merge + duplicate key detection to gettext.
-rw-r--r--core/text/i18n/gettext.odin19
-rw-r--r--tests/core/text/i18n/test_core_text_i18n.odin15
2 files changed, 27 insertions, 7 deletions
diff --git a/core/text/i18n/gettext.odin b/core/text/i18n/gettext.odin
index 35d355a40..3ac9109ef 100644
--- a/core/text/i18n/gettext.odin
+++ b/core/text/i18n/gettext.odin
@@ -93,9 +93,9 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur
return translation, .MO_File_Incorrect_Plural_Count
}
- section_name := ""
for k in keys {
- key := string(k)
+ section_name := ""
+ key := string(k)
// Scan for <context>EOT<key>
for ch, i in k {
@@ -105,12 +105,25 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur
break
}
}
+
+ // If we merge sections, then all entries end in the "" context.
+ if options.merge_sections {
+ section_name = ""
+ }
+
section_name, _ = strings.intern_get(&translation.intern, section_name)
if section_name not_in translation.k_v {
translation.k_v[section_name] = {}
}
+ section := &translation.k_v[section_name]
interned_key, _ := strings.intern_get(&translation.intern, string(key))
+
+ // Duplicate key should not be allowed.
+ if interned_key in section {
+ return translation, .Duplicate_Key
+ }
+
interned_vals := make([]string, len(vals))
last_val: string
@@ -118,8 +131,6 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur
interned_vals[i], _ = strings.intern_get(&translation.intern, string(v))
last_val = interned_vals[i]
}
-
- section := &translation.k_v[section_name]
section[interned_key] = interned_vals
}
}
diff --git a/tests/core/text/i18n/test_core_text_i18n.odin b/tests/core/text/i18n/test_core_text_i18n.odin
index 11d2f9c0c..dcbdeb0c4 100644
--- a/tests/core/text/i18n/test_core_text_i18n.odin
+++ b/tests/core/text/i18n/test_core_text_i18n.odin
@@ -87,6 +87,15 @@ TESTS := []Test_Suite{
},
{
+ file = "assets/I18N/mixed_context.mo",
+ loader = i18n.parse_mo_file,
+ plural = nil,
+ // Message1 exists twice, once within Context, which has been merged into ""
+ err = .Duplicate_Key,
+ options = {merge_sections = true},
+ },
+
+ {
file = "assets/I18N/nl_NL.mo",
loader = i18n.parse_mo_file,
plural = nil, // Default pluralizer
@@ -128,7 +137,7 @@ TESTS := []Test_Suite{
{
file = "assets/I18N/nl_NL-qt-ts.ts",
loader = i18n.parse_qt_linguist_file,
- plural = nil, // Default pluralizer
+ plural = nil, // Default pluralizer
options = {merge_sections = true},
tests = {
// All of them are now in section "", lookup with original section should return the key.
@@ -151,7 +160,7 @@ TESTS := []Test_Suite{
{
file = "assets/I18N/duplicate-key.ts",
loader = i18n.parse_qt_linguist_file,
- plural = nil, // Default pluralizer
+ plural = nil, // Default pluralizer
options = {merge_sections = true},
err = .Duplicate_Key,
},
@@ -160,7 +169,7 @@ TESTS := []Test_Suite{
{
file = "assets/I18N/duplicate-key.ts",
loader = i18n.parse_qt_linguist_file,
- plural = nil, // Default pluralizer
+ plural = nil, // Default pluralizer
},
}