From 29531873ea4395a2dc65cefcc28db09569c38c18 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Sun, 19 Dec 2021 01:09:13 +0100 Subject: [PATCH] STR 3289: Fluid i18n, gettext, catguts improvements Removed some unneeded code. --- documentation/src/fluid-gettext.png | Bin 4369 -> 32267 bytes documentation/src/fluid.dox | 26 +++- fluid/Fl_Menu_Type.cxx | 186 +++++++++++++++++++--------- fluid/Fl_Type.cxx | 1 + fluid/Fl_Window_Type.cxx | 31 ++++- fluid/Fluid_Image.cxx | 5 + fluid/Fluid_Image.h | 1 + fluid/alignment_panel.cxx | 42 +++++-- fluid/alignment_panel.fl | 36 ++++-- fluid/alignment_panel.h | 2 + fluid/code.cxx | 61 ++++++--- fluid/file.cxx | 19 +-- fluid/fluid.cxx | 41 +++++- fluid/fluid.h | 2 + test/preferences.fl | 11 +- 15 files changed, 342 insertions(+), 122 deletions(-) diff --git a/documentation/src/fluid-gettext.png b/documentation/src/fluid-gettext.png index 83030626b324d1f89ab23bb5c2ca90705483c10e..f961c69290961445b770e78bf4a193d550a56c60 100644 GIT binary patch literal 32267 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 vAth|Hg=;YhW!h7+jM|+E@^_Ctrl+p) provides access to the I18N options. +strings and tooltips used by widgets. The GNU gettext option also +supports deferred translation of statically initialised menu item +labels. The preferences window (Ctrl+p) provides access +to the I18N options. \subsection fluid_i18n_methods I18N Methods @@ -1530,10 +1532,10 @@ need to call \p setlocale() and \p textdomain() or message file. To use GNU gettext for I18N, open the preferences window and -choose "GNU gettext" from the \b Use: chooser. Two new input +choose "GNU gettext" from the \b Use: chooser. Four new input fields will then appear to control the include file and -function/macro name to use when retrieving the localized label -strings. +function/macro names to use when retrieving localized label +strings in dynamic allocation and static initialisation. \image html fluid-gettext.png "Internationalization using GNU gettext" \image latex fluid-gettext.png "Internationalization using GNU gettext" width=10cm @@ -1543,10 +1545,24 @@ field controls the header file to include for I18N; by default this is \b , the standard I18N file for GNU gettext. +If the \b Conditional: field contains a macro name, i18n will only be compiled +into the product if this macro is defined. The build system should define the +macro only if all required headers and libraries are available. If the macro +is not defined, no headers are included and `gettext` passes text through +untranslated. + The \b Function: field controls the function (or macro) that will retrieve the localized message; by default the \p gettext function will be called. +The **Static Function:** field names a macro that will mark static text +fields for extraction with the `xgettext` tool. The default macro name is +\p gettext_noop and will be defined as `#define gettext_noop(text) text` +right after the `#include` statement. Fluid will do its best to call +`gettext` on static texts after the textdomain was set by the user. + +\see [GNU gettext special cases](https://www.gnu.org/software/gettext/manual/html_node/Special-cases.html) + \subsection fluid_catgets_i18n Using POSIX catgets for I18N FLUID's code support for POSIX catgets allows you to use a diff --git a/fluid/Fl_Menu_Type.cxx b/fluid/Fl_Menu_Type.cxx index d7e5fc5ea..e52008723 100644 --- a/fluid/Fl_Menu_Type.cxx +++ b/fluid/Fl_Menu_Type.cxx @@ -39,6 +39,7 @@ #include #include #include +#include #include "../src/flstring.h" #include @@ -53,6 +54,32 @@ Fl_Menu_Item menu_item_type_menu[] = { static char submenuflag; static uchar menuitemtype = 0; +static void delete_dependents(Fl_Menu_Item *m) { + if (!m) + return; + int level = 0; + for (;;m++) { + if (m->label()==NULL) { + if (level==0) { + break; + } else { + level--; + } + } + if (m->flags&FL_SUBMENU) + level++; + if (m->labeltype()==FL_MULTI_LABEL) + delete (Fl_Multi_Label*)m->label(); + } +} + +static void delete_menu(Fl_Menu_Item *m) { + if (!m) + return; + delete_dependents(m); + delete[] m; +} + void Fl_Input_Choice_Type::build_menu() { Fl_Input_Choice* w = (Fl_Input_Choice*)o; // count how many Fl_Menu_Item structures needed: @@ -63,23 +90,35 @@ void Fl_Input_Choice_Type::build_menu() { n++; } if (!n) { - if (menusize) delete[] (Fl_Menu_Item*)(w->menu()); + if (menusize) delete_menu((Fl_Menu_Item*)(w->menu())); w->menu(0); menusize = 0; } else { n++; // space for null at end of menu if (menusizemenu()); + if (menusize) delete_menu((Fl_Menu_Item*)(w->menu())); menusize = n+10; w->menu(new Fl_Menu_Item[menusize]); + } else { + if (menusize) delete_dependents((Fl_Menu_Item*)(w->menu())); } // fill them all in: Fl_Menu_Item* m = (Fl_Menu_Item*)(w->menu()); int lvl = level+1; for (q = next; q && q->level > level; q = q->next) { Fl_Menu_Item_Type* i = (Fl_Menu_Item_Type*)q; - if (i->o->image()) i->o->image()->label(m); - else { + if (i->o->image()) { + if (i->o->label() && i->o->label()[0]) { + Fl_Multi_Label *ml = new Fl_Multi_Label; + ml->labela = (char*)i->o->image(); + ml->labelb = i->o->label(); + ml->typea = FL_IMAGE_LABEL; + ml->typeb = FL_NORMAL_LABEL; + ml->label(m); + } else { + i->o->image()->label(m); + } + } else { m->label(i->o->label() ? i->o->label() : "(nolabel)"); m->labeltype(i->o->labeltype()); } @@ -198,6 +237,8 @@ const char* Fl_Menu_Item_Type::menu_name(int& i) { } void Fl_Menu_Item_Type::write_static() { + if (image && label() && label()[0]) + write_declare("#include "); if (callback() && is_name(callback()) && !user_defined(callback())) write_declare("extern void %s(Fl_Menu_*, %s);", callback(), user_data_type() ? user_data_type() : "void*"); @@ -265,11 +306,9 @@ void Fl_Menu_Item_Type::write_static() { const char* k = class_name(1); if (k) { int i; - if (i18n_type) write_c("\nunsigned char %s::%s_i18n_done = 0;", k, menu_name(i)); write_c("\nFl_Menu_Item %s::%s[] = {\n", k, menu_name(i)); } else { int i; - if (i18n_type) write_c("\nunsigned char %s_i18n_done = 0;", menu_name(i)); write_c("\nFl_Menu_Item %s[] = {\n", menu_name(i)); } Fl_Type* t = prev; while (t && t->is_menu_item()) t = t->prev; @@ -331,9 +370,21 @@ void Fl_Menu_Item_Type::write_item() { write_comment_inline_c(" "); write_c(" {"); - if (image) write_c("0"); - else if (label()) write_cstring(label()); // we will call i18n when the widget is instantiated for the first time - else write_c("\"\""); + if (label() && label()[0]) + switch (i18n_type) { + case 1: + // we will call i18n when the menu is instantiated for the first time + write_c("%s(", i18n_static_function); + write_cstring(label()); + write_c(")"); + break; + case 2: + // fall through: strings can't be translated before a catalog is choosen + default: + write_cstring(label()); + } + else + write_c("\"\""); if (((Fl_Button*)o)->shortcut()) { int s = ((Fl_Button*)o)->shortcut(); if (use_FL_COMMAND && (s & (FL_CTRL|FL_META))) { @@ -361,16 +412,22 @@ void Fl_Menu_Item_Type::write_item() { write_c("},\n"); } +void start_menu_initialiser(int &initialized, const char *name, int index) { + if (!initialized) { + initialized = 1; + write_c("%s{ Fl_Menu_Item* o = &%s[%d];\n", indent(), name, index); + indentation++; + } +} + void Fl_Menu_Item_Type::write_code1() { int i; const char* mname = menu_name(i); if (!prev->is_menu_item()) { // for first menu item, declare the array if (class_name(1)) { - if (i18n_type) write_h("%sstatic unsigned char %s_i18n_done;\n", indent(1), mname); write_h("%sstatic Fl_Menu_Item %s[];\n", indent(1), mname); } else { - if (i18n_type) write_h("extern unsigned char %s_i18n_done;\n", mname); write_h("extern Fl_Menu_Item %s[];\n", mname); } } @@ -401,24 +458,59 @@ void Fl_Menu_Item_Type::write_code1() { int menuItemInitialized = 0; // if the name is an array variable, assign the value here if (name() && strchr(name(), '[')) { - write_c("%s%s = &%s[%d];\n", indent(), name(), mname, i); + write_c("%s%s = &%s[%d];\n", indent_plus(1), name(), mname, i); } if (image) { - menuItemInitialized = 1; - write_c("%s{ Fl_Menu_Item* o = &%s[%d];\n", indent(), mname, i); - image->write_code("o"); + start_menu_initialiser(menuItemInitialized, mname, i); + if (label() && label()[0]) { + write_c("%sFl_Multi_Label *ml = new Fl_Multi_Label;\n", indent()); + write_c("%sml->labela = (char*)", indent()); + image->write_inline(); + write_c(";\n"); + if (i18n_type==0) { + write_c("%sml->labelb = o->label();\n", indent()); + } else if (i18n_type==1) { + write_c("%sml->labelb = %s(o->label());\n", + indent(), i18n_function); + } else if (i18n_type==2) { + write_c("%sml->labelb = catgets(%s,%s,i+%d,o->label());\n", + indent(), i18n_file[0] ? i18n_file : "_catalog", + i18n_set, msgnum()); + } + write_c("%sml->typea = FL_IMAGE_LABEL;\n", indent()); + write_c("%sml->typeb = FL_NORMAL_LABEL;\n", indent()); + write_c("%sml->label(o);\n", indent()); + } else { + image->write_code("o"); + } + } + if (i18n_type && label() && label()[0]) { + Fl_Labeltype t = o->labeltype(); + if (image) { + // label was already copied a few lines up + } else if ( t==FL_NORMAL_LABEL || t==FL_SHADOW_LABEL + || t==FL_ENGRAVED_LABEL || t==FL_EMBOSSED_LABEL) { + start_menu_initialiser(menuItemInitialized, mname, i); + if (i18n_type==1) { + write_c("%so->label(%s(o->label()));\n", + indent(), i18n_function); + } else if (i18n_type==2) { + write_c("%so->label(catgets(%s,%s,i+%d,o->label()));\n", + indent(), i18n_file[0] ? i18n_file : "_catalog", + i18n_set, msgnum()); + } + } } for (int n=0; n < NUM_EXTRA_CODE; n++) { if (extra_code(n) && !isdeclare(extra_code(n))) { - if (!menuItemInitialized) { - menuItemInitialized = 1; - write_c("%s{ Fl_Menu_Item* o = &%s[%d];\n", indent(), mname, i); - } - write_c("%s%s\n", indent_plus(1), extra_code(n)); + start_menu_initialiser(menuItemInitialized, mname, i); + write_c("%s%s\n", indent(), extra_code(n)); } } - if (menuItemInitialized) + if (menuItemInitialized) { + indentation--; write_c("%s}\n",indent()); + } } void Fl_Menu_Item_Type::write_code2() {} @@ -440,23 +532,35 @@ void Fl_Menu_Type::build_menu() { n++; } if (!n) { - if (menusize) delete[] (Fl_Menu_Item*)(w->menu()); + if (menusize) delete_menu((Fl_Menu_Item*)(w->menu())); w->menu(0); menusize = 0; } else { n++; // space for null at end of menu if (menusizemenu()); + if (menusize) delete_menu((Fl_Menu_Item*)(w->menu())); menusize = n+10; w->menu(new Fl_Menu_Item[menusize]); + } else { + if (menusize) delete_dependents((Fl_Menu_Item*)(w->menu())); } // fill them all in: Fl_Menu_Item* m = (Fl_Menu_Item*)(w->menu()); int lvl = level+1; for (q = next; q && q->level > level; q = q->next) { Fl_Menu_Item_Type* i = (Fl_Menu_Item_Type*)q; - if (i->o->image()) i->o->image()->label(m); - else { + if (i->o->image()) { + if (i->o->label() && i->o->label()[0]) { + Fl_Multi_Label *ml = new Fl_Multi_Label; + ml->labela = (char*)i->o->image(); + ml->labelb = i->o->label(); + ml->typea = FL_IMAGE_LABEL; + ml->typeb = FL_NORMAL_LABEL; + ml->label(m); + } else { + i->o->image()->label(m); + } + } else { m->label(i->o->label() ? i->o->label() : "(nolabel)"); m->labeltype(i->o->labeltype()); } @@ -498,38 +602,6 @@ Fl_Type* Fl_Menu_Type::click_test(int, int) { void Fl_Menu_Type::write_code2() { if (next && next->is_menu_item()) { - if (i18n_type) { - // take care of i18n now! - Fl_Menu_Item_Type *mi = (Fl_Menu_Item_Type*)next; - int i, nItem = 0, nLabel = 0; - const char *mName = mi->menu_name(i); - for (Fl_Type* q = next; q && q->is_menu_item(); q = q->next) { - if (((Fl_Menu_Item_Type*)q)->label()) nLabel++; - int thislevel = q->level; if (q->is_parent()) thislevel++; - int nextlevel = - (q->next && q->next->is_menu_item()) ? q->next->level : next->level+1; - nItem += 1 + ((thislevel > nextlevel) ? (thislevel-nextlevel) : 0); - } - if (nLabel) { - write_c("%sif (!%s_i18n_done) {\n", indent(), mName); - write_c("%sint i=0;\n", indent_plus(1)); - write_c("%sfor ( ; i<%d; i++)\n", indent_plus(1), nItem); - write_c("%sif (%s[i].label())\n", indent_plus(2), mName); - switch (i18n_type) { - case 1: - write_c("%s%s[i].label(%s(%s[i].label()));\n", - indent_plus(3), mName, i18n_function, mName); - break; - case 2: - write_c("%s%s[i].label(catgets(%s,%s,i+%d,%s[i].label()));\n", - indent_plus(3), mName, i18n_file[0] ? i18n_file : "_catalog", - i18n_set, mi->msgnum(), mName); - break; - } - write_c("%s%s_i18n_done = 1;\n", indent_plus(1), mName); - write_c("%s}\n", indent()); - } - } write_c("%s%s->menu(%s);\n", indent(), name() ? name() : "o", unique_id(this, "menu", name(), label())); } diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx index 7b20f5312..2669cb7b1 100644 --- a/fluid/Fl_Type.cxx +++ b/fluid/Fl_Type.cxx @@ -179,6 +179,7 @@ void delete_all(int selected_only) { } else f = f->next; } if(!selected_only) { + // FIXME: undo/redo uses this function, resetting the following preferences randomly include_H_from_C=1; use_FL_COMMAND=0; utf8_in_src = 0; diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx index 81ac5fbb8..ddc94fc9c 100644 --- a/fluid/Fl_Window_Type.cxx +++ b/fluid/Fl_Window_Type.cxx @@ -45,11 +45,6 @@ int include_H_from_C = 1; int use_FL_COMMAND = 0; int utf8_in_src = 0; -extern int i18n_type; -extern const char* i18n_include; -extern const char* i18n_function; -extern const char* i18n_file; -extern const char* i18n_set; extern Fl_Preferences fluid_prefs; @@ -125,31 +120,43 @@ void i18n_type_cb(Fl_Choice *c, void *) { switch (i18n_type = c->value()) { case 0 : /* None */ i18n_include_input->hide(); + i18n_conditional_input->hide(); i18n_file_input->hide(); i18n_set_input->hide(); i18n_function_input->hide(); + i18n_static_function_input->hide(); break; case 1 : /* GNU gettext */ i18n_include_input->value(""); i18n_include = i18n_include_input->value(); + i18n_conditional_input->value(""); + i18n_conditional = i18n_conditional_input->value(); i18n_function_input->value("gettext"); i18n_function = i18n_function_input->value(); + i18n_static_function_input->value("gettext_noop"); + i18n_static_function = i18n_static_function_input->value(); i18n_include_input->show(); + i18n_conditional_input->show(); i18n_file_input->hide(); i18n_set_input->hide(); i18n_function_input->show(); + i18n_static_function_input->show(); break; case 2 : /* POSIX cat */ i18n_include_input->value(""); + i18n_include = i18n_include_input->value(); + i18n_conditional_input->value(""); + i18n_conditional = i18n_conditional_input->value(); i18n_file_input->value(""); i18n_file = i18n_file_input->value(); i18n_set_input->value("1"); i18n_set = i18n_set_input->value(); i18n_include_input->show(); - i18n_include = i18n_include_input->value(); + i18n_conditional_input->show(); i18n_file_input->show(); i18n_set_input->show(); i18n_function_input->hide(); + i18n_static_function_input->hide(); break; } @@ -161,10 +168,14 @@ void i18n_text_cb(Fl_Input *i, void *) { if (i == i18n_function_input) i18n_function = i->value(); + else if (i == i18n_static_function_input) + i18n_static_function = i->value(); else if (i == i18n_file_input) i18n_file = i->value(); else if (i == i18n_include_input) i18n_include = i->value(); + else if (i == i18n_conditional_input) + i18n_conditional = i->value(); set_modflag(1); } @@ -187,27 +198,35 @@ void show_project_cb(Fl_Widget *, void *) { code_file_input->value(code_file_name); i18n_type_chooser->value(i18n_type); i18n_function_input->value(i18n_function); + i18n_static_function_input->value(i18n_static_function); i18n_file_input->value(i18n_file); i18n_set_input->value(i18n_set); i18n_include_input->value(i18n_include); + i18n_conditional_input->value(i18n_conditional); switch (i18n_type) { case 0 : /* None */ i18n_include_input->hide(); + i18n_conditional_input->hide(); i18n_file_input->hide(); i18n_set_input->hide(); i18n_function_input->hide(); + i18n_static_function_input->hide(); break; case 1 : /* GNU gettext */ i18n_include_input->show(); + i18n_conditional_input->show(); i18n_file_input->hide(); i18n_set_input->hide(); i18n_function_input->show(); + i18n_static_function_input->show(); break; case 2 : /* POSIX cat */ i18n_include_input->show(); + i18n_conditional_input->show(); i18n_file_input->show(); i18n_set_input->show(); i18n_function_input->hide(); + i18n_static_function_input->hide(); break; } project_window->hotspot(project_window); diff --git a/fluid/Fluid_Image.cxx b/fluid/Fluid_Image.cxx index 65767632b..a63355a32 100644 --- a/fluid/Fluid_Image.cxx +++ b/fluid/Fluid_Image.cxx @@ -157,6 +157,11 @@ void Fluid_Image::write_code(const char *var, int inactive) { if (img) write_c("%s%s->%s( %s() );\n", indent(), var, inactive ? "deimage" : "image", function_name_); } +void Fluid_Image::write_inline(int inactive) { + if (img) + write_c("%s()", function_name_); +} + //////////////////////////////////////////////////////////////// diff --git a/fluid/Fluid_Image.h b/fluid/Fluid_Image.h index 99b06d218..d11e2487b 100644 --- a/fluid/Fluid_Image.h +++ b/fluid/Fluid_Image.h @@ -41,6 +41,7 @@ public: void write_static(); void write_initializer(const char *type_name, const char *format, ...); void write_code(const char *var, int inactive = 0); + void write_inline(int inactive = 0); const char *name() const {return name_;} }; diff --git a/fluid/alignment_panel.cxx b/fluid/alignment_panel.cxx index 532cf10e0..3a76c4012 100644 --- a/fluid/alignment_panel.cxx +++ b/fluid/alignment_panel.cxx @@ -49,21 +49,26 @@ Fl_Menu_Item menu_i18n_type_chooser[] = { Fl_Input *i18n_include_input=(Fl_Input *)0; +Fl_Input *i18n_conditional_input=(Fl_Input *)0; + Fl_Input *i18n_file_input=(Fl_Input *)0; Fl_Int_Input *i18n_set_input=(Fl_Int_Input *)0; Fl_Input *i18n_function_input=(Fl_Input *)0; +Fl_Input *i18n_static_function_input=(Fl_Input *)0; + Fl_Double_Window* make_project_window() { { project_window = new Fl_Double_Window(399, 275, "Project Settings"); { Fl_Button* o = new Fl_Button(328, 239, 60, 25, "Close"); o->tooltip("Close this dialog."); o->callback((Fl_Callback*)cb_Close); } // Fl_Button* o - { Fl_Tabs* o = new Fl_Tabs(10, 10, 378, 218); + { Fl_Tabs* o = new Fl_Tabs(10, 10, 379, 218); o->selection_color((Fl_Color)12); - { Fl_Group* o = new Fl_Group(10, 36, 378, 192, "Output"); + o->labelcolor(FL_BACKGROUND2_COLOR); + { Fl_Group* o = new Fl_Group(10, 36, 379, 192, "Output"); { Fl_Box* o = new Fl_Box(20, 49, 340, 49, "Use \"name.ext\" to set a file name or just \".ext\" to set extension."); o->align(Fl_Align(132|FL_ALIGN_INSIDE)); } // Fl_Box* o @@ -89,7 +94,7 @@ Fl_Double_Window* make_project_window() { include_H_from_C_button->callback((Fl_Callback*)include_H_from_C_button_cb); } // Fl_Check_Button* include_H_from_C_button { use_FL_COMMAND_button = new Fl_Check_Button(117, 176, 272, 20, "Menu shortcuts use FL_COMMAND"); - use_FL_COMMAND_button->tooltip("Replace FL_CTRL with FL_COMMAND when generating menu shortcut code."); + use_FL_COMMAND_button->tooltip("Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts"); use_FL_COMMAND_button->down_box(FL_DOWN_BOX); use_FL_COMMAND_button->callback((Fl_Callback*)use_FL_COMMAND_button_cb); } // Fl_Check_Button* use_FL_COMMAND_button @@ -104,7 +109,7 @@ ped using octal notation `\\0123`. If this option is checked, Fluid will write\ } // Fl_Group* o { Fl_Group* o = new Fl_Group(10, 36, 378, 192, "Internationalization"); o->hide(); - { i18n_type_chooser = new Fl_Choice(100, 48, 136, 25, "Use:"); + { i18n_type_chooser = new Fl_Choice(128, 48, 136, 25, "Use:"); i18n_type_chooser->tooltip("Type of internationalization to use."); i18n_type_chooser->box(FL_THIN_UP_BOX); i18n_type_chooser->down_box(FL_BORDER_BOX); @@ -112,21 +117,29 @@ ped using octal notation `\\0123`. If this option is checked, Fluid will write\ i18n_type_chooser->callback((Fl_Callback*)i18n_type_cb); i18n_type_chooser->menu(menu_i18n_type_chooser); } // Fl_Choice* i18n_type_chooser - { i18n_include_input = new Fl_Input(100, 78, 272, 20, "#include:"); + { i18n_include_input = new Fl_Input(128, 78, 243, 20, "#include:"); i18n_include_input->tooltip("The include file for internationalization."); i18n_include_input->box(FL_THIN_DOWN_BOX); i18n_include_input->labelfont(1); i18n_include_input->textfont(4); i18n_include_input->callback((Fl_Callback*)i18n_text_cb); } // Fl_Input* i18n_include_input - { i18n_file_input = new Fl_Input(100, 104, 272, 20, "File:"); + { i18n_conditional_input = new Fl_Input(128, 103, 243, 20, "Conditional:"); + i18n_conditional_input->tooltip("only include the header file if this preprocessor macro is defined, for examp\ +le FLTK_GETTEXT_FOUND"); + i18n_conditional_input->box(FL_THIN_DOWN_BOX); + i18n_conditional_input->labelfont(1); + i18n_conditional_input->textfont(4); + i18n_conditional_input->callback((Fl_Callback*)i18n_text_cb); + } // Fl_Input* i18n_conditional_input + { i18n_file_input = new Fl_Input(128, 128, 243, 20, "File:"); i18n_file_input->tooltip("The name of the message catalog."); i18n_file_input->box(FL_THIN_DOWN_BOX); i18n_file_input->labelfont(1); i18n_file_input->textfont(4); i18n_file_input->callback((Fl_Callback*)i18n_text_cb); } // Fl_Input* i18n_file_input - { i18n_set_input = new Fl_Int_Input(100, 128, 272, 20, "Set:"); + { i18n_set_input = new Fl_Int_Input(128, 153, 243, 20, "Set:"); i18n_set_input->tooltip("The message set number."); i18n_set_input->type(2); i18n_set_input->box(FL_THIN_DOWN_BOX); @@ -134,13 +147,22 @@ ped using octal notation `\\0123`. If this option is checked, Fluid will write\ i18n_set_input->textfont(4); i18n_set_input->callback((Fl_Callback*)i18n_int_cb); } // Fl_Int_Input* i18n_set_input - { i18n_function_input = new Fl_Input(100, 103, 272, 20, "Function:"); - i18n_function_input->tooltip("The function to call to internationalize the labels and tooltips."); + { i18n_function_input = new Fl_Input(128, 128, 243, 20, "Function:"); + i18n_function_input->tooltip("The function to call to translate labels and tooltips, usually \"gettext\" or\ + \"_\""); i18n_function_input->box(FL_THIN_DOWN_BOX); i18n_function_input->labelfont(1); i18n_function_input->textfont(4); i18n_function_input->callback((Fl_Callback*)i18n_text_cb); } // Fl_Input* i18n_function_input + { i18n_static_function_input = new Fl_Input(128, 153, 243, 20, "Static Function:"); + i18n_static_function_input->tooltip("function to call to translate static text, The function to call to internatio\ +nalize labels and tooltips, usually \"gettext_noop\" or \"N_\""); + i18n_static_function_input->box(FL_THIN_DOWN_BOX); + i18n_static_function_input->labelfont(1); + i18n_static_function_input->textfont(4); + i18n_static_function_input->callback((Fl_Callback*)i18n_text_cb); + } // Fl_Input* i18n_static_function_input o->end(); } // Fl_Group* o o->end(); @@ -525,7 +547,7 @@ Fl_Double_Window* make_layout_window() { o->labelfont(1); o->align(Fl_Align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE)); } // Fl_Box* o - { Fl_Group* o = new Fl_Group(105, 115, 170, 75); + { Fl_Group* o = new Fl_Group(105, 115, 192, 75); { def_widget_size[0] = new Fl_Round_Button(115, 115, 70, 25); def_widget_size[0]->type(102); def_widget_size[0]->down_box(FL_ROUND_DOWN_BOX); diff --git a/fluid/alignment_panel.fl b/fluid/alignment_panel.fl index 0bce36880..ca8fb6cbb 100644 --- a/fluid/alignment_panel.fl +++ b/fluid/alignment_panel.fl @@ -54,7 +54,7 @@ Function {make_project_window()} {open } { Fl_Window project_window { label {Project Settings} open - xywh {473 246 399 275} type Double + xywh {472 246 399 275} type Double code0 {\#include } code1 {\#include } modal visible } { @@ -65,11 +65,11 @@ set_modflag(-1, -1);} tooltip {Close this dialog.} xywh {328 239 60 25} } Fl_Tabs {} {open - xywh {10 10 378 218} selection_color 12 + xywh {10 10 379 218} selection_color 12 labelcolor 7 } { Fl_Group {} { - label Output open - xywh {10 36 378 192} + label Output open selected + xywh {10 36 379 192} } { Fl_Box {} { label {Use "name.ext" to set a file name or just ".ext" to set extension.} @@ -95,11 +95,11 @@ set_modflag(-1, -1);} Fl_Check_Button use_FL_COMMAND_button { label {Menu shortcuts use FL_COMMAND} callback use_FL_COMMAND_button_cb - tooltip {Replace FL_CTRL with FL_COMMAND when generating menu shortcut code.} xywh {117 176 272 20} down_box DOWN_BOX + tooltip {Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts} xywh {117 176 272 20} down_box DOWN_BOX } Fl_Check_Button utf8_in_src_button { label {allow Unicode UTF-8 in source code} - callback utf8_in_src_cb selected + callback utf8_in_src_cb tooltip {For older compilers, characters outside of the printable ASCII range are escaped using octal notation `\\0123`. If this option is checked, Fluid will write UTF-8 characters unchanged.} xywh {117 199 272 20} down_box DOWN_BOX } } @@ -110,7 +110,7 @@ set_modflag(-1, -1);} Fl_Choice i18n_type_chooser { label {Use:} callback i18n_type_cb open - tooltip {Type of internationalization to use.} xywh {100 48 136 25} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 + tooltip {Type of internationalization to use.} xywh {128 48 136 25} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 } { MenuItem {} { label None @@ -128,22 +128,32 @@ set_modflag(-1, -1);} Fl_Input i18n_include_input { label {\#include:} callback i18n_text_cb - tooltip {The include file for internationalization.} xywh {100 78 272 20} box THIN_DOWN_BOX labelfont 1 textfont 4 + tooltip {The include file for internationalization.} xywh {128 78 243 20} box THIN_DOWN_BOX labelfont 1 textfont 4 + } + Fl_Input i18n_conditional_input { + label {Conditional:} + callback i18n_text_cb + tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {128 103 243 20} box THIN_DOWN_BOX labelfont 1 textfont 4 } Fl_Input i18n_file_input { label {File:} callback i18n_text_cb - tooltip {The name of the message catalog.} xywh {100 104 272 20} box THIN_DOWN_BOX labelfont 1 textfont 4 + tooltip {The name of the message catalog.} xywh {128 128 243 20} box THIN_DOWN_BOX labelfont 1 textfont 4 } Fl_Input i18n_set_input { label {Set:} callback i18n_int_cb - tooltip {The message set number.} xywh {100 128 272 20} type Int box THIN_DOWN_BOX labelfont 1 textfont 4 + tooltip {The message set number.} xywh {128 153 243 20} type Int box THIN_DOWN_BOX labelfont 1 textfont 4 } Fl_Input i18n_function_input { label {Function:} callback i18n_text_cb - tooltip {The function to call to internationalize the labels and tooltips.} xywh {100 103 272 20} box THIN_DOWN_BOX labelfont 1 textfont 4 + tooltip {The function to call to translate labels and tooltips, usually "gettext" or "_"} xywh {128 128 243 20} box THIN_DOWN_BOX labelfont 1 textfont 4 + } + Fl_Input i18n_static_function_input { + label {Static Function:} + callback i18n_text_cb + tooltip {function to call to translate static text, The function to call to internationalize labels and tooltips, usually "gettext_noop" or "N_"} xywh {128 153 243 20} box THIN_DOWN_BOX labelfont 1 textfont 4 } } } @@ -388,7 +398,7 @@ Function {make_layout_window()} {open } { Fl_Window grid_window { label {Layout Settings} - xywh {885 274 310 245} type Double non_modal visible + xywh {745 303 310 245} type Double non_modal visible } { Fl_Input horizontal_input { label x @@ -431,7 +441,7 @@ Function {make_layout_window()} {open xywh {10 115 107 25} labelfont 1 align 24 } Fl_Group {} {open - xywh {105 115 170 75} + xywh {105 115 192 75} } { Fl_Round_Button {def_widget_size[0]} { user_data 8 user_data_type long diff --git a/fluid/alignment_panel.h b/fluid/alignment_panel.h index a7cc71102..9a6e6092a 100644 --- a/fluid/alignment_panel.h +++ b/fluid/alignment_panel.h @@ -51,11 +51,13 @@ extern void i18n_type_cb(Fl_Choice*, void*); extern Fl_Choice *i18n_type_chooser; extern void i18n_text_cb(Fl_Input*, void*); extern Fl_Input *i18n_include_input; +extern Fl_Input *i18n_conditional_input; extern Fl_Input *i18n_file_input; #include extern void i18n_int_cb(Fl_Int_Input*, void*); extern Fl_Int_Input *i18n_set_input; extern Fl_Input *i18n_function_input; +extern Fl_Input *i18n_static_function_input; Fl_Double_Window* make_project_window(); extern Fl_Menu_Item menu_i18n_type_chooser[]; extern void i18n_cb(Fl_Choice *,void *); diff --git a/fluid/code.cxx b/fluid/code.cxx index e9af1fd53..d6b4bdc38 100644 --- a/fluid/code.cxx +++ b/fluid/code.cxx @@ -573,23 +573,6 @@ int write_code(const char *s, const char *t) { } write_declare("#include "); - if (i18n_type && i18n_include[0]) { - if (i18n_include[0] != '<' && - i18n_include[0] != '\"') - write_c("#include \"%s\"\n", i18n_include); - else - write_c("#include %s\n", i18n_include); - if (i18n_type == 2) { - if (i18n_file[0]) write_c("extern nl_catd %s;\n", i18n_file); - else { - write_c("// Initialize I18N stuff now for menus...\n"); - write_c("#include \n"); - write_c("static char *_locale = setlocale(LC_MESSAGES, \"\");\n"); - write_c("static nl_catd _catalog = catopen(\"%s\", 0);\n", - i18n_program); - } - } - } if (t && include_H_from_C) { if (*header_file_name == '.' && strchr(header_file_name, '/') == NULL) { write_c("#include \"%s\"\n", fl_filename_name(t)); @@ -597,6 +580,50 @@ int write_code(const char *s, const char *t) { write_c("#include \"%s\"\n", t); } } + if (i18n_type && i18n_include[0]) { + int conditional = (i18n_conditional[0]!=0); + if (conditional) { + write_c("#ifdef %s\n", i18n_conditional); + indentation++; + } + if (i18n_include[0] != '<' && + i18n_include[0] != '\"') + write_c("#%sinclude \"%s\"\n", indent(), i18n_include); + else + write_c("#%sinclude %s\n", indent(), i18n_include); + if (i18n_type == 2) { + if (i18n_file[0]) write_c("extern nl_catd %s;\n", i18n_file); + else { + write_c("// Initialize I18N stuff now for menus...\n"); + write_c("#%sinclude \n", indent()); + write_c("static char *_locale = setlocale(LC_MESSAGES, \"\");\n"); + write_c("static nl_catd _catalog = catopen(\"%s\", 0);\n", + i18n_program); + } + } + if (conditional) { + write_c("#else\n"); + if (i18n_type == 1) { + if (i18n_function[0]) { + write_c("#%sifndef %s\n", indent(), i18n_function); + write_c("#%sdefine %s(text) text\n", indent_plus(1), i18n_function); + write_c("#%sendif\n", indent()); + } + } + if (i18n_type == 2) { + write_c("#%sifndef catgets\n", indent()); + write_c("#%sdefine catgets(catalog, set, msgid, text) text\n", indent_plus(1)); + write_c("#%sendif\n", indent()); + } + indentation--; + write_c("#endif\n"); + } + if (i18n_type == 1 && i18n_static_function[0]) { + write_c("#ifndef %s\n", i18n_static_function); + write_c("#%sdefine %s(text) text\n", indent_plus(1), i18n_static_function); + write_c("#endif\n"); + } + } for (Fl_Type* p = first_type; p;) { // write all static data for this & all children first if (write_sourceview) p->header_position = (int)ftell(header_file); diff --git a/fluid/file.cxx b/fluid/file.cxx index b38be1cd6..044e4b156 100644 --- a/fluid/file.cxx +++ b/fluid/file.cxx @@ -385,14 +385,16 @@ int write_file(const char *filename, int selected_only) { write_string("\nutf8_in_src"); if (i18n_type) { write_string("\ni18n_type %d", i18n_type); - write_string("\ni18n_include %s", i18n_include); + write_string("\ni18n_include"); write_word(i18n_include); + write_string("\ni18n_conditional"); write_word(i18n_conditional); switch (i18n_type) { case 1 : /* GNU gettext */ - write_string("\ni18n_function %s", i18n_function); + write_string("\ni18n_function"); write_word(i18n_function); + write_string("\ni18n_static_function"); write_word(i18n_static_function); break; case 2 : /* POSIX catgets */ - if (i18n_file[0]) write_string("\ni18n_file %s", i18n_file); - write_string("\ni18n_set %s", i18n_set); + if (i18n_file[0]) write_string("\ni18n_file"); write_word(i18n_file); + write_string("\ni18n_set"); write_word(i18n_set); break; } } @@ -507,6 +509,10 @@ static void read_children(Fl_Type *p, int paste, Strategy strategy, char skip_op i18n_function = fl_strdup(read_word()); goto CONTINUE; } + if (!strcmp(c,"i18n_static_function")) { + i18n_static_function = fl_strdup(read_word()); + goto CONTINUE; + } if (!strcmp(c,"i18n_file")) { i18n_file = fl_strdup(read_word()); goto CONTINUE; @@ -519,9 +525,8 @@ static void read_children(Fl_Type *p, int paste, Strategy strategy, char skip_op i18n_include = fl_strdup(read_word()); goto CONTINUE; } - if (!strcmp(c,"i18n_type")) - { - i18n_type = atoi(read_word()); + if (!strcmp(c,"i18n_conditional")) { + i18n_conditional = fl_strdup(read_word()); goto CONTINUE; } if (!strcmp(c,"i18n_type")) diff --git a/fluid/fluid.cxx b/fluid/fluid.cxx index df8a713a2..95568d63f 100644 --- a/fluid/fluid.cxx +++ b/fluid/fluid.cxx @@ -180,14 +180,47 @@ const char* code_file_name = ".cxx"; /// \todo document me int i18n_type = 0; -/// Saved in the .fl design file. -/// \todo document me +/** + For either type of translation, write a #include statement into the + source file. + + This is usually `` or `"gettext.h"` for GNU gettext, or + `` for Posix catgets. + + Fluid accepts filenames in quotes or in \< and \>. If neither is found, + double quotes are added. + If this value is emty, no include statement will be generated. + + Saved in the .fl design file. + */ const char* i18n_include = ""; -/// Saved in the .fl design file. -/// \todo document me +const char* i18n_conditional = ""; + +/** + For the gettext/intl.h options, this is the function that translates text + at runtime. + + This is usually "gettext" or "_". + This should not be empty. + Saved in the .fl design file. + + */ const char* i18n_function = ""; +/** + For the gettext/intl.h options, this is the function that marks the + translation of text at initialisation time. + + This is usually "gettext_noop" or "N_". + This should not be empty. + Fluid will translate static text (usually in menu items) later when used + for the first time. + + Saved in the .fl design file. + */ +const char* i18n_static_function = ""; + /// Saved in the .fl design file. /// \todo document me const char* i18n_file = ""; diff --git a/fluid/fluid.h b/fluid/fluid.h index ff309843a..a00a775d3 100644 --- a/fluid/fluid.h +++ b/fluid/fluid.h @@ -82,7 +82,9 @@ extern const char* code_file_name; extern int i18n_type; extern const char* i18n_include; +extern const char* i18n_conditional; extern const char* i18n_function; +extern const char* i18n_static_function; extern const char* i18n_file; extern const char* i18n_set;; extern char i18n_program[FL_PATH_MAX]; diff --git a/test/preferences.fl b/test/preferences.fl index b28e0c0ab..d90119ff0 100644 --- a/test/preferences.fl +++ b/test/preferences.fl @@ -1,5 +1,10 @@ # data file for the Fltk User Interface Designer (fluid) version 1.0400 +i18n_type 1 +i18n_include {} +i18n_conditional FLTK_GETTEXT_FOUND +i18n_function gettext +i18n_static_function gettext_noop header_name {.h} code_name {.cxx} decl {\#include } {public local @@ -45,7 +50,7 @@ Function {} {open return_type int Fl_Window myWindow { label {My Preferences} callback closeWindowCB open - xywh {586 277 298 311} type Double visible + xywh {585 277 298 311} type Double visible } { Fl_Button {} { label Cancel @@ -62,7 +67,7 @@ Function {} {open return_type int xywh {20 30 115 225} box ENGRAVED_FRAME align 5 } { Fl_Input wAlarm { - label {Alarm at:} selected + label {Alarm at:} xywh {25 55 45 20} align 5 } Fl_Choice wAmPm {open @@ -73,7 +78,7 @@ Function {} {open return_type int xywh {0 0 100 20} } MenuItem {} { - label {p.m.} + label {p.m.} selected xywh {0 0 100 20} } }