]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-language: Replace fts_languages with the names from language filter array
authorMarco Bettini <marco.bettini@open-xchange.com>
Thu, 25 Jan 2024 09:42:21 +0000 (09:42 +0000)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 12 Feb 2025 10:34:12 +0000 (12:34 +0200)
src/lib-language/language.c
src/lib-language/language.h
src/lib-language/test-language.c
src/lib-storage/lang-user.c

index 4b2755d96077b2fea0e5ef137b55a2a79d02861e..c19c4f0616ce493d038b54d083ce6a4e6061de13 100644 (file)
@@ -58,7 +58,7 @@ const struct language languages_builtin [] = {
 };
 
 const struct language language_data = {
-       "data"
+       LANGUAGE_DATA
 };
 
 #ifdef HAVE_LANG_EXTTEXTCAT
@@ -172,17 +172,20 @@ void language_list_add(struct language_list *list,
 }
 
 bool language_list_add_names(struct language_list *list,
-                            const char *names,
+                            const ARRAY_TYPE(lang_settings) *languages,
                             const char **unknown_name_r)
 {
-       const char *const *langs;
-       const struct language *lang;
-
-       for (langs = t_strsplit_spaces(names, ", "); *langs != NULL; langs++) {
-               lang = language_find(*langs);
+       struct lang_settings *entry;
+       array_foreach_elem(languages, entry) {
+               /* Data pseudo-language does not belong to the constructed list,
+                  skip it. */
+               if (strcmp(entry->name, LANGUAGE_DATA) == 0)
+                       continue;
+
+               const struct language *lang = language_find(entry->name);
                if (lang == NULL) {
                        /* unknown language */
-                       *unknown_name_r = *langs;
+                       *unknown_name_r = entry->name;
                        return FALSE;
                }
                if (language_list_find(list, lang->name) == NULL)
index 1efcc1266aecca149dc826cb3e6c2313e1ea93bc..4394288bbda84a6aa5fc59d95d798d593320642c 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef LANGUAGE_H
 #define LANGUAGE_H
 
+#include "lang-settings.h"
+
 struct language_list;
 
 enum language_detect_result {
@@ -53,7 +55,7 @@ void language_list_add(struct language_list *list,
    Duplicates are ignored. Returns TRUE if ok, FALSE and unknown_name if an
    unknown language was found from the list. */
 bool language_list_add_names(struct language_list *list,
-                            const char *names,
+                            const ARRAY_TYPE(lang_settings) *names,
                             const char **unknown_name_r);
 
 /* Return an array of all wanted languages. */
index c343cc11dc9948d307063ba7472e3af5a73d3ece..576c4c26b559cf0f16c79e1b08fae3d7438b5a3e 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2014-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "array.h"
 #include "test-common.h"
 #include "language.h"
 /* TODO: These checks will not work without proper libtextcat configuration.
@@ -11,6 +12,19 @@ const struct language_settings settings = {
        .textcat_data_path = TEXTCAT_DATADIR"/",
 };
 
+static ARRAY_TYPE(lang_settings) *to_array(const char *values)
+{
+       ARRAY_TYPE(lang_settings) *array = t_new(ARRAY_TYPE(lang_settings), 1);
+       t_array_init(array, 8);
+       const char **value = t_strsplit_spaces(values, ", ");
+       for (; *value != NULL; value++) {
+               struct lang_settings *set = t_new(struct lang_settings, 1);
+               set->name = *value;
+               array_push_back(array, &set);
+       }
+       return array;
+}
+
 /* Detect Finnish. fi--utf8 */
 static void test_language_detect_finnish(void)
 {
@@ -28,7 +42,7 @@ static void test_language_detect_finnish(void)
        const char *unknown, *error;
        test_begin("language detect Finnish");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "fi") == 0);
@@ -55,7 +69,7 @@ static void test_language_detect_english(void)
        const char *unknown, *error;
        test_begin("language detect English");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, english, sizeof(english)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "en") == 0);
@@ -90,7 +104,7 @@ static void test_language_detect_french(void)
        const char *unknown, *error;
        test_begin("language detect French");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, french, sizeof(french)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "fr") == 0);
@@ -127,7 +141,7 @@ static void test_language_detect_german(void)
        const char *unknown, *error;
        test_begin("language detect German");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, german, sizeof(german)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "de") == 0);
@@ -153,7 +167,7 @@ static void test_language_detect_swedish(void)
        const char *unknown, *error;
        test_begin("language detect Swedish");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, swedish, sizeof(swedish)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "sv") == 0);
@@ -177,7 +191,7 @@ static void test_language_detect_bokmal(void)
        const char *unknown, *error;
        test_begin("language detect Bokmal as Norwegian");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, bokmal, sizeof(bokmal)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "no") == 0);
@@ -201,7 +215,7 @@ static void test_language_detect_nynorsk(void)
        const char *unknown, *error;
        test_begin("language detect Nynorsk as Norwegian");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, nynorsk, sizeof(nynorsk)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "no") == 0);
@@ -226,7 +240,7 @@ static void test_language_detect_finnish_as_english(void)
        const char *unknown, *error;
        test_begin("language detect Finnish as English");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, finnish, sizeof(finnish)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_OK);
        test_assert(strcmp(lang_r->name, "en") == 0);
@@ -253,7 +267,7 @@ static void test_language_detect_na(void)
        const char *unknown, *error;
        test_begin("language detect not available");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, english, sizeof(english)-1, &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_UNKNOWN);
        language_list_deinit(&lp);
@@ -273,7 +287,7 @@ static void test_language_detect_unknown(void)
        const char *unknown, *error;
        test_begin("language detect unknown");
        lp = language_list_init(&settings);
-       test_assert(language_list_add_names(lp, names, &unknown) == TRUE);
+       test_assert(language_list_add_names(lp, to_array(names), &unknown) == TRUE);
        test_assert(language_detect(lp, klingon, sizeof(klingon), &lang_r, &error)
                    == LANGUAGE_DETECT_RESULT_UNKNOWN);
        language_list_deinit(&lp);
index b9fa42f7c5d6814a1de657958e698f2b3f5502f5..670cb17143e886a1ba8793709f61e6c6913ee6f7 100644 (file)
@@ -58,28 +58,22 @@ static const char *const *str_keyvalues_to_array(const char *str)
 static int
 lang_user_init_languages(struct lang_user *luser, const char **error_r)
 {
-       const char *languages, *unknown;
-
-       languages = mail_user_plugin_getenv(user, "fts_languages");
-       if (languages == NULL) {
-               *error_r = "fts_languages setting is missing";
-               return -1;
-       }
+       const ARRAY_TYPE(lang_settings) *langs = &luser->set->parsed_languages;
+       i_assert(!array_is_empty(langs));
 
        struct language_settings lang_settings = {
                .textcat_config_path = luser->set->textcat_config_path,
        };
        luser->lang_list = language_list_init(&lang_settings);
 
-       if (!language_list_add_names(luser->lang_list, languages, &unknown)) {
+       const char *unknown_lang;
+       if (!language_list_add_names(luser->lang_list, langs, &unknown_lang)) {
                *error_r = t_strdup_printf(
-                       "fts_languages: Unknown language '%s'", unknown);
-               return -1;
-       }
-       if (array_count(language_list_get_all(luser->lang_list)) == 0) {
-               *error_r = "fts_languages setting is empty";
+                       "language %s: Unknown language", unknown_lang);
                return -1;
        }
+
+       i_assert(!array_is_empty(language_list_get_all(luser->lang_list)));
        return 0;
 }