[vdr] [patch] load i18n versions of commands/reccmds.conf

Lucian Muresan lucianm at users.sourceforge.net
Mon Nov 14 14:22:39 CET 2005


Hi,

I'd like to propose a patch for further i18n of VDR, namely in the
commands.conf and reccmds.conf files. Even if any user can customize
these files to his whishes (and language), I think that it is more
consistent from the VDR user interface point of view if the commands
defined there also change their language on the OSD, according to the
OSD language setting.
All that the user has to do, is to provide, additionally to the "normal"
files commands.conf and reccmds.conf, the version(s) in the language(s)
he want's to use as commands.conf.xyz and reccmds.conf.xyz, where ".xyz"
is the 3-characters language code defined in VDR's i18n.c:

  // The 3-letter names of the language...
  { "eng,dos",
    "deu,ger",
    "slv,slo",
    "ita",
    "dut,nla,nld",
    "por",
    "fra,fre",
    "nor",
    "fin,smi",
    "pol",
    "esl,spa",
    "ell,gre",
    "sve,swe",
    "rom,rum",
    "hun",
    "cat,cln",
    "rus",
    "hrv",
    "est",
    "dan",
  },

Important notes:
- There is *no problem* if VDR does not find such translated command
files at startup or at OSD language switching on the fly, it will always
fall back to the default and if those are missing, as you  already know,
it's not a big deal either, so the behaviour doesn't change (except that
there is a syslog message if such a customized file hasn't been found,
just to inform users who are reading the logs, that *they could have*
multiple command file versions according to configured OSD language, for
english setups it#s absolutely silent as before);
- this will only work with the *first* name for languages where multiple
3-letter names are defined;
- As english is all over in VDR's source code specially treated, this
makes no exception here, so it's indeed treated specially: english files
need *no* such 3-letter extension, and are *only* loaded in their
default form.

Have phun,
Lucian
-------------- next part --------------
diff -Naur vdr-1.3.36_orig/config.c vdr-1.3.36/config.c
--- vdr-1.3.36_orig/config.c	2005-09-09 17:08:59.000000000 +0200
+++ vdr-1.3.36/config.c	2005-11-14 13:19:45.010000000 +0100
@@ -16,6 +16,8 @@
 #include "plugin.h"
 #include "recording.h"
 
+const char *ConfigDirectory = NULL;
+
 // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
 // format characters in order to allow any number of blanks after a numeric
 // value!
@@ -535,3 +537,31 @@
      }
   return false;
 }
+
+bool LoadCommandsI18n(cCommands & cmds, const char *FileName, bool AllowComments, bool MustExist)
+{
+    bool bRet = true;
+    bool bLoadDefault = (Setup.OSDLanguage == 0);
+    if (!bLoadDefault) {
+	// attempt to load a translated file
+	char LangCode[4];
+	strncpy(LangCode, I18nLanguageCode(Setup.OSDLanguage), 3);
+	LangCode[3] = '\0';
+	char *FullPath = NULL;
+	asprintf(&FullPath, "%s/%s.%s", ConfigDirectory && *ConfigDirectory ? ConfigDirectory : ".", FileName, LangCode);
+
+	if (!cmds.Load((FullPath), AllowComments, true)) { // require to exist, just to be able to log
+	    // fallback
+	    bLoadDefault = true;
+	    esyslog("Failed to load translated '%s.%s' for language %d (%s)", FileName, LangCode, Setup.OSDLanguage, I18nLanguages()[Setup.OSDLanguage]);
+	    esyslog("Falling back to default '%s' (if any)", FileName);
+	}
+	free(FullPath);
+    }
+    if (bLoadDefault) {
+	// let's do it the normal way
+	bRet = cmds.Load(AddDirectory(ConfigDirectory, FileName), AllowComments, MustExist);
+    }
+    // return status only for the default commands file
+    return bRet;
+}
diff -Naur vdr-1.3.36_orig/config.h vdr-1.3.36/config.h
--- vdr-1.3.36_orig/config.h	2005-11-04 16:55:05.000000000 +0100
+++ vdr-1.3.36/config.h	2005-11-14 13:16:13.170000000 +0100
@@ -34,6 +34,8 @@
 #define MaxSkinName 16
 #define MaxThemeName 16
 
+extern const char *ConfigDirectory;
+
 class cCommand : public cListObject {
 private:
   char *title;
@@ -265,4 +267,6 @@
 
 extern cSetup Setup;
 
+bool LoadCommandsI18n(cCommands & cmds, const char *FileName = NULL, bool AllowComments = false, bool MustExist = false);
+
 #endif //__CONFIG_H
diff -Naur vdr-1.3.36_orig/menu.c vdr-1.3.36/menu.c
--- vdr-1.3.36_orig/menu.c	2005-11-05 18:29:22.000000000 +0100
+++ vdr-1.3.36/menu.c	2005-11-14 13:21:47.450000000 +0100
@@ -1910,6 +1910,10 @@
      Setup.OSDLanguage = data.OSDLanguage;
      cFont::SetCode(I18nCharSets()[Setup.OSDLanguage]);
 
+     // try to load translated command files if available, otherwise fallback to defaults
+     LoadCommandsI18n(Commands, "commands.conf", true);
+     LoadCommandsI18n(RecordingCommands, "reccmds.conf", true);
+
      cSkin *Skin = Skins.Get(skinIndex);
      if (Skin) {
         char *d = themes.NumThemes() ? strdup(themes.Descriptions()[themeIndex]) : NULL;
diff -Naur vdr-1.3.36_orig/vdr.c vdr-1.3.36/vdr.c
--- vdr-1.3.36_orig/vdr.c	2005-11-04 14:48:39.000000000 +0100
+++ vdr-1.3.36/vdr.c	2005-11-14 13:21:32.700000000 +0100
@@ -109,7 +109,6 @@
 
   int SVDRPport = DEFAULTSVDRPPORT;
   const char *AudioCommand = NULL;
-  const char *ConfigDirectory = NULL;
   const char *EpgDataFileName = DEFAULTEPGDATAFILENAME;
   bool DisplayHelp = false;
   bool DisplayVersion = false;
@@ -420,8 +419,9 @@
         Diseqcs.Load(AddDirectory(ConfigDirectory, "diseqc.conf"), true, Setup.DiSEqC) &&
         Channels.Load(AddDirectory(ConfigDirectory, "channels.conf"), false, true) &&
         Timers.Load(AddDirectory(ConfigDirectory, "timers.conf")) &&
-        Commands.Load(AddDirectory(ConfigDirectory, "commands.conf"), true) &&
-        RecordingCommands.Load(AddDirectory(ConfigDirectory, "reccmds.conf"), true) &&
+        // try to load translated command files if available, otherwise fallback to defaults
+        LoadCommandsI18n(Commands, "commands.conf", true) &&
+        LoadCommandsI18n(RecordingCommands, "reccmds.conf", true) &&
         SVDRPhosts.Load(AddDirectory(ConfigDirectory, "svdrphosts.conf"), true) &&
         CaDefinitions.Load(AddDirectory(ConfigDirectory, "ca.conf"), true) &&
         Keys.Load(AddDirectory(ConfigDirectory, "remote.conf")) &&


More information about the vdr mailing list