From f8c4ee3d3cda65b9f6cf790160cbedff618cb0e3 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 17 May 2024 15:50:37 +0200 Subject: [PATCH] i18n: Add section merge + duplicate key detection to gettext. --- core/text/i18n/gettext.odin | 19 +++++++++++++++---- tests/core/text/i18n/test_core_text_i18n.odin | 15 ++++++++++++--- 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 EOT 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 @@ -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", loader = i18n.parse_mo_file, @@ -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 }, }