Translatable strings in .h file -- best way to resolve?

Jeff Kletsky gnucash at allycomm.com
Thu Mar 18 10:38:41 EDT 2010


Mike Alexander wrote:
> --On March 16, 2010 10:17:37 AM +0100 Christian Stimming 
> <stimming at tuhh.de> wrote:
>
>> Zitat von Jeff Kletsky <gnucash at allycomm.com>:
>>> #define ACCOUNT_OPTIONS_SECTION "Accounts"
>>> #define TRADING_ACCOUNTS_OPTION "Trading Accounts"
>>>
>>> Presently, make-gnucash-potfiles.in does not look at .h files for
>>> translatable strings, so even after adding
>>> #include <glib/gi18n.h>
>>> and marking the strings, they don't make it into POTFILES.in
>>>
>>> What approach is recommended for resolving this?
>>>
>>> * Add an exception to make-gnucash-potfiles.in
>>
>> Yes.
>>
>>> * Use _(ACCOUNTS_OPTIONS_SECTION) and don't translate the raw define
>>
>> Yes. In the #define lines, the strings should be marked with the N_(
>> ... ) macro, so they are still just a const char* literal for the
>> compiler's point of view, but they make it into gnucash.pot:
>>
>> #include <glib/gi18n.h>
>> #define ACCOUNT_OPTIONS_SECTION N_("Accounts")
>>
>> Subsequently, in places where the defines are being used for
>> human-visible display, they need to be translated writing
>> _(ACCOUNTS_OPTIONS_SECTION).
>>
>>> * Change .h to .c and leave people wondering why a .c file is being
>>> #include-d
>>
>> No.
>>
>
> This is my fault.  These #defines are used in two places.  One is 
> qofbook.c where they are used to access the slot holding the value of 
> this option.  These should, of course, not be translated.  The other 
> is in business-prefs.scm where they are used as the section and name 
> parameters to gnc:make-simple-boolean-option.  The other calls to 
> gnc:make-...-option in this file use (N_ ...) for the name and section 
> parameters.  These parameters are used for both slot access and for 
> the UI.  There must be some special magic to cause them to be 
> translated for the one case and not the other.
>
> I think the correct fix is to leave the #defines alone (the C code 
> only uses these for slot access) and change the two lines in 
> business-utils.scm to read
>
> (define gnc:*book-label* (N_ ACCOUNT-OPTIONS-SECTION))
> (define gnc:*trading-accounts* (N_ TRADING-ACCOUNTS-OPTION))
>
> Unfortunately I've been out of town for the last month and I need to 
> do a bunch of updating and building before I can test this fix.  
> However it makes things consistent with the other constants defined in 
> business-utils.scm and used in business-prefs.scm so it may be ok.
>
> It would probably also be ok to include the N_(...) on the #defines 
> but doing it like I describe would be more consistent with the other 
> strings used in business-prefs.scm.
>
> I think things do mostly work the way they are, except that the 
> strings probably aren't marked for translation as they should be.  
> When I added this code I tested it by adding a fake translation for 
> "Trading Accounts" and it showed up in the UI.
>
> This is all very confusing to me.  All of the calls to 
> gnc:make-...-option use (N_ ...) for the section, name, and 
> description parameters, but somehow they get translated anyway.  I 
> think I tracked this down once, but I've forgotten how it works now.
>
>      Mike
>  

I've got it running here (though have yet to confirm translation works) 
-- the last little trick was to get Swig to recognize the #define 
N_("some string to be translated") construct so that the variable would 
be created in the Guile side of the house. (I also changed to 
KVP_OPTIONS_PATH to be more consistent with usage elsewhere in the code, 
as well as a naming convention for the section/option that was a little 
more understandable to me when extended.)



#ifndef SWIG             /* swig doesn't see N_() as a string constant */
#include <glib/gi18n.h>
#else
#define N_(string) string
#endif

[...]

#define KVP_OPTION_PATH  "options"

/*
 * Various option sections and options within those sections
 *
 * At least through 2.3.10, the key and the display string are tied,
 * coupling the data with its representation in the UI
 * and is not locale-independent (translated strings used as keys)
 */

#define OPTION_SECTION_ACCOUNTS        N_("Accounts")
#define OPTION_NAME_TRADING_ACCOUNTS   N_("Trading Accounts")

#define OPTION_SECTION_BUDGETING       N_("Budgeting")
#define OPTION_NAME_DEFAULT_BUDGET     N_("Default Budget")




More information about the gnucash-devel mailing list