It struck me that there is no way to have strings in skins be
translated, which I tihnk would suck for any non english speakers
(considering almost all the themes on the site are english)...

So, attached is the patch I'm thinking about committing to fix this..

It adds a new token to the skins which takes the english string (must
be exactly as in english.lang) and will display it in whatever
language the user uses..

%Sx|Now Playing|  will display "Now Playing" in whatever language is
set.... cool aye?

UNFORTUNATELY... I cant check this in yet...

I need a Makefile guru to fix checkwps because it now relies on
english.lang being parsed and the 4 autogenerated lang files being
available.
So, if you know black magic/voodoo give us a hand and this can go in...

Jonathan
Index: tools/checkwps/SOURCES
===================================================================
--- tools/checkwps/SOURCES	(revision 22826)
+++ tools/checkwps/SOURCES	(working copy)
@@ -2,6 +2,7 @@
 ../../apps/gui/skin_engine/skin_parser.c
 ../../apps/gui/skin_engine/skin_buffer.c
 ../../apps/misc.c
+../../apps/language.c
 ../../firmware/common/strlcpy.c
 checkwps.c
 
Index: apps/language.c
===================================================================
--- apps/language.c	(revision 22826)
+++ apps/language.c	(working copy)
@@ -98,3 +98,16 @@
     close(fd);
     return retcode;
 }
+
+int lang_english_to_id(const char* english)
+{
+    int i;
+    unsigned char *ptr = (unsigned char *) language_builtin;
+    
+    for (i = 0; i < LANG_LAST_INDEX_IN_ARRAY; i++) {
+        if (!strcmp(ptr, english))
+            return i;
+        ptr += strlen((char *)ptr) + 1; /* advance pointer to next string */
+    }
+    return -1;
+}
Index: apps/language.h
===================================================================
--- apps/language.h	(revision 22826)
+++ apps/language.h	(working copy)
@@ -27,4 +27,7 @@
 /* load a given language file */
 int lang_load(const char *filename);
 
+/* get the ID of an english string so it can be localised */
+int lang_english_to_id(const char* english);
+
 #endif
Index: apps/gui/skin_engine/wps_debug.c
===================================================================
--- apps/gui/skin_engine/wps_debug.c	(revision 22826)
+++ apps/gui/skin_engine/wps_debug.c	(working copy)
@@ -76,6 +76,9 @@
             snprintf(buf, bufsize, "String '%s'",
                      (char*)token->value.data);
             break;
+        case WPS_TOKEN_TRANSLATEDSTRING:
+            snprintf(buf, bufsize, "String ID '%d'", token->value.i);
+            break;
 
 #ifdef HAVE_LCD_BITMAP
         case WPS_TOKEN_ALIGN_LEFT:
Index: apps/gui/skin_engine/skin_parser.c
===================================================================
--- apps/gui/skin_engine/skin_parser.c	(revision 22826)
+++ apps/gui/skin_engine/skin_parser.c	(working copy)
@@ -27,6 +27,7 @@
 #include "misc.h"
 #include "plugin.h"
 #include "viewport.h"
+#include "language.h"
 
 #ifdef __PCTOOL__
 #ifdef WPSEDITOR
@@ -132,7 +133,7 @@
         struct wps_token *token, struct wps_data *wps_data);
 static int parse_dir_level(const char *wps_bufptr,
         struct wps_token *token, struct wps_data *wps_data);
-static int parse_setting(const char *wps_bufptr,
+static int parse_setting_and_lang(const char *wps_bufptr,
         struct wps_token *token, struct wps_data *wps_data);
 
 #ifdef HAVE_LCD_BITMAP
@@ -349,8 +350,11 @@
 #endif
 #endif
 
-    { WPS_TOKEN_SETTING,                  "St",  WPS_REFRESH_DYNAMIC, parse_setting },
-
+    { WPS_TOKEN_SETTING,                  "St",  WPS_REFRESH_DYNAMIC,
+                                                    parse_setting_and_lang },    
+    { WPS_TOKEN_TRANSLATEDSTRING,         "Sx",  WPS_REFRESH_STATIC,
+                                                    parse_setting_and_lang },
+                                                    
     { WPS_TOKEN_LASTTOUCH,                "Tl",  WPS_REFRESH_DYNAMIC, parse_timeout },
     { WPS_NO_TOKEN,                       "T",   0,    parse_touchregion      },
 
@@ -746,14 +750,15 @@
 
 #endif /* HAVE_LCD_BITMAP */
 
-static int parse_setting(const char *wps_bufptr,
-                         struct wps_token *token,
-                         struct wps_data *wps_data)
+static int parse_setting_and_lang(const char *wps_bufptr,
+                                 struct wps_token *token,
+                                 struct wps_data *wps_data)
 {
     (void)wps_data;
     const char *ptr = wps_bufptr;
     const char *end;
     int i;
+    char temp[64];
 
     /* Find the setting's cfg_name */
     if (*ptr != '|')
@@ -762,17 +767,26 @@
     end = strchr(ptr,'|');
     if (!end)
         return WPS_ERROR_INVALID_PARAM;
-
-    /* Find the setting */
-    for (i=0; i<nb_settings; i++)
-        if (settings[i].cfg_name &&
-            !strncmp(settings[i].cfg_name,ptr,end-ptr) &&
-            /* prevent matches on cfg_name prefixes */
-            strlen(settings[i].cfg_name)==(size_t)(end-ptr))
-            break;
-    if (i == nb_settings)
-        return WPS_ERROR_INVALID_PARAM;
-
+    strlcpy(temp, ptr,end-ptr+1);
+    
+    if (token->type == WPS_TOKEN_TRANSLATEDSTRING)
+    {
+        i = lang_english_to_id(temp);
+        if (i < 0)
+            return WPS_ERROR_INVALID_PARAM;
+    }
+    else
+    {
+        /* Find the setting */
+        for (i=0; i<nb_settings; i++)
+            if (settings[i].cfg_name &&
+                !strncmp(settings[i].cfg_name,ptr,end-ptr) &&
+                /* prevent matches on cfg_name prefixes */
+                strlen(settings[i].cfg_name)==(size_t)(end-ptr))
+                break;
+        if (i == nb_settings)
+            return WPS_ERROR_INVALID_PARAM;
+    }
     /* Store the setting number */
     token->value.i = i;
 
Index: apps/gui/skin_engine/skin_tokens.c
===================================================================
--- apps/gui/skin_engine/skin_tokens.c	(revision 22826)
+++ apps/gui/skin_engine/skin_tokens.c	(working copy)
@@ -170,6 +170,9 @@
 
         case WPS_TOKEN_STRING:
             return (char*)token->value.data;
+            
+        case WPS_TOKEN_TRANSLATEDSTRING:
+            return (char*)P2STR(ID2P(token->value.i));
 
         case WPS_TOKEN_TRACK_TIME_ELAPSED:
             format_time(buf, buf_size,
Index: apps/gui/skin_engine/skin_tokens.h
===================================================================
--- apps/gui/skin_engine/skin_tokens.h	(revision 22826)
+++ apps/gui/skin_engine/skin_tokens.h	(working copy)
@@ -32,6 +32,7 @@
     /* Markers */
     WPS_TOKEN_CHARACTER,
     WPS_TOKEN_STRING,
+    WPS_TOKEN_TRANSLATEDSTRING,
 
     /* Alignment */
     WPS_TOKEN_ALIGN_LEFT,

Reply via email to