Alexandre Julliard : wrc: Print warnings for mismatched dialogs during po file generation.

Alexandre Julliard julliard at winehq.org
Mon Oct 31 12:49:04 CDT 2011


Module: wine
Branch: master
Commit: 413f5ccba5a344a10ee8c567e713d402de027353
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=413f5ccba5a344a10ee8c567e713d402de027353

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 31 11:04:36 2011 +0100

wrc: Print warnings for mismatched dialogs during po file generation.

---

 tools/wrc/po.c |   93 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 82 insertions(+), 11 deletions(-)

diff --git a/tools/wrc/po.c b/tools/wrc/po.c
index 9cb2b42..f44c395 100644
--- a/tools/wrc/po.c
+++ b/tools/wrc/po.c
@@ -559,22 +559,22 @@ static po_file_t get_po_file( const language_t *lang )
     return po_file->po;
 }
 
-static char *get_po_file_name( const language_t *lang )
+static const char *get_language_name( const language_t *lang )
 {
+    static char name[20];
     unsigned int i;
-    char name[40];
 
-    sprintf( name, "%02x-%02x", lang->id, lang->sub );
     for (i = 0; i < sizeof(languages)/sizeof(languages[0]); i++)
-    {
         if (languages[i].id == lang->id && languages[i].sub == lang->sub)
-        {
-            strcpy( name, languages[i].name );
-            break;
-        }
-    }
-    strcat( name, ".po" );
-    return xstrdup( name );
+            return languages[i].name;
+
+    sprintf( name, "%02x-%02x", lang->id, lang->sub );
+    return name;
+}
+
+static char *get_po_file_name( const language_t *lang )
+{
+    return strmake( "%s.po", get_language_name( lang ) );
 }
 
 static unsigned int flush_po_files( const char *output_name )
@@ -658,6 +658,75 @@ static void add_pot_dialog( po_file_t po, const resource_t *res )
     add_pot_dialog_controls( po, dlg->controls );
 }
 
+static void compare_dialogs( const dialog_t *english_dlg, const dialog_t *dlg )
+{
+    const control_t *english_ctrl, *ctrl;
+    unsigned int style = 0, exstyle = 0, english_style = 0, english_exstyle = 0;
+    char *name;
+    char *title = english_dlg->title ? convert_msgid_ascii( english_dlg->title, 0 ) : xstrdup("??");
+
+    if (english_dlg->width != dlg->width || english_dlg->height != dlg->height)
+        warning( "%s: dialog %s doesn't have the same size (%d,%d vs %d,%d)\n",
+                 get_language_name( dlg->lvc.language ), title, dlg->width, dlg->height,
+                 english_dlg->width, english_dlg->height );
+
+    if (dlg->gotstyle) style = dlg->style->or_mask;
+    if (dlg->gotexstyle) exstyle = dlg->exstyle->or_mask;
+    if (english_dlg->gotstyle) english_style = english_dlg->style->or_mask;
+    if (english_dlg->gotexstyle) english_exstyle = english_dlg->exstyle->or_mask;
+    if (english_style != style)
+        warning( "%s: dialog %s doesn't have the same style (%08x vs %08x)\n",
+                 get_language_name( dlg->lvc.language ), title, style, english_style );
+    if (english_exstyle != exstyle)
+        warning( "%s: dialog %s doesn't have the same exstyle (%08x vs %08x)\n",
+                 get_language_name( dlg->lvc.language ), title, exstyle, english_exstyle );
+
+    if (english_dlg->font || dlg->font)
+    {
+        int size = 0, english_size = 0;
+        char *font = NULL, *english_font = NULL;
+
+        if (english_dlg->font)
+        {
+            english_font = convert_msgid_ascii( english_dlg->font->name, 0 );
+            english_size = english_dlg->font->size;
+        }
+        if (dlg->font)
+        {
+            font = convert_msgid_ascii( dlg->font->name, 0 );
+            size = dlg->font->size;
+        }
+
+        if (!english_font || !font || strcasecmp( english_font, font ) || english_size != size)
+            warning( "%s: dialog %s doesn't have the same font (%s %u vs %s %u)\n",
+                     get_language_name(dlg->lvc.language), title,
+                     english_font ? english_font : "default", english_size,
+                     font ? font : "default", size );
+        free( font );
+        free( english_font );
+    }
+    english_ctrl = english_dlg->controls;
+    ctrl = dlg->controls;
+    for ( ; english_ctrl && ctrl; ctrl = ctrl->next, english_ctrl = english_ctrl->next )
+    {
+        if (control_has_title( english_ctrl ))
+            name = convert_msgid_ascii( english_ctrl->title->name.s_name, 0 );
+        else
+            name = strmake( "%d", ctrl->id );
+
+        if (english_ctrl->width != ctrl->width || english_ctrl->height != ctrl->height)
+            warning( "%s: dialog %s control %s doesn't have the same size (%d,%d vs %d,%d)\n",
+                     get_language_name( dlg->lvc.language ), title, name,
+                     ctrl->width, ctrl->height, english_ctrl->width, english_ctrl->height );
+        if (english_ctrl->x != ctrl->x || english_ctrl->y != ctrl->y)
+            warning( "%s: dialog %s control %s doesn't have the same position (%d,%d vs %d,%d)\n",
+                     get_language_name( dlg->lvc.language ), title, name,
+                     ctrl->x, ctrl->y, english_ctrl->x, english_ctrl->y );
+        free( name );
+    }
+    free( title );
+}
+
 static void add_po_dialog_controls( po_file_t po, const control_t *english_ctrl,
                                     const control_t *ctrl, const language_t *lang )
 {
@@ -677,6 +746,8 @@ static void add_po_dialog( const resource_t *english, const resource_t *res )
     const dialog_t *dlg = res->res.dlg;
     po_file_t po = get_po_file( dlg->lvc.language );
 
+    compare_dialogs( english_dlg, dlg );
+
     if (english_dlg->title && dlg->title)
         add_po_string( po, english_dlg->title, dlg->title, dlg->lvc.language );
     if (english_dlg->font && dlg->font)




More information about the wine-cvs mailing list