Merge pull request #3598 from Kelimion/i18n-fix

i18n: Add section merge + duplicate key detection to gettext.
This commit is contained in:
Jeroen van Rijn
2024-05-17 15:57:17 +02:00
committed by GitHub
2 changed files with 27 additions and 7 deletions
+14 -3
View File
@@ -93,8 +93,8 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur
return translation, .MO_File_Incorrect_Plural_Count return translation, .MO_File_Incorrect_Plural_Count
} }
section_name := ""
for k in keys { for k in keys {
section_name := ""
key := string(k) key := string(k)
// Scan for <context>EOT<key> // Scan for <context>EOT<key>
@@ -105,12 +105,25 @@ parse_mo_from_bytes :: proc(data: []byte, options := DEFAULT_PARSE_OPTIONS, plur
break 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) section_name, _ = strings.intern_get(&translation.intern, section_name)
if section_name not_in translation.k_v { if section_name not_in translation.k_v {
translation.k_v[section_name] = {} translation.k_v[section_name] = {}
} }
section := &translation.k_v[section_name]
interned_key, _ := strings.intern_get(&translation.intern, string(key)) 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)) interned_vals := make([]string, len(vals))
last_val: string 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)) interned_vals[i], _ = strings.intern_get(&translation.intern, string(v))
last_val = interned_vals[i] last_val = interned_vals[i]
} }
section := &translation.k_v[section_name]
section[interned_key] = interned_vals section[interned_key] = interned_vals
} }
} }
@@ -86,6 +86,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", file = "assets/I18N/nl_NL.mo",
loader = i18n.parse_mo_file, loader = i18n.parse_mo_file,