All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: gettext in scripts
Date: Fri, 10 Feb 2012 23:54:07 +0100	[thread overview]
Message-ID: <4F35A00F.2010209@gmail.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1543 bytes --]

Hello, all. It was requested to have a way to gettextize Super GRUB 
disk. Original request was to extend gettext with -s options but it may 
result in a mess to temporary variables. So I'd propose to rather use 
$"..." syntax with the exception that we don't expand it after 
translation to avoid some pitfalls. Sharing syntax with bash will allow 
to use normal xgettext --language=Shell.
The real problem is as to how to include SGD strings in grub.pot. I see 
following solutions:
1) Merge projects and put SGD inside GRUB2. It's possible if its authors 
want it but many more questions would need to be discussed.
2) Import sgd.pot into grub.pot regularly. This creates an 
administrative overhead and requires GRUB and scripts to have matching 
versions. I don't know if it's easy to merge .pot files
3) Just have a few strings for usage by external projects. This would 
heavily limit the extent of internationalisation and would result in a 
lot of feature requests one after another for this or that string.
4) Have some way to load .mo from another directory. Perhaps something 
like locale_dirs=$dir1:$dir2:$dir3. This creates some problems as to how 
and when to load files and how to store them. The easiest way consisting 
of having multiple opened gettext files and try each of it in turn. 
Trouble is that then when adding a single directory we need to either 
reload all files or compare the previous list with current to reload 
only changed directories.
Any other ideas?

-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko


[-- Attachment #2: gettext.diff --]
[-- Type: text/x-diff, Size: 3371 bytes --]

=== modified file 'grub-core/script/execute.c'
--- grub-core/script/execute.c	2012-02-04 11:21:21 +0000
+++ grub-core/script/execute.c	2012-02-10 22:24:15 +0000
@@ -26,6 +26,7 @@
 #include <grub/lib/arg.h>
 #include <grub/normal.h>
 #include <grub/extcmd.h>
+#include <grub/i18n.h>
 
 /* Max digits for a char is 3 (0xFF is 255), similarly for an int it
    is sizeof (int) * 3, and one extra for a possible -ve sign.  */
@@ -312,8 +313,8 @@
   struct grub_script_arg *arg = 0;
   struct grub_script_argv result = { 0, 0, 0 };
 
-  auto int append (char *s, int escape_type);
-  int append (char *s, int escape_type)
+  auto int append (const char *s, int escape_type);
+  int append (const char *s, int escape_type)
   {
     int r;
     char *p = 0;
@@ -379,12 +380,20 @@
 	      break;
 
 	    case GRUB_SCRIPT_ARG_TYPE_TEXT:
-	      if (grub_strlen (arg->str) &&
+	      if (arg->str[0] &&
 		  grub_script_argv_append (&result, arg->str,
 					   grub_strlen (arg->str)))
 		goto fail;
 	      break;
 
+	    case GRUB_SCRIPT_ARG_TYPE_GETTEXT:
+	      {
+		const char *t = _(arg->str);
+		if (grub_script_argv_append (&result, t, grub_strlen (t)))
+		  goto fail;
+	      }
+	      break;
+
 	    case GRUB_SCRIPT_ARG_TYPE_DQSTR:
 	    case GRUB_SCRIPT_ARG_TYPE_SQSTR:
 	      if (append (arg->str, 1))

=== modified file 'grub-core/script/yylex.l'
--- grub-core/script/yylex.l	2012-02-03 10:56:49 +0000
+++ grub-core/script/yylex.l	2012-02-10 22:20:27 +0000
@@ -131,15 +131,17 @@
 SQCHR           [^\']
 DQCHR           {ESC}|[^\\\"]
 DQSTR           \"{DQCHR}*\"
+I18NSTR         \$\"{DQCHR}*\"
 SQSTR           \'{SQCHR}*\'
 SPECIAL         \?|\#|\*|\@
 VARIABLE        ${NAME}|$\{{NAME}\}|${DIGITS}|$\{{DIGITS}\}|${SPECIAL}|$\{{SPECIAL}\}
-WORD            ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE})+
+WORD            ({CHAR}|{DQSTR}|{SQSTR}|{ESC}|{VARIABLE}|{I18NSTR})+
 
 MULTILINE       {WORD}?((\"{DQCHR}*)|(\'{SQCHR}*)|(\\\n))
 
 %x              SPLIT
 %x              DQUOTE
+%x              I18NQUOTE
 %x              SQUOTE
 %x              VAR
 
@@ -215,6 +217,10 @@
                   yy_push_state (SQUOTE, yyscanner);
                   ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
                 }
+  "\$\""        {
+                  yy_push_state (I18NQUOTE, yyscanner);
+                  ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT);
+                }
   \$            {
                   yy_push_state (VAR, yyscanner);
                   ARG (GRUB_SCRIPT_ARG_TYPE_TEXT);
@@ -280,6 +286,18 @@
   (.|\n)        { COPY (yytext, yyleng); }
 }
 
+<I18NQUOTE>{
+  \\\\          { COPY ("\\", 1); }
+  \\\"          { COPY ("\"", 1); }
+  \\\n          { /* ignore */ }
+  [^\"\\\n]+    { COPY (yytext, yyleng); }
+  \"            {
+                  yy_pop_state (yyscanner);
+                  ARG (GRUB_SCRIPT_ARG_TYPE_GETTEXT);
+                }
+  (.|\n)        { COPY (yytext, yyleng); }
+}
+
 <<EOF>>         {
                   yypop_buffer_state (yyscanner);
 		  yyextra->lexerstate->eof = 1;

=== modified file 'include/grub/script_sh.h'
--- include/grub/script_sh.h	2011-11-11 19:34:37 +0000
+++ include/grub/script_sh.h	2012-02-10 20:30:33 +0000
@@ -53,6 +53,7 @@
 {
   GRUB_SCRIPT_ARG_TYPE_VAR,
   GRUB_SCRIPT_ARG_TYPE_TEXT,
+  GRUB_SCRIPT_ARG_TYPE_GETTEXT,
   GRUB_SCRIPT_ARG_TYPE_DQVAR,
   GRUB_SCRIPT_ARG_TYPE_DQSTR,
   GRUB_SCRIPT_ARG_TYPE_SQSTR,


             reply	other threads:[~2012-02-10 22:54 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-10 22:54 Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2012-02-11  0:21 ` gettext in scripts Andreas Born
2012-03-10 22:25   ` Vladimir 'φ-coder/phcoder' Serbinenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F35A00F.2010209@gmail.com \
    --to=phcoder@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.