From: Daiki Ueno Date: Tue, 3 Jun 2014 02:05:50 +0000 (+0900) Subject: desktop: Read LINGUAS file even if LINGUAS envvar is set X-Git-Tag: v0.19.1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=314ed619fd052e33685382e0b263f995e68ad2d2;p=thirdparty%2Fgettext.git desktop: Read LINGUAS file even if LINGUAS envvar is set * msgfmt.c (get_languages): If the LINGUAS envvar is set, use it to restrict the languages list read from the LINGUAS file, not to extend the list. (add_languages): Take an optional DESIRED_LANGUAGES argument. --- diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog index 874da2298..3d7e12734 100644 --- a/gettext-tools/src/ChangeLog +++ b/gettext-tools/src/ChangeLog @@ -1,3 +1,11 @@ +2014-06-03 Daiki Ueno + + desktop: Read LINGUAS file even if LINGUAS envvar is set + * msgfmt.c (get_languages): If the LINGUAS envvar is set, use it + to restrict the languages list read from the LINGUAS file, not to + extend the list. + (add_languages): Take an optional DESIRED_LANGUAGES argument. + 2014-06-03 Daiki Ueno vala: Don't elide comments while parsing string literal diff --git a/gettext-tools/src/msgfmt.c b/gettext-tools/src/msgfmt.c index 1f7a68d98..99026bfbd 100644 --- a/gettext-tools/src/msgfmt.c +++ b/gettext-tools/src/msgfmt.c @@ -1269,7 +1269,8 @@ read_catalog_file_msgfmt (char *filename, catalog_input_format_ty input_syntax) } static void -add_languages (string_list_ty *languages, const char *line, size_t length) +add_languages (string_list_ty *languages, string_list_ty *desired_languages, + const char *line, size_t length) { char *start; @@ -1287,7 +1288,9 @@ add_languages (string_list_ty *languages, const char *line, size_t length) p++; *p = '\0'; - string_list_append_unique (languages, start); + if (desired_languages == NULL + || string_list_member (desired_languages, start)) + string_list_append_unique (languages, start); start = p + 1; } } @@ -1299,69 +1302,75 @@ get_languages (const char *directory) { char *envval; string_list_ty *languages; + string_list_ty *desired_languages = NULL; + char *linguas_file_name; + struct stat statbuf; + FILE *fp; + size_t line_len = 0; + char *line_buf = NULL; languages = string_list_alloc (); envval = getenv ("LINGUAS"); if (envval) - add_languages (languages, envval, strlen (envval)); - else { - char *linguas_file_name; - struct stat statbuf; - FILE *fp; - size_t line_len = 0; - char *line_buf = NULL; - - linguas_file_name = xconcatenated_filename (directory, "LINGUAS", NULL); - if (stat (linguas_file_name, &statbuf) < 0) - { - error (EXIT_SUCCESS, 0, _("%s does not exist"), - linguas_file_name); - string_list_free (languages); - free (linguas_file_name); - return NULL; - } + desired_languages = string_list_alloc (); + add_languages (desired_languages, NULL, envval, strlen (envval)); + } - fp = fopen (linguas_file_name, "r"); - if (fp == NULL) - { - error (EXIT_SUCCESS, 0, _("%s exists but cannot read"), - linguas_file_name); - string_list_free (languages); - free (linguas_file_name); - return NULL; - } + linguas_file_name = xconcatenated_filename (directory, "LINGUAS", NULL); + if (stat (linguas_file_name, &statbuf) < 0) + { + error (EXIT_SUCCESS, 0, _("%s does not exist"), linguas_file_name); + string_list_free (languages); + if (desired_languages != NULL) + string_list_free (desired_languages); + free (linguas_file_name); + return NULL; + } - while (!feof (fp)) - { - /* Read next line from file. */ - int len = getline (&line_buf, &line_len, fp); + fp = fopen (linguas_file_name, "r"); + if (fp == NULL) + { + error (EXIT_SUCCESS, 0, _("%s exists but cannot read"), + linguas_file_name); + string_list_free (languages); + if (desired_languages != NULL) + string_list_free (desired_languages); + free (linguas_file_name); + return NULL; + } - /* In case of an error leave loop. */ - if (len < 0) - break; + while (!feof (fp)) + { + /* Read next line from file. */ + int len = getline (&line_buf, &line_len, fp); - /* Remove trailing '\n' and trailing whitespace. */ - if (len > 0 && line_buf[len - 1] == '\n') - line_buf[--len] = '\0'; - while (len > 0 - && (line_buf[len - 1] == ' ' - || line_buf[len - 1] == '\t' - || line_buf[len - 1] == '\r')) - line_buf[--len] = '\0'; + /* In case of an error leave loop. */ + if (len < 0) + break; - /* Test if we have to ignore the line. */ - if (*line_buf == '\0' || *line_buf == '#') - continue; + /* Remove trailing '\n' and trailing whitespace. */ + if (len > 0 && line_buf[len - 1] == '\n') + line_buf[--len] = '\0'; + while (len > 0 + && (line_buf[len - 1] == ' ' + || line_buf[len - 1] == '\t' + || line_buf[len - 1] == '\r')) + line_buf[--len] = '\0'; - add_languages (languages, line_buf, len); - } + /* Test if we have to ignore the line. */ + if (*line_buf == '\0' || *line_buf == '#') + continue; - free (line_buf); - fclose (fp); - free (linguas_file_name); + add_languages (languages, desired_languages, line_buf, len); } + free (line_buf); + fclose (fp); + if (desired_languages != NULL) + string_list_free (desired_languages); + free (linguas_file_name); + return languages; } diff --git a/gettext-tools/tests/ChangeLog b/gettext-tools/tests/ChangeLog index 1478269c6..884b8010b 100644 --- a/gettext-tools/tests/ChangeLog +++ b/gettext-tools/tests/ChangeLog @@ -1,3 +1,7 @@ +2014-06-03 Daiki Ueno + + * msgfmt-desktop-2: Test the effect of the LINGUAS envvar. + 2014-06-03 Daiki Ueno tests: Ignore the LINGUAS envvar in msgfmt-desktop-2 diff --git a/gettext-tools/tests/msgfmt-desktop-2 b/gettext-tools/tests/msgfmt-desktop-2 index da976b022..5fbb75a96 100755 --- a/gettext-tools/tests/msgfmt-desktop-2 +++ b/gettext-tools/tests/msgfmt-desktop-2 @@ -111,6 +111,20 @@ Keywords[fr]=one;two;thr\;ee; Keywords=Keyword1;Keyword2;Key\;word3; EOF +cat <<\EOF > mf.desktop.desired.ok +[Desktop Entry] +Type=Application +Name[fr]=French\nfoo +Name=Foo + +Comment[foo]=Already translated comment +Comment[fr]=French \ncomment +Comment=\sThis is a \nmultiline comment; for testing +# This is a comment and must be preserved +Keywords[fr]=one;two;thr\;ee; +Keywords=Keyword1;Keyword2;Key\;word3; +EOF + unset LINGUAS # Sanity checks for contradicting options. @@ -150,6 +164,12 @@ ${MSGFMT} --desktop --template=mf.desktop -d po -o mf.desktop.out || exit 1 : ${DIFF=diff} ${DIFF} mf.desktop.ok mf.desktop.out -result=$? +test $? = 0 || exit 1 + +# Restrict the desired languages with the LINGUAS envvar. -exit $result +LINGUAS="fr ja" ${MSGFMT} --desktop --template=mf.desktop -d po -o mf.desktop.desired.out || exit 1 + +: ${DIFF=diff} +${DIFF} mf.desktop.desired.ok mf.desktop.desired.out +test $? = 0 || exit 1