* Bug 13796 fixed: tbx_generate_pofile() failed 46/19746/8
Samuel GOUGEON [Mon, 12 Feb 2018 01:49:19 +0000 (02:49 +0100)]
  http://bugzilla.scilab.org/13796

  tbx_generate_pofile()
  - missed _() and _gettext() references.
  - yielded #: comments with absolute location paths instead of relative
    to the module root
  - did not simplify the litteral '' into ' in the msgid.

Change-Id: I6cbfafea67e009a34a836527e02f29cc3b3c2c7d

scilab/CHANGES.md
scilab/contrib/toolbox_skeleton/etc/toolbox_skeleton_preferences.xml
scilab/contrib/toolbox_skeleton/macros/scilab_error.sci
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_cerror.c
scilab/contrib/toolbox_skeleton/sci_gateway/c/sci_cerror6.c
scilab/contrib/toolbox_skeleton/sci_gateway/cpp/sci_cpperror.cpp
scilab/modules/modules_manager/help/en_US/utils/tbx_generate_pofile.xml
scilab/modules/modules_manager/macros/tbx_generate_pofile.sci
scilab/modules/modules_manager/tests/nonreg_tests/bug_13796.tst [new file with mode: 0644]

index 85cdac5..5a3efca 100644 (file)
@@ -48,7 +48,7 @@ Each binary already matches an execution  mode
  -> WScilex.exe starts Scilab with GUI
  -> Wscilex-cli.exe starts Scilab without GUI but with Java
  -> Scilex.exe starts Scilab without GUI and without Java.
+
 A batch file `Scilab.bat ` has been added to select the right binary depending on the option flag.
 scilab       -> WScilex.exe
 scilab -nw   -> WScilex-cli.exe
@@ -403,7 +403,7 @@ Known issues
 * [#9617](http://bugzilla.scilab.org/show_bug.cgi?id=9617): Xcos run-time version check was too conservative.
 * [#9838](http://bugzilla.scilab.org/show_bug.cgi?id=9838): `evstr` poorly supported simple comments in input expressions.
 * [#10270](http://bugzilla.scilab.org/show_bug.cgi?id=10270): `execstr(["%val=[int16(1)";"]"])` needed entering twice <enter> to be actually performed.
-* [#10407](http://bugzilla.scilab.org/show_bug.cgi?id=10407): The macro `acf()` of the CACSD module was used nowhere and not documented. It is removed. 
+* [#10407](http://bugzilla.scilab.org/show_bug.cgi?id=10407): The macro `acf()` of the CACSD module was used nowhere and not documented. It is removed.
 * [#10467](http://bugzilla.scilab.org/show_bug.cgi?id=10467): `execstr` inside a `try/end` with a `catch` killed the stack.
 * [#11196](http://bugzilla.scilab.org/show_bug.cgi?id=11196): Some recursive extractions from a mlist failed.
 * [#11251](http://bugzilla.scilab.org/show_bug.cgi?id=11251): `execstr` could kill the variables stack.
@@ -423,6 +423,7 @@ Known issues
 * [#13277](http://bugzilla.scilab.org/show_bug.cgi?id=13277): `execstr("clear")` did not clear any variables in the current scope.
 * [#13581](http://bugzilla.scilab.org/show_bug.cgi?id=13581): The example of `inistate()` help page did not work on Windows 64bit.
 * [#13592](http://bugzilla.scilab.org/show_bug.cgi?id=13592): In an axes in a uicontrol frame, setting a `legend` interactively might not follow the mouse accurately.
+* [#13796](http://bugzilla.scilab.org/show_bug.cgi?id=13796): `tbx_generate_pofile` missed registering `_()` and `gettext()` references. In `en_US.po`, commented paths were absolute. Literal '' were copied in msgid without simplification.
 * [#13900](http://bugzilla.scilab.org/show_bug.cgi?id=13900): `nanmin` and `nanmax` were useless duplicates of `min` and `max`
 * [#13962](http://bugzilla.scilab.org/show_bug.cgi?id=13962): Preselecting a groupnamed radiobutton was impossible after having created it already once.
 * [#13979](http://bugzilla.scilab.org/show_bug.cgi?id=13979): A variable whose name is longer than 24 characters could not be cleared.
index f4f08c0..92856f3 100644 (file)
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <body>
-    <Form text="_d(toolbox_skeleton, Rectangle)">
-        <Entry text="_d(toolbox_skeleton, My Title)" value="exemple"/>
-        <Select text="_d(toolbox_skeleton, Height)" value="18">
+    <Form text="_(toolbox_skeleton, Rectangle)">
+        <Entry text="_(toolbox_skeleton, My Title)" value="exemple"/>
+        <Select text="_(toolbox_skeleton, Height)" value="18">
             <Option value="12"/>
             <Option value="18"/>
             <Option value="24"/>
         </Select>
-        <Select text="_d(toolbox_skeleton, Width)" value="18">
+        <Select text="_(toolbox_skeleton, Width)" value="18">
             <Option value="12"/>
             <Option value="18"/>
             <Option value="24"/>
         </Select>
-        <Color text="_d(toolbox_skeleton, Color)" value="#0000ff"/>
-        <Checkbox text="_d(toolbox_skeleton, Outline)" value="yes"/>
+        <Color text="_(toolbox_skeleton, Color)" value="#0000ff"/>
+        <Checkbox text="_(toolbox_skeleton, Outline)" value="yes"/>
     </Form>
 </body>
index 9eadde0..24d1559 100644 (file)
@@ -8,13 +8,12 @@ function scilab_error(varargin)
 
     argSize = size(varargin);
 
-    //in toolboxes, use "_d" or "dgettext" to your localized messages
     if argSize <> 1 then
-        error(999, msprintf(_d("toolbox_skeleton", "%s: I''m waiting for only one argument.\n"), "scilab_error"));
+        error(msprintf(_("toolbox_skeleton", "%s: I''m waiting for only one argument.\n"), "scilab_error"));
     end
 
     if argSize == 1 then
-        error(999, msprintf(dgettext("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), "scilab_error", 1));
+        error(msprintf(gettext("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), "scilab_error", 1));
     end
 endfunction
 // ====================================================================
index 31d61cf..99bacb4 100644 (file)
@@ -14,12 +14,12 @@ int sci_cerror(char *fname, void* pvApiCtx)
 
     if (iRhs != 1)
     {
-        Scierror(999, _d("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), fname);
+        Scierror(999, _("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), fname);
         return 0;
     }
     else
     {
-        Scierror(999, _d("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), fname, 1);
+        Scierror(999, _("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), fname, 1);
         return 0;
     }
 }
index 5a58f36..907cce1 100644 (file)
@@ -13,12 +13,12 @@ int sci_cerror6(scilabEnv env, int nin, scilabVar* in, int nopt, scilabOpt* opt,
 {
     if (nin != 1)
     {
-        Scierror(999, _d("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), fname);
+        Scierror(999, _("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), fname);
         return STATUS_ERROR;
     }
     else
     {
-        Scierror(999, _d("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), fname, 1);
+        Scierror(999, _("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), fname, 1);
         return STATUS_ERROR;
     }
 }
index 5ebde46..d84da10 100644 (file)
@@ -15,12 +15,12 @@ types::Function::ReturnValue sci_cpperror(types::typed_list &in, int _iRetCount,
 {
     if (in.size() != 1)
     {
-        Scierror(999, _d("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), "cerror");
+        Scierror(999, _("toolbox_skeleton", "%s: I'm waiting for only one argument.\n"), "cerror");
         return types::Function::Error;
     }
     else
     {
-        Scierror(999, _d("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), "cerror", 1);
+        Scierror(999, _("toolbox_skeleton", "%s: Yeah! %d is a good number of arguments but I prefer fail, sorry.\n"), "cerror", 1);
         return types::Function::Error;
     }
 }
index 7b7734d..b46439f 100644 (file)
  * along with this program.
  *
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="tbx_generate_pofile" xml:lang="en">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+          xmlns:scilab="http://www.scilab.org" xml:id="tbx_generate_pofile" xml:lang="en">
     <refnamediv>
         <refname>tbx_generate_pofile</refname>
         <refpurpose>Extract localized strings from toolbox sources (toolbox compilation process)</refpurpose>
     <refsection role="examples">
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-tbx_generate_pofile("SCI/contrib/toolbox_skeleton")
+path = TMPDIR + "/example";
+copyfile(SCI+"/contrib/toolbox_skeleton", path);
+mdelete(path+"/locales/*");
+
+tbx_generate_pofile(path);
+edit(path+"/locales/en_US.po")
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -67,6 +75,9 @@ tbx_generate_pofile("SCI/contrib/toolbox_skeleton")
             <member>
                 <link linkend="tbx_build_localization">tbx_build_localization</link>
             </member>
+            <member>
+                <link linkend="addlocalizationdomain">addlocalizationdomain</link>
+            </member>
         </simplelist>
     </refsection>
     <refsection role="history">
@@ -80,6 +91,14 @@ tbx_generate_pofile("SCI/contrib/toolbox_skeleton")
                 <revnumber>6.0.0</revnumber>
                 <revdescription>tbx_name declared obsolete. It is no longer required.</revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0.1</revnumber>
+                <revdescription>
+                    <para>_() and gettext() references are now detected.</para>
+                    <para>Litteral double '' are now simplified in the msgid.</para>
+                    <para>Files paths in comments are no longer absolute and refer to the toolbox root.</para>
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 02975ad..447e016 100644 (file)
@@ -1,6 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
-// Copyright (C) 2016 - Samuel GOUGEON
+// Copyright (C) 2016, 2018 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
@@ -64,7 +64,9 @@ function ret = tbx_generate_pofile(tbx_name, tbx_path)
     else
         XGETTEXT="xgettext";
     end
-    XGETTEXT_OPTIONS=" --omit-header -k --keyword=dgettext:2 --keyword=xmlgettext:2 --keyword=_d:2 --language=python ";
+    XGETTEXT_OPTIONS=" --omit-header  --language=python --no-wrap " + ..
+                 "-k --keyword=gettext:2 --keyword=_:2 " + ..
+                 "--keyword=dgettext:2 --keyword=_d:2 --keyword=xmlgettext:2";
 
     EXTENSIONS=["c" "h" "cpp" "cxx" "hxx" "hpp" "java"];
     EXTENSIONS_MACROS=["sci" "sce" "start" "quit"];
@@ -81,13 +83,17 @@ function ret = tbx_generate_pofile(tbx_name, tbx_path)
     xmlFiles = getFilesList("etc", EXTENSIONS_XML);
 
     if size(xmlFiles, "*") > 0 then
-        xmlTmpFile = TMPDIR + "/tmpLoc.xml";
+        xmlTmpFile = fullpath(TMPDIR + "/tmpLoc.xml");
         srcFiles = [srcFiles; xmlTmpFile];
         xmlFake = mopen(xmlTmpFile, "w");
+        search = "\(\s*(.*)\s*,\s*(.*)\s*\)\""/";
+        replace = "xmlgettext(""\1"", ""\2"")";
         for i = 1:size(xmlFiles, "*")
             content = mgetl(xmlFiles(i));
-            newLine = sedLoc(content, "/\""_d\(\s*(.*)\s*,\s*(.*)\s*\)\""/", "xmlgettext(""\1"", ""\2"")");// "_d(xxx,xxx)"
-            newLine = sedLoc(newLine, "/\""dgettext\(\s*(.*)\s*,\s*(.*)\s*\)\""/", "xmlgettext(""\1"", ""\2"")");
+            newLine = sedLoc(content, "/\""_d"+search, replace);// "_d(xxx,xxx)"
+            newLine = sedLoc(newLine, "/\""dgettext"+search, replace);
+            newLine = sedLoc(newLine, "/\""gettext"+search, replace);
+            newLine = sedLoc(newLine, "/\""_"+search, replace);
             mputl(newLine, xmlFake);
         end
         mclose(xmlFake);
@@ -97,7 +103,6 @@ function ret = tbx_generate_pofile(tbx_name, tbx_path)
     srcFiles = strcat(srcFiles, " ");
     cmd = XGETTEXT + XGETTEXT_OPTIONS + " -d " + tbx_name + " " + srcFiles + " -p " + TARGETDIR + " -o " + "en_US.po.tmp";
     host(cmd);
-
     if exists("xmlTmpFile") then
         deletefile(xmlTmpFile);
     end
@@ -120,6 +125,15 @@ function ret = tbx_generate_pofile(tbx_name, tbx_path)
 
     poFile = mgetl(TARGETDIR + "/en_US.po.tmp");
     poFile = [header ; poFile];
+
+    // Translating '' coming from Scilab into '
+    poFile = strsubst(poFile, "''''", "''");
+
+    // Making location paths relative to the toolbox root
+    poFile = strsubst(poFile, "#: "+fullpath(tbx_path), "#: ~");
+    poFile = strsubst(poFile, "#: "+xmlTmpFile, "#: a XML file");
+
+    // Building the final file
     mputl(poFile, TARGETDIR + "/en_US.po");
     deletefile(TARGETDIR + "/en_US.po.tmp");
 
@@ -191,4 +205,3 @@ function ret = getFilesList(folder, mask)
 
     cd(old);
 endfunction
-
diff --git a/scilab/modules/modules_manager/tests/nonreg_tests/bug_13796.tst b/scilab/modules/modules_manager/tests/nonreg_tests/bug_13796.tst
new file mode 100644 (file)
index 0000000..893455c
--- /dev/null
@@ -0,0 +1,39 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// <-- Non-regression test for bug 13796 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13796
+//
+// <-- Short Description -->
+// tbx_generate_pofile()
+//  - missed _() and _gettext() references.
+//  - yielded #: comments with absolute location paths instead of relative
+//    to the module root
+//  - wrapped long lines even when they should not be so
+
+path = TMPDIR+"/bug_13796";
+copyfile(SCI+"/contrib/toolbox_skeleton", path);
+mdelete(path+"/locales/*");
+tbx_generate_pofile(path);
+
+// Checking existence of the po file:
+assert_checktrue(isfile(path+"/locales/en_US.po"));
+
+// Checking some content:
+f = mgetl(path+"/locales/en_US.po");
+assert_checktrue(grep(f, pathconvert("#: ~\sci_gateway\cpp\sci_cpperror.cpp:23",%f))~=[]);
+assert_checktrue(grep(f, "msgid ""%s: I''m waiting for only one argument.\n""")~=[]);
+assert_checktrue(grep(f, "#: a XML file:5")~=[]);
+assert_checktrue(grep(f, "msgid ""Height""")~=[]);
+
+// Cleaning
+rmdir(path,"s");