This patch makes use of pgettext() function which is provided in gettext.h The function has two arguments -- the first argument is a context (arbitrary string), the second one is a message itself. This allows translators to have different translations for several equal messages depending on their context.
For example, in E the message "System" is used multiple times. But sometimes it is just "System" and should be translated as a noun, and sometimes it's something like "System Themes" and should be translated as an adjective. With the help of pgettext() it's possible to split off the second usecase to its own part. Following example demonstrates the outcome for italian: msgid "System" msgstr "Sistema" msgctxt "System [noun]" msgid "System" msgstr "Sistemici" Here the context is "System [noun]" which means that the message will be used as a part of a sentence like "System Themes" or "System Wallpappers". Some more examples are provided below in the patch. Some possible issues with this patch are: * I'm not sure if gettext.h could be placed in the code. It looks like it is under GPL license. Are there any other alternatives to gettext.h where i can still the pgettext() definition from? * Some sane rules should be worked out on which messages could be split off into their own context to prevent making the pot excessively muddled. The patch is tested and it works just as expected. --- po/Makevars | 2 +- po/it.po | 66 ++--- po/ru.po | 60 +++-- src/bin/e_intl.h | 3 + src/bin/gettext.h | 280 +++++++++++++++++++++ .../conf_display/e_int_config_desklock_fsel.c | 2 +- src/modules/conf_intl/e_int_config_imc.c | 2 +- src/modules/conf_theme/e_int_config_fonts.c | 2 +- src/modules/conf_theme/e_int_config_startup.c | 2 +- src/modules/conf_theme/e_int_config_theme.c | 6 +- src/modules/conf_theme/e_int_config_wallpaper.c | 4 +- src/modules/dropshadow/e_mod_config.c | 6 +- src/modules/gadman/e_mod_config.c | 2 +- src/modules/shot/e_mod_main.c | 8 +- 14 files changed, 374 insertions(+), 71 deletions(-) create mode 100644 src/bin/gettext.h diff --git a/po/Makevars b/po/Makevars index 090dd05..7c92776 100644 --- a/po/Makevars +++ b/po/Makevars @@ -9,7 +9,7 @@ top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=d_:1 --keyword=P_:1,2 \ - --keyword=dP_:1,2 --keyword=N_ --keyword=NP_:1,2 \ + --keyword=dP_:1,2 --keyword=N_ --keyword=NP_:1,2 --keyword=C_:1c,2 \ --keyword=EVRY_PLUGIN_BASE:1 --keyword=EVRY_ACTION_NEW:1 \ --keyword=ACTION_NEW:1 \ --from-code=UTF-8 --foreign-user diff --git a/po/it.po b/po/it.po index ad4a618..8d80471 100644 --- a/po/it.po +++ b/po/it.po @@ -721,17 +721,8 @@ msgstr "Commuta il modulo specificato" #: src/bin/e_actions.c:3417 src/bin/e_actions.c:3421 src/bin/e_configure.c:411 #: src/bin/e_int_config_modules.c:52 #: src/modules/conf_applications/e_int_config_apps.c:275 -#: src/modules/conf_display/e_int_config_desklock_fsel.c:87 -#: src/modules/conf_intl/e_int_config_imc.c:818 -#: src/modules/conf_theme/e_int_config_wallpaper.c:429 -#: src/modules/conf_theme/e_int_config_wallpaper.c:546 -#: src/modules/conf_theme/e_int_config_startup.c:258 -#: src/modules/conf_theme/e_int_config_theme.c:455 -#: src/modules/conf_theme/e_int_config_theme.c:830 -#: src/modules/conf_theme/e_int_config_theme.c:844 -#: src/modules/gadman/e_mod_config.c:252 src/modules/syscon/e_mod_main.c:31 -#: src/modules/syscon/e_mod_main.c:35 src/modules/syscon/e_mod_main.c:60 -#: src/modules/syscon/e_mod_main.c:129 +#: src/modules/syscon/e_mod_main.c:31 src/modules/syscon/e_mod_main.c:35 +#: src/modules/syscon/e_mod_main.c:60 src/modules/syscon/e_mod_main.c:129 msgid "System" msgstr "Sistema" @@ -2824,7 +2815,6 @@ msgid "Shrink to Content Width" msgstr "Riduci alla larghezza del contenuto" #: src/bin/e_int_shelf_config.c:213 src/modules/comp/e_mod_config.c:912 -#: src/modules/conf_theme/e_int_config_fonts.c:650 msgid "Style" msgstr "Stile" @@ -5469,6 +5459,19 @@ msgstr "Seleziona uno sfondo..." msgid "Personal" msgstr "Personali" +#: src/modules/conf_display/e_int_config_desklock_fsel.c:87 +#: src/modules/conf_intl/e_int_config_imc.c:818 +#: src/modules/conf_theme/e_int_config_wallpaper.c:429 +#: src/modules/conf_theme/e_int_config_wallpaper.c:546 +#: src/modules/conf_theme/e_int_config_startup.c:258 +#: src/modules/conf_theme/e_int_config_theme.c:455 +#: src/modules/conf_theme/e_int_config_theme.c:830 +#: src/modules/conf_theme/e_int_config_theme.c:844 +#: src/modules/gadman/e_mod_config.c:252 +msgctxt "System [noun]" +msgid "System" +msgstr "Sistemici" + #: src/modules/conf_display/e_int_config_desklock.c:80 msgid "Screen Lock Settings" msgstr "Impostazioni bloccaschermo" @@ -6567,15 +6570,14 @@ msgid "e.g. Saving to disk" msgstr "es: salvataggio su disco" #: src/modules/conf_performance/e_int_config_powermanagement.c:235 -#: src/modules/shot/e_mod_main.c:692 #: src/modules/notification/e_mod_config.c:96 msgid "Low" -msgstr "Bassa" +msgstr "Basso" #: src/modules/conf_performance/e_int_config_powermanagement.c:274 -#: src/modules/dropshadow/e_mod_config.c:124 src/modules/shot/e_mod_main.c:690 +#: src/modules/dropshadow/e_mod_config.c:124 msgid "Medium" -msgstr "Media" +msgstr "Medio" #: src/modules/conf_performance/e_int_config_powermanagement.c:282 #: src/modules/conf_performance/e_int_config_powermanagement.c:321 @@ -6585,13 +6587,12 @@ msgid "%.0f s" msgstr "%.0f s" #: src/modules/conf_performance/e_int_config_powermanagement.c:313 -#: src/modules/shot/e_mod_main.c:688 msgid "High" -msgstr "Alta" +msgstr "Alto" #: src/modules/conf_performance/e_int_config_powermanagement.c:352 msgid "Extreme" -msgstr "Estrema" +msgstr "Estremo" #: src/modules/conf_performance/e_mod_main.c:18 msgid "Performance" @@ -7098,6 +7099,11 @@ msgstr "Abilita classe font" msgid "Font" msgstr "Font" +#: src/modules/conf_theme/e_int_config_fonts.c:650 +msgctxt "Font []" +msgid "Style" +msgstr "Carattere" + #: src/modules/conf_theme/e_int_config_fonts.c:677 msgid "Hinting" msgstr "Hinting (ottimizzazione)" @@ -7944,17 +7950,20 @@ msgstr "Impostazioni di Dropshadow" msgid "Quality" msgstr "Qualità" -#: src/modules/dropshadow/e_mod_config.c:109 -msgid "High Quality" -msgstr "Alta qualità" +#: src/modules/dropshadow/e_mod_config.c:109 src/modules/shot/e_mod_main.c:688 +msgctxt "[] Quality" +msgid "High" +msgstr "Alta" -#: src/modules/dropshadow/e_mod_config.c:111 -msgid "Medium Quality" -msgstr "Media qualità" +#: src/modules/dropshadow/e_mod_config.c:111 src/modules/shot/e_mod_main.c:690 +msgctxt "[] Quality" +msgid "Medium" +msgstr "Media" -#: src/modules/dropshadow/e_mod_config.c:113 -msgid "Low Quality" -msgstr "Bassa qualità" +#: src/modules/dropshadow/e_mod_config.c:113 src/modules/shot/e_mod_main.c:692 +msgctxt "[] Quality" +msgid "Low" +msgstr "Bassa" #: src/modules/dropshadow/e_mod_config.c:117 msgid "Blur Type" @@ -9727,6 +9736,7 @@ msgid "Where to put Screenshot..." msgstr "Dove salvare l'immagine" #: src/modules/shot/e_mod_main.c:686 +msgctxt "[] Quality" msgid "Perfect" msgstr "Perfetta" diff --git a/po/ru.po b/po/ru.po index 536aadb..0f40923 100644 --- a/po/ru.po +++ b/po/ru.po @@ -725,17 +725,8 @@ msgstr "Переключить указанный модуль" #: src/bin/e_actions.c:3417 src/bin/e_actions.c:3421 src/bin/e_configure.c:411 #: src/bin/e_int_config_modules.c:52 #: src/modules/conf_applications/e_int_config_apps.c:275 -#: src/modules/conf_display/e_int_config_desklock_fsel.c:87 -#: src/modules/conf_intl/e_int_config_imc.c:818 -#: src/modules/conf_theme/e_int_config_wallpaper.c:429 -#: src/modules/conf_theme/e_int_config_wallpaper.c:546 -#: src/modules/conf_theme/e_int_config_startup.c:258 -#: src/modules/conf_theme/e_int_config_theme.c:455 -#: src/modules/conf_theme/e_int_config_theme.c:830 -#: src/modules/conf_theme/e_int_config_theme.c:844 -#: src/modules/gadman/e_mod_config.c:252 src/modules/syscon/e_mod_main.c:31 -#: src/modules/syscon/e_mod_main.c:35 src/modules/syscon/e_mod_main.c:60 -#: src/modules/syscon/e_mod_main.c:129 +#: src/modules/syscon/e_mod_main.c:31 src/modules/syscon/e_mod_main.c:35 +#: src/modules/syscon/e_mod_main.c:60 src/modules/syscon/e_mod_main.c:129 msgid "System" msgstr "Система" @@ -2820,7 +2811,6 @@ msgid "Shrink to Content Width" msgstr "Ужимать под размер содержимого" #: src/bin/e_int_shelf_config.c:213 src/modules/comp/e_mod_config.c:912 -#: src/modules/conf_theme/e_int_config_fonts.c:650 msgid "Style" msgstr "Стиль" @@ -5396,6 +5386,19 @@ msgstr "Выбрать фон..." msgid "Personal" msgstr "Личные" +#: src/modules/conf_display/e_int_config_desklock_fsel.c:87 +#: src/modules/conf_intl/e_int_config_imc.c:818 +#: src/modules/conf_theme/e_int_config_wallpaper.c:429 +#: src/modules/conf_theme/e_int_config_wallpaper.c:546 +#: src/modules/conf_theme/e_int_config_startup.c:258 +#: src/modules/conf_theme/e_int_config_theme.c:455 +#: src/modules/conf_theme/e_int_config_theme.c:830 +#: src/modules/conf_theme/e_int_config_theme.c:844 +#: src/modules/gadman/e_mod_config.c:252 +msgctxt "System [noun]" +msgid "System" +msgstr "Системные" + #: src/modules/conf_display/e_int_config_desklock.c:80 msgid "Screen Lock Settings" msgstr "Настройки блокировки экрана" @@ -6492,13 +6495,12 @@ msgid "e.g. Saving to disk" msgstr "(например, сохранение на диск)" #: src/modules/conf_performance/e_int_config_powermanagement.c:235 -#: src/modules/shot/e_mod_main.c:692 #: src/modules/notification/e_mod_config.c:96 msgid "Low" msgstr "Низкий" #: src/modules/conf_performance/e_int_config_powermanagement.c:274 -#: src/modules/dropshadow/e_mod_config.c:124 src/modules/shot/e_mod_main.c:690 +#: src/modules/dropshadow/e_mod_config.c:124 msgid "Medium" msgstr "Средний" @@ -6510,7 +6512,6 @@ msgid "%.0f s" msgstr "%.0f с" #: src/modules/conf_performance/e_int_config_powermanagement.c:313 -#: src/modules/shot/e_mod_main.c:688 msgid "High" msgstr "Высокий" @@ -7024,6 +7025,11 @@ msgstr "Включить класс шрифтов" msgid "Font" msgstr "Шрифт" +#: src/modules/conf_theme/e_int_config_fonts.c:650 +msgctxt "Font []" +msgid "Style" +msgstr "Начертание" + #: src/modules/conf_theme/e_int_config_fonts.c:677 msgid "Hinting" msgstr "Хинтинг" @@ -7868,17 +7874,20 @@ msgstr "Параметры отброса тени" msgid "Quality" msgstr "Качество" -#: src/modules/dropshadow/e_mod_config.c:109 -msgid "High Quality" -msgstr "Высокое качество" +#: src/modules/dropshadow/e_mod_config.c:109 src/modules/shot/e_mod_main.c:688 +msgctxt "[] Quality" +msgid "High" +msgstr "Высокое" -#: src/modules/dropshadow/e_mod_config.c:111 -msgid "Medium Quality" -msgstr "Среднее качество" +#: src/modules/dropshadow/e_mod_config.c:111 src/modules/shot/e_mod_main.c:690 +msgctxt "[] Quality" +msgid "Medium" +msgstr "Среднее" -#: src/modules/dropshadow/e_mod_config.c:113 -msgid "Low Quality" -msgstr "Низкое качество" +#: src/modules/dropshadow/e_mod_config.c:113 src/modules/shot/e_mod_main.c:692 +msgctxt "[] Quality" +msgid "Low" +msgstr "Низкое" #: src/modules/dropshadow/e_mod_config.c:117 msgid "Blur Type" @@ -9641,8 +9650,9 @@ msgid "Where to put Screenshot..." msgstr "Где разместить снимок..." #: src/modules/shot/e_mod_main.c:686 +msgctxt "[] Quality" msgid "Perfect" -msgstr "Идеальный" +msgstr "Идеальное" #: src/modules/shot/e_mod_main.c:763 msgid "Share" diff --git a/src/bin/e_intl.h b/src/bin/e_intl.h index 7b479dc..4f0f534 100644 --- a/src/bin/e_intl.h +++ b/src/bin/e_intl.h @@ -3,15 +3,18 @@ #ifdef E_TYPEDEFS #ifdef HAVE_GETTEXT +#include "gettext.h" #define _(str) gettext(str) #define d_(str, dom) dgettext(PACKAGE dom, str) #define P_(str, str_p, n) ngettext(str, str_p, n) #define dP_(str, str_p, n, dom) dngettext(PACKAGE dom, str, str_p, n) +#define C_(ctx, str) pgettext(ctx, str) #else #define _(str) (str) #define d_(str, dom) (str) #define P_(str, str_p, n) (str_p) #define dP_(str, str_p, n, dom) (str_p) +#define C_(ctx, str) (str) #endif /* These macros are used to just mark strings for translation, this is useful * for string lists which are not dynamically allocated diff --git a/src/bin/gettext.h b/src/bin/gettext.h new file mode 100644 index 0000000..e76b592 --- /dev/null +++ b/src/bin/gettext.h @@ -0,0 +1,280 @@ +/* Convenience header for conditional use of GNU <libintl.h>. + Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include <libintl.h> + +/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by + the gettext() and ngettext() macros. This is an alternative to calling + textdomain(), and is useful for libraries. */ +# ifdef DEFAULT_TEXT_DOMAIN +# undef gettext +# define gettext(Msgid) \ + dgettext (DEFAULT_TEXT_DOMAIN, Msgid) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) +# endif + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of <locale.h> a NOP. We don't include <libintl.h> + as well because people using "gettext.h" will not include <libintl.h>, + and also including <libintl.h> would fail on SunOS 4, whereas <locale.h> + is OK. */ +#if defined(__sun) +# include <locale.h> +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + <libintl.h>, which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of <libintl.h> a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include <cstdlib> +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include <libintl.h> +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# undef gettext +# define gettext(Msgid) ((const char *) (Msgid)) +# undef dgettext +# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) +# undef dcgettext +# define dcgettext(Domainname, Msgid, Category) \ + ((void) (Category), dgettext (Domainname, Msgid)) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 \ + ? ((void) (Msgid2), (const char *) (Msgid1)) \ + : ((void) (Msgid1), (const char *) (Msgid2))) +# undef dngettext +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) +# undef dcngettext +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) +# undef textdomain +# define textdomain(Domainname) ((const char *) (Domainname)) +# undef bindtextdomain +# define bindtextdomain(Domainname, Dirname) \ + ((void) (Domainname), (const char *) (Dirname)) +# undef bind_textdomain_codeset +# define bind_textdomain_codeset(Domainname, Codeset) \ + ((void) (Domainname), (const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +/* The separator between msgctxt and msgid in a .mo file. */ +#define GETTEXT_CONTEXT_GLUE "\004" + +/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a + MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be + short and rarely need to change. + The letter 'p' stands for 'particular' or 'special'. */ +#ifdef DEFAULT_TEXT_DOMAIN +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#else +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#endif +#define dpgettext(Domainname, Msgctxt, Msgid) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) +#ifdef DEFAULT_TEXT_DOMAIN +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#else +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#endif +#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +pgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + int category) +{ + const char *translation = dcgettext (domain, msg_ctxt_id, category); + if (translation == msg_ctxt_id) + return msgid; + else + return translation; +} + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +npgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + const char *translation = + dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); + if (translation == msg_ctxt_id || translation == msgid_plural) + return (n == 1 ? msgid : msgid_plural); + else + return translation; +} + +/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID + can be arbitrary expressions. But for string literals these macros are + less efficient than those above. */ + +#include <string.h> + +#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ + (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) + +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS +#include <stdlib.h> +#endif + +#define pgettext_expr(Msgctxt, Msgid) \ + dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) +#define dpgettext_expr(Domainname, Msgctxt, Msgid) \ + dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcgettext (domain, msg_ctxt_id, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (translation != msg_ctxt_id) + return translation; + } + return msgid; +} + +#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcnpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (!(translation == msg_ctxt_id || translation == msgid_plural)) + return translation; + } + return (n == 1 ? msgid : msgid_plural); +} + +#endif /* _LIBGETTEXT_H */ diff --git a/src/modules/conf_display/e_int_config_desklock_fsel.c b/src/modules/conf_display/e_int_config_desklock_fsel.c index 5f950ab..2c94bd9 100644 --- a/src/modules/conf_display/e_int_config_desklock_fsel.c +++ b/src/modules/conf_display/e_int_config_desklock_fsel.c @@ -84,7 +84,7 @@ _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data ow = e_widget_radio_add(evas, _("Personal"), 0, rg); evas_object_smart_callback_add(ow, "changed", _cb_radio_changed, cfdata); e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0); - ow = e_widget_radio_add(evas, _("System"), 1, rg); + ow = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); evas_object_smart_callback_add(ow, "changed", _cb_radio_changed, cfdata); e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0); e_widget_table_object_append(ot, rt, 0, 0, 1, 1, 0, 0, 0, 0); diff --git a/src/modules/conf_intl/e_int_config_imc.c b/src/modules/conf_intl/e_int_config_imc.c index def3e45..04cceba 100644 --- a/src/modules/conf_intl/e_int_config_imc.c +++ b/src/modules/conf_intl/e_int_config_imc.c @@ -815,7 +815,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_ e_widget_on_change_hook_set(ow, _cb_dir, cfdata); e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0); - ow = e_widget_radio_add(evas, _("System"), 1, rg); + ow = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); cfdata->o_system = ow; e_widget_on_change_hook_set(ow, _cb_dir, cfdata); e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0); diff --git a/src/modules/conf_theme/e_int_config_fonts.c b/src/modules/conf_theme/e_int_config_fonts.c index 694bd17..91c884c 100644 --- a/src/modules/conf_theme/e_int_config_fonts.c +++ b/src/modules/conf_theme/e_int_config_fonts.c @@ -647,7 +647,7 @@ _advanced_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_ e_widget_framelist_object_append(of, ob); e_widget_table_object_append(ot, of, 1, 0, 1, 2, 1, 1, 1, 1); - of = e_widget_framelist_add(evas, _("Style"), 1); + of = e_widget_framelist_add(evas, C_("Font []", "Style"), 1); ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_style)); cfdata->gui.style_list = ob; e_widget_on_change_hook_set(ob, _adv_style_cb_change, cfdata); diff --git a/src/modules/conf_theme/e_int_config_startup.c b/src/modules/conf_theme/e_int_config_startup.c index c9adbfe..0c03c63 100644 --- a/src/modules/conf_theme/e_int_config_startup.c +++ b/src/modules/conf_theme/e_int_config_startup.c @@ -255,7 +255,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf evas_object_smart_callback_add(o, "changed", _cb_dir, cfdata); e_widget_table_object_append(il, o, 0, 0, 1, 1, 1, 1, 0, 0); - o = e_widget_radio_add(evas, _("System"), 1, rg); + o = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); cfdata->o_system = o; evas_object_smart_callback_add(o, "changed", _cb_dir, cfdata); diff --git a/src/modules/conf_theme/e_int_config_theme.c b/src/modules/conf_theme/e_int_config_theme.c index 09f1ae0..9a42ea2 100644 --- a/src/modules/conf_theme/e_int_config_theme.c +++ b/src/modules/conf_theme/e_int_config_theme.c @@ -452,7 +452,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf cfdata->o_personal = o; evas_object_smart_callback_add(o, "changed", _cb_dir, cfdata); e_widget_table_object_append(il, o, 0, 0, 1, 1, 1, 1, 0, 0); - o = e_widget_radio_add(evas, _("System"), 1, rg); + o = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); cfdata->o_system = o; evas_object_smart_callback_add(o, "changed", _cb_dir, cfdata); e_widget_table_object_append(il, o, 1, 0, 1, 1, 1, 1, 0, 0); @@ -827,7 +827,7 @@ _ilist_files_done_cb(void *data, Eio_File *handler) e_widget_ilist_header_prepend(cfdata->o_files_ilist, NULL, _("Personal")); EINA_LIST_FOREACH(cfdata->personal_file_list, l, file) _ilist_item_new(cfdata, file, EINA_TRUE); - e_widget_ilist_header_append(cfdata->o_files_ilist, NULL, _("System")); + e_widget_ilist_header_append(cfdata->o_files_ilist, NULL, C_("System [noun]", "System")); } else { @@ -841,7 +841,7 @@ _ilist_files_done_cb(void *data, Eio_File *handler) cfdata->system_file_list = eina_list_sort(cfdata->system_file_list, 0, (Eina_Compare_Cb)_ilist_cmp_cb); cfdata->eio[1] = NULL; if (cfdata->eio[0]) - e_widget_ilist_header_append(cfdata->o_files_ilist, NULL, _("System")); + e_widget_ilist_header_append(cfdata->o_files_ilist, NULL, C_("System [noun]", "System")); EINA_LIST_FOREACH(cfdata->system_file_list, l, file) _ilist_item_new(cfdata, file, EINA_TRUE); } diff --git a/src/modules/conf_theme/e_int_config_wallpaper.c b/src/modules/conf_theme/e_int_config_wallpaper.c index 05c87cf..8676e6a 100644 --- a/src/modules/conf_theme/e_int_config_wallpaper.c +++ b/src/modules/conf_theme/e_int_config_wallpaper.c @@ -426,7 +426,7 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) cfdata->o_personal = ow; evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata); e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0); - ow = e_widget_radio_add(evas, _("System"), 1, rg); + ow = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); cfdata->o_system = ow; evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata); e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0); @@ -543,7 +543,7 @@ _adv_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) cfdata->o_personal = ow; evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata); e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0); - ow = e_widget_radio_add(evas, _("System"), 1, rg); + ow = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); cfdata->o_system = ow; evas_object_smart_callback_add(ow, "changed", _cb_dir, cfdata); e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0); diff --git a/src/modules/dropshadow/e_mod_config.c b/src/modules/dropshadow/e_mod_config.c index 2d3fd1a..9cbb2d1 100644 --- a/src/modules/dropshadow/e_mod_config.c +++ b/src/modules/dropshadow/e_mod_config.c @@ -106,11 +106,11 @@ _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dial of = e_widget_framelist_add(evas, _("Quality"), 0); e_widget_framelist_content_align_set(of, 0.5, 0.0); rg = e_widget_radio_group_new(&(cfdata->quality)); - ob = e_widget_radio_add(evas, _("High Quality"), 1, rg); + ob = e_widget_radio_add(evas, C_("[] Quality", "High"), 1, rg); e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Medium Quality"), 2, rg); + ob = e_widget_radio_add(evas, C_("[] Quality", "Medium"), 2, rg); e_widget_framelist_object_append(of, ob); - ob = e_widget_radio_add(evas, _("Low Quality"), 4, rg); + ob = e_widget_radio_add(evas, C_("[] Quality", "Low"), 4, rg); e_widget_framelist_object_append(of, ob); e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1); diff --git a/src/modules/gadman/e_mod_config.c b/src/modules/gadman/e_mod_config.c index 9a7f699..d58caa8 100644 --- a/src/modules/gadman/e_mod_config.c +++ b/src/modules/gadman/e_mod_config.c @@ -249,7 +249,7 @@ _basic_create_widgets(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dia e_widget_on_change_hook_set(ow, _cb_fm_radio_change, cfdata); e_widget_frametable_object_append(of, ow, 0, 0, 1, 1, 1, 1, 0, 0); - ow = e_widget_radio_add(evas, _("System"), 1, rg); + ow = e_widget_radio_add(evas, C_("System [noun]", "System"), 1, rg); e_widget_on_change_hook_set(ow, _cb_fm_radio_change, cfdata); e_widget_frametable_object_append(of, ow, 1, 0, 1, 1, 1, 1, 0, 0); diff --git a/src/modules/shot/e_mod_main.c b/src/modules/shot/e_mod_main.c index d83cba1..4a2a09c 100644 --- a/src/modules/shot/e_mod_main.c +++ b/src/modules/shot/e_mod_main.c @@ -683,13 +683,13 @@ _shot_now(E_Zone *zone, E_Border *bd) ol = o; rg = e_widget_radio_group_new(&quality); - o = e_widget_radio_add(evas, _("Perfect"), 100, rg); + o = e_widget_radio_add(evas, C_("[] Quality", "Perfect"), 100, rg); e_widget_framelist_object_append(ol, o); - o = e_widget_radio_add(evas, _("High"), 90, rg); + o = e_widget_radio_add(evas, C_("[] Quality", "High"), 90, rg); e_widget_framelist_object_append(ol, o); - o = e_widget_radio_add(evas, _("Medium"), 70, rg); + o = e_widget_radio_add(evas, C_("[] Quality", "Medium"), 70, rg); e_widget_framelist_object_append(ol, o); - o = e_widget_radio_add(evas, _("Low"), 50, rg); + o = e_widget_radio_add(evas, C_("[] Quality", "Low"), 50, rg); e_widget_framelist_object_append(ol, o); e_widget_list_object_append(o_hlist, ol, 1, 0, 0.5); -- 1.7.12.1 ------------------------------------------------------------------------------ LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial Remotely access PCs and mobile devices and provide instant support Improve your efficiency, and focus on delivering more value-add services Discover what IT Professionals Know. Rescue delivers http://p.sf.net/sfu/logmein_12329d2d _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel