]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-language: Add language_default setting
authorMarco Bettini <marco.bettini@open-xchange.com>
Wed, 14 Feb 2024 16:04:33 +0000 (16:04 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Jan 2025 08:39:58 +0000 (10:39 +0200)
src/lib-language/lang-settings.c
src/lib-language/lang-settings.h

index 7e21d69efe8f45d71c6edb4877a3c23226985746..3cbeed1591844e3db581416cf603c09b7a59039e 100644 (file)
@@ -17,6 +17,7 @@ static bool langs_settings_ext_check(struct event *event, void *_set,
 
 static const struct setting_define lang_setting_defines[] = {
        DEF(STR, name),
+       SETTING_DEFINE_STRUCT_BOOL("language_default", is_default, struct lang_settings),
        DEF(BOOLLIST, filters),
        DEF(UINT, filter_lowercase_token_maxlen),
        DEF(STR,  filter_normalizer_icu_id),
@@ -33,6 +34,7 @@ static const struct setting_define lang_setting_defines[] = {
 
 const struct lang_settings lang_default_settings = {
        .name = "",
+       .is_default = FALSE,
        .filters = ARRAY_INIT,
        .filter_lowercase_token_maxlen = 250,
        .filter_normalizer_token_maxlen = 250,
@@ -98,6 +100,7 @@ static bool langs_settings_ext_check(struct event *event, void *_set,
 #endif
        }
 
+       const char *lang_default = NULL;
        const char *filter_name;
        unsigned int nondata_languages = 0;
        p_array_init(&set->parsed_languages, pool, array_count(&set->languages));
@@ -115,13 +118,35 @@ static bool langs_settings_ext_check(struct event *event, void *_set,
                }
 
                bool is_data = strcmp(lang_set->name, LANGUAGE_DATA) == 0;
+
+               if (lang_set->is_default) {
+                       if (is_data) {
+                               *error_r = "language "LANGUAGE_DATA" cannot have { default = yes }";
+                               settings_free(lang_set);
+                               return FALSE;
+                       }
+
+                       if (lang_default != NULL) {
+                               *error_r = t_strdup_printf(
+                                       "Only one language with with { default = yes } is allowed"
+                                       " (default is '%s', cannot set '%s' too)",
+                                       lang_default, lang_set->name);
+                               settings_free(lang_set);
+                               return FALSE;
+                       }
+                       lang_default = t_strdup(lang_set->name);
+               }
+
                if (!is_data)
                        nondata_languages++;
 
                struct lang_settings *lang_set_dup =
                        p_memdup(pool, lang_set, sizeof(*lang_set));
                pool_add_external_ref(pool, lang_set->pool);
-               array_push_back(&set->parsed_languages, &lang_set_dup);
+               if (lang_set->is_default)
+                       array_push_front(&set->parsed_languages, &lang_set_dup);
+               else
+                       array_push_back(&set->parsed_languages, &lang_set_dup);
                settings_free(lang_set);
        }
 
@@ -130,6 +155,11 @@ static bool langs_settings_ext_check(struct event *event, void *_set,
                return FALSE;
        }
 
+       if (lang_default == NULL) {
+               *error_r = "No language with { default = yes } found";
+               return FALSE;
+       }
+
        return TRUE;
 }
 
index 968631c6f39c1c8ac0704a6c3ef33ef5859ee21f..c806e04688e81e157531a4121cdb475366dc7f21 100644 (file)
@@ -22,6 +22,7 @@ struct lang_settings {
        unsigned int tokenizer_generic_token_maxlen;
        bool tokenizer_generic_explicit_prefix;
        bool tokenizer_generic_wb5a;
+       bool is_default;
 };
 
 struct langs_settings {