1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Switched I18N to gettext

This commit is contained in:
Klaus Schmidinger 2007-08-11 12:39:06 +02:00
parent 5b8fe34a0e
commit 0f7a4af168
75 changed files with 28365 additions and 7349 deletions

View File

@ -1520,6 +1520,7 @@ Lucian Muresan <lucianm@users.sourceforge.net>
for making VDR actually use the iso8859-15 fonts for making VDR actually use the iso8859-15 fonts
for suggesting to make the function ExchangeChars() for suggesting to make the function ExchangeChars()
for reporting duplicate texts in i18n.c for reporting duplicate texts in i18n.c
for suggesting to use 'gettext' for internationalization
Mattias Grönlund <Mattias@Gronlund.net> Mattias Grönlund <Mattias@Gronlund.net>
for pointing out a missing cleanup at program exit in case there is a problem for pointing out a missing cleanup at program exit in case there is a problem

18
HISTORY
View File

@ -5299,7 +5299,7 @@ Video Disk Recorder Revision History
- Added a missing 'P' to vdr.c's SHUTDOWNCANCELROMPT macro (reported by Marco - Added a missing 'P' to vdr.c's SHUTDOWNCANCELROMPT macro (reported by Marco
Schlüßler). Schlüßler).
2007-07-28: Version 1.5.7 2007-08-11: Version 1.5.7
- All logging now goes to LOG_ERR, because some systems split error, info and - All logging now goes to LOG_ERR, because some systems split error, info and
debug messages into separate files, which repeatedly caused extra efforts to debug messages into separate files, which repeatedly caused extra efforts to
@ -5310,3 +5310,19 @@ Video Disk Recorder Revision History
(thanks to Marco Schlüßler). (thanks to Marco Schlüßler).
- Fixed a bug I introduced when simplifying the original patch for detecting - Fixed a bug I introduced when simplifying the original patch for detecting
Premiere NVOD channel links (crash reported by Malte Schröder). Premiere NVOD channel links (crash reported by Malte Schröder).
- Internationalization is now done with 'gettext' (following a suggestion by
Lucian Muresan). Plugin authors may want to use the Perl script
'i18n-to-gettext.pl' to convert their internationalized texts to the gettext
format (see the instructions inside that script file). The function
cPlugin::RegisterI18n() is still present for compatibility, but doesn't
have any more functionality. So plugins that don't convert their texts to
the gettext format will only present English texts.
See PLUGINS.html, section "Internationalization", for instructions on how
to make strings in arrays translatable.
See README.i18n for information on how to create new or maintain existing
translations.
- The 'newplugin' script has been extended to generate the Makefile section
for i18n support.
- The parameter OSDLanguage in 'setup.conf' is now a string and holds the locale
code of the selcted OSD language (e.g. en_US). Therefore, when you first run
this version of VDR you may have to select your desired OSD language again.

View File

@ -24,6 +24,7 @@ You will also need to install the following libraries, as well as their
fontconfig fontconfig
freetype2 freetype2
gettext
libcap libcap
libjpeg libjpeg

View File

@ -6,7 +6,7 @@
# See the main source file 'vdr.c' for copyright information and # See the main source file 'vdr.c' for copyright information and
# how to reach the author. # how to reach the author.
# #
# $Id: Make.config.template 1.10 2006/06/15 09:15:25 kls Exp $ # $Id: Make.config.template 1.11 2007/08/11 10:50:44 kls Exp $
### The C compiler and options: ### The C compiler and options:
@ -26,6 +26,7 @@ endif
#DVBDIR = /usr/src/v4l-dvb/linux #DVBDIR = /usr/src/v4l-dvb/linux
MANDIR = /usr/local/man MANDIR = /usr/local/man
BINDIR = /usr/local/bin BINDIR = /usr/local/bin
LOCDIR = /usr/share/vdr/locale
PLUGINDIR= ./PLUGINS PLUGINDIR= ./PLUGINS
PLUGINLIBDIR= $(PLUGINDIR)/lib PLUGINLIBDIR= $(PLUGINDIR)/lib

View File

@ -4,7 +4,7 @@
# See the main source file 'vdr.c' for copyright information and # See the main source file 'vdr.c' for copyright information and
# how to reach the author. # how to reach the author.
# #
# $Id: Makefile 1.101 2007/06/16 10:48:59 kls Exp $ # $Id: Makefile 1.102 2007/08/11 12:26:12 kls Exp $
.DELETE_ON_ERROR: .DELETE_ON_ERROR:
@ -17,6 +17,7 @@ CXXFLAGS ?= -g -O2 -Wall -Woverloaded-virtual
LSIDIR = ./libsi LSIDIR = ./libsi
MANDIR = /usr/local/man MANDIR = /usr/local/man
BINDIR = /usr/local/bin BINDIR = /usr/local/bin
LOCDIR = /usr/share/vdr/locale
LIBS = -ljpeg -lpthread -ldl -lcap -lfreetype -lfontconfig LIBS = -ljpeg -lpthread -ldl -lcap -lfreetype -lfontconfig
INCLUDES = -I/usr/include/freetype2 INCLUDES = -I/usr/include/freetype2
@ -58,6 +59,7 @@ DEFINES += -D_GNU_SOURCE
DEFINES += -DVIDEODIR=\"$(VIDEODIR)\" DEFINES += -DVIDEODIR=\"$(VIDEODIR)\"
DEFINES += -DPLUGINDIR=\"$(PLUGINLIBDIR)\" DEFINES += -DPLUGINDIR=\"$(PLUGINLIBDIR)\"
DEFINES += -DLOCDIR=\"$(LOCDIR)\"
# The version numbers of VDR and the plugin API (taken from VDR's "config.h"): # The version numbers of VDR and the plugin API (taken from VDR's "config.h"):
@ -69,7 +71,7 @@ ifdef VFAT
DEFINES += -DVFAT DEFINES += -DVFAT
endif endif
all: vdr all: vdr i18n
# Implicit rules: # Implicit rules:
@ -95,6 +97,35 @@ vdr: $(OBJS) $(SILIB)
$(SILIB): $(SILIB):
$(MAKE) -C $(LSIDIR) all $(MAKE) -C $(LSIDIR) all
# Internationalization (I18N):
PODIR = po
LOCALEDIR = locale
I18Npo = $(wildcard $(PODIR)/*.po)
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
I18Ndirs = $(notdir $(foreach file, $(I18Npo), $(basename $(file))))
I18Npot = $(PODIR)/vdr.pot
%.mo: %.po
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
$(I18Npo): $(I18Npot)
msgmerge -U --no-wrap -F --backup=none -q $@ $<
i18n: $(I18Nmo)
@mkdir -p $(LOCALEDIR)
for i in $(I18Ndirs); do\
mkdir -p $(LOCALEDIR)/$$i/LC_MESSAGES;\
cp $(PODIR)/$$i.mo $(LOCALEDIR)/$$i/LC_MESSAGES/vdr.mo;\
done
install-i18n:
@mkdir -p $(LOCDIR)
@(cd $(LOCALEDIR); cp -r --parents * $(LOCDIR))
# The 'include' directory (for plugins): # The 'include' directory (for plugins):
include-dir: include-dir:
@ -169,6 +200,7 @@ srcdoc:
clean: clean:
$(MAKE) -C $(LSIDIR) clean $(MAKE) -C $(LSIDIR) clean
-rm -f $(OBJS) $(DEPFILE) vdr core* *~ -rm -f $(OBJS) $(DEPFILE) vdr core* *~
-rm -rf $(LOCALEDIR) $(PODIR)/*.mo $(PODIR)/*.pot
-rm -rf include -rm -rf include
-rm -rf srcdoc -rm -rf srcdoc
CLEAN: clean CLEAN: clean

View File

@ -14,15 +14,18 @@ Copyright &copy; 2006 Klaus Schmidinger<br>
<a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a> <a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a>
</center> </center>
<p> <p>
<!--X1.5.0--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%> <!--X1.5.0--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.5.0 are marked like this. Important modifications introduced in version 1.5.0 are marked like this.
<!--X1.5.0--></td></tr></table> <!--X1.5.0--></td></tr></table>
<!--X1.5.1--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%> <!--X1.5.1--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.5.1 are marked like this. Important modifications introduced in version 1.5.1 are marked like this.
<!--X1.5.1--></td></tr></table> <!--X1.5.1--></td></tr></table>
<!--X1.5.3--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%> <!--X1.5.3--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.5.3 are marked like this. Important modifications introduced in version 1.5.3 are marked like this.
<!--X1.5.3--></td></tr></table> <!--X1.5.3--></td></tr></table>
<!--X1.5.7--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%>
Important modifications introduced in version 1.5.7 are marked like this.
<!--X1.5.7--></td></tr></table>
<p> <p>
VDR provides an easy to use plugin interface that allows additional functionality VDR provides an easy to use plugin interface that allows additional functionality
to be added to the program by implementing a dynamically loadable library file. to be added to the program by implementing a dynamically loadable library file.
@ -61,7 +64,7 @@ structures and allows it to hook itself into specific areas to perform special a
<li><a href="#Housekeeping">Housekeeping</a> <li><a href="#Housekeeping">Housekeeping</a>
<li><a href="#Main thread hook">Main thread hook</a> <li><a href="#Main thread hook">Main thread hook</a>
<li><a href="#Activity">Activity</a> <li><a href="#Activity">Activity</a>
<!--X1.5.1--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%> <!--X1.5.1--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
<li><a href="#Wakeup">Wakeup</a> <li><a href="#Wakeup">Wakeup</a>
<!--X1.5.1--></td></tr></table> <!--X1.5.1--></td></tr></table>
<li><a href="#Setup parameters">Setup parameters</a> <li><a href="#Setup parameters">Setup parameters</a>
@ -85,7 +88,7 @@ structures and allows it to hook itself into specific areas to perform special a
<li><a href="#Devices">Devices</a> <li><a href="#Devices">Devices</a>
<li><a href="#Audio">Audio</a> <li><a href="#Audio">Audio</a>
<li><a href="#Remote Control">Remote Control</a> <li><a href="#Remote Control">Remote Control</a>
<!--X1.5.0--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%> <!--X1.5.0--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
<li><a href="#Conditional Access">Conditional Access</a> <li><a href="#Conditional Access">Conditional Access</a>
<!--X1.5.0--></td></tr></table> <!--X1.5.0--></td></tr></table>
</ul> </ul>
@ -684,7 +687,7 @@ be queried, and further prompts may show up. If all prompts have been confirmed,
the shutdown will take place. As soon as one prompt is not confirmed, no the shutdown will take place. As soon as one prompt is not confirmed, no
further plugins will be queried and no shutdown will be done. further plugins will be queried and no shutdown will be done.
<!--X1.5.1--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%> <!--X1.5.1--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%>
<a name="Wakeup"><hr><h2>Wakeup</h2> <a name="Wakeup"><hr><h2>Wakeup</h2>
<center><i><b>Wake me up before you go-go</b></i></center><p> <center><i><b>Wake me up before you go-go</b></i></center><p>
@ -909,72 +912,38 @@ const char *MyConfigDir = cPlugin::ConfigDirectory();
<center><i><b>Welcome to Babylon!</b></i></center><p> <center><i><b>Welcome to Babylon!</b></i></center><p>
If a plugin displays texts to the user, it should implement internationalized <!--X1.5.7--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%>
versions of these texts and call the function If a plugin displays texts to the user, it should prepare for internationalization
of these texts. All that is necessary for this is to mark every text that is
<p><table><tr><td bgcolor=#F0F0F0><pre> presented to the user as translatable, as in
void RegisterI18n(const tI18nPhrase * const Phrases);
</pre></td></tr></table><p>
to register them with VDR's internationalization mechanism.
<p>
The call to this function must be done in the <a href="#Getting started"><tt>Initialize()</tt></a>
or <a href="#Getting started"><tt>Start()</tt></a> function of the plugin:
<p><table><tr><td bgcolor=#F0F0F0><pre>
const tI18nPhrase Phrases[] = {
{ "Hello world!",
"Hallo Welt!",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
},
{ NULL }
};
void cPluginHello::Start(void)
{
RegisterI18n(Phrases);
}
</pre></td></tr></table><p>
Each entry of type <tt>tI18nPhrase</tt> must have exactly as many members as defined
by the constant <tt>I18nNumLanguages</tt> in the file <tt>VDR/i18n.h</tt>, and the
sequence of the various languages must be the same as defined in <tt>VDR/i18n.c</tt>.<br>
<b>It is very important that the array is terminated with a <tt>{&nbsp;NULL&nbsp;}</tt>
entry!</b>.
<p>
Usually you won't be able to fill in all the different translations by yourself, so
you may want to contact the maintainers of these languages (listed in the file
<tt>VDR/i18n.c</tt>) and ask them to provide the additional translations.
<p>
The actual runtime selection of the texts corresponding to the selected language
is done by wrapping each internationalized text with the <tt>tr()</tt> macro:
<p><table><tr><td bgcolor=#F0F0F0><pre> <p><table><tr><td bgcolor=#F0F0F0><pre>
const char *s = tr("Hello world!"); const char *s = tr("Hello world!");
</pre></td></tr></table><p> </pre></td></tr></table><p>
The text given here must be the first one defined in the related <i>Phrases</i> The text given here must be the English version, and the returned pointer is either
entry (which is the English version), and the returned pointer is either a translated a translated version (if available) or the original string.
version (if available) or the original string. In the latter case a message will be Texts are first searched for in the domain registered for this plugin (if any)
written to the log file, indicating that a translation is missing.
Texts are first searched for in the <i>Phrases</i> registered for this plugin (if any)
and then in the global VDR texts. So a plugin can make use of texts defined by the and then in the global VDR texts. So a plugin can make use of texts defined by the
core VDR code. core VDR code.
<p> <p>
<!--X1.5.3--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%> Sometimes texts are stored in an array, in which case they need to be marked
differently, using the trNOOP() macro. The actual translation is then done
when such a text is used, as in
<p><table><tr><td bgcolor=#F0F0F0><pre>
const char *Texts = {
trNOOP("First text"),
trNOOP("Second text"),
trNOOP("Third one")
};
for (int i = 0; i &lt; 3; i++)
MyFunc(tr(Texts[i]));
</pre></td></tr></table><p>
<p>
<!--X1.5.3--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
The system VDR is running on may use a character encoding where a single character The system VDR is running on may use a character encoding where a single character
(or <i>symbol</i>) consists of more than one byte (UTF-8, as opposed to, for instance, (or <i>symbol</i>) consists of more than one byte (UTF-8, as opposed to, for instance,
ISO8859-1, where every character is represented by a single byte in memory). ISO8859-1, where every character is represented by a single byte in memory).
@ -986,6 +955,7 @@ and are defined in <tt>VDR/tools.h</tt>.
Most of the time a plugin doesn't need to care about this, but when it comes to Most of the time a plugin doesn't need to care about this, but when it comes to
handling individual characters these functions may come in handy. handling individual characters these functions may come in handy.
<!--X1.5.3--></td></tr></table> <!--X1.5.3--></td></tr></table>
<!--X1.5.7--></td></tr></table>
<a name="Custom services"><hr><h2>Custom services</h2> <a name="Custom services"><hr><h2>Custom services</h2>
@ -1635,7 +1605,7 @@ with the full required resolution. Only if this fails shall it use alternate
areas. Drawing areas are always rectangular and may not overlap (but do not need areas. Drawing areas are always rectangular and may not overlap (but do not need
to be adjacent). to be adjacent).
<p> <p>
<!--X1.5.3--><table width=100%><tr><td bgcolor=#FF0000>&nbsp;</td><td width=100%> <!--X1.5.3--><table width=100%><tr><td bgcolor=#AA0000>&nbsp;</td><td width=100%>
Special consideration may have to be given to color usage if the OSD provides Special consideration may have to be given to color usage if the OSD provides
8bpp (256 colors). In that case, fonts may be drawn using <i>anti-aliasing</i>, 8bpp (256 colors). In that case, fonts may be drawn using <i>anti-aliasing</i>,
which requires several blended color values between the foreground and background which requires several blended color values between the foreground and background
@ -2118,7 +2088,7 @@ Put(uint64 Code, bool Repeat = false, bool Release = false);
The other parameters have the same meaning as in the first version of this function. The other parameters have the same meaning as in the first version of this function.
<!--X1.5.0--><table width=100%><tr><td bgcolor=#00AA00>&nbsp;</td><td width=100%> <!--X1.5.0--><table width=100%><tr><td bgcolor=#0000AA>&nbsp;</td><td width=100%>
<a name="Conditional Access"><hr><h2>Conditional Access</h2> <a name="Conditional Access"><hr><h2>Conditional Access</h2>
<center><i><b>Members only!</b></i></center><p> <center><i><b>Members only!</b></i></center><p>

View File

@ -49,3 +49,7 @@ VDR Plugin 'hello' Revision History
2006-04-22: Version 0.1.1 2006-04-22: Version 0.1.1
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
2007-08-11: Version 0.2.0
- Switched to 'gettext' internationalization.

View File

@ -1,11 +1,13 @@
# #
# Makefile for a Video Disk Recorder plugin # Makefile for a Video Disk Recorder plugin
# #
# $Id: Makefile 1.15 2006/09/09 12:38:35 kls Exp $ # $Id: Makefile 1.16 2007/08/11 10:18:16 kls Exp $
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name. # By default the main source file also carries this name.
# IMPORTANT: the presence of this macro is important for the Make.config
# file. So it must be defined, even if it is not used here!
# #
PLUGIN = hello PLUGIN = hello
@ -45,25 +47,50 @@ DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
### The object files (add further files here): ### The object files (add further files here):
OBJS = $(PLUGIN).o i18n.o OBJS = $(PLUGIN).o
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
# Dependencies: ### Dependencies:
MAKEDEP = g++ -MM -MG MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies DEPFILE = .dependencies
$(DEPFILE): Makefile $(DEPFILE): Makefile
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE) -include $(DEPFILE)
### Internationalization (I18N):
PODIR = po
LOCALEDIR = $(VDRDIR)/locale
I18Npo = $(wildcard $(PODIR)/*.po)
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
I18Ndirs = $(notdir $(foreach file, $(I18Npo), $(basename $(file))))
I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
$(I18Npo): $(I18Npot)
msgmerge -U --no-wrap -F --backup=none -q $@ $<
i18n: $(I18Nmo)
@mkdir -p $(LOCALEDIR)
for i in $(I18Ndirs); do\
mkdir -p $(LOCALEDIR)/$$i/LC_MESSAGES;\
cp $(PODIR)/$$i.mo $(LOCALEDIR)/$$i/LC_MESSAGES/$(PLUGIN).mo;\
done
### Targets: ### Targets:
all: libvdr-$(PLUGIN).so all: libvdr-$(PLUGIN).so i18n
libvdr-$(PLUGIN).so: $(OBJS) libvdr-$(PLUGIN).so: $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ $(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
@ -78,4 +105,5 @@ dist: clean
@echo Distribution package created as $(PACKAGE).tgz @echo Distribution package created as $(PACKAGE).tgz
clean: clean:
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~

View File

@ -3,18 +3,18 @@
* *
* See the README file for copyright information and how to reach the author. * See the README file for copyright information and how to reach the author.
* *
* $Id: hello.c 1.12 2006/04/22 09:31:52 kls Exp $ * $Id: hello.c 1.13 2007/08/11 09:31:17 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
#include <stdlib.h> #include <stdlib.h>
#include <vdr/i18n.h>
#include <vdr/interface.h> #include <vdr/interface.h>
#include <vdr/plugin.h> #include <vdr/plugin.h>
#include "i18n.h"
static const char *VERSION = "0.1.1"; static const char *VERSION = "0.2.0";
static const char *DESCRIPTION = "A friendly greeting"; static const char *DESCRIPTION = trNOOP("A friendly greeting");
static const char *MAINMENUENTRY = "Hello"; static const char *MAINMENUENTRY = trNOOP("Hello");
class cPluginHello : public cPlugin { class cPluginHello : public cPlugin {
private: private:
@ -115,7 +115,6 @@ bool cPluginHello::ProcessArgs(int argc, char *argv[])
bool cPluginHello::Start(void) bool cPluginHello::Start(void)
{ {
// Start any background activities the plugin shall perform. // Start any background activities the plugin shall perform.
RegisterI18n(Phrases);
return true; return true;
} }

View File

@ -1,145 +0,0 @@
/*
* i18n.c: Internationalization
*
* See the README file for copyright information and how to reach the author.
*
* $Id: i18n.c 1.6 2006/04/22 09:30:57 kls Exp $
*/
#include "i18n.h"
const tI18nPhrase Phrases[] = {
{ "Hello",
"Hallo",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Hei",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"¿àØÒÕâ!",
"",// TODO
"",// TODO
"",// TODO
"Ahoj",
},
{ "Hello world!",
"Hallo Welt!",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Hei maailma!",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"·ÔàÐÒáâÒãÙ ÜØà!",
"",// TODO
"",// TODO
"",// TODO
"Ahoj svìte!",
},
{ "Howdy folks!",
"Tach zusammen!",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Mitä kuuluu?",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"ºÐÚ ßÞÖØÒÐÕâÕ?",
"",// TODO
"",// TODO
"",// TODO
"Nazdar vespolek!",
},
{ "A friendly greeting",
"Ein freundlicher Gruß",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Ystävällisin terveisin",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ",
"",// TODO
"",// TODO
"",// TODO
"Pøátelský pozdrav",
},
{ "Greeting time (s)",
"Dauer des Grußes (s)",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Tervehdysaika (s)",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï",
"",// TODO
"",// TODO
"",// TODO
"Èas pozdravu (s)",
},
{ "Use alternate greeting",
"Alternativen Gruß verwenden",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"Käytä vaihtoehtoista tervehdystä",
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"",// TODO
"°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ",
"",// TODO
"",// TODO
"",// TODO
"Pou¾ít alternativní pozdrav",
},
{ NULL }
};

View File

@ -1,16 +0,0 @@
/*
* i18n.h: Internationalization
*
* See the README file for copyright information and how to reach the author.
*
* $Id: i18n.h 1.2 2002/05/11 14:48:16 kls Exp $
*/
#ifndef _I18N__H
#define _I18N__H
#include <vdr/i18n.h>
extern const tI18nPhrase Phrases[];
#endif //_I18N__H

View File

@ -0,0 +1,42 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Marc Rovira Vall <tm05462@salleURL.edu>, 2003
# Ramon Roca <ramon.roca@xcombo.com>, 2003
# Jordi Vilà <jvila@tinet.org>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Vladimír Bárta <vladimir.barta@k2atmitec.cz>, 2006
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr "Pøátelský pozdrav"
#: hello.c:17
msgid "Hello"
msgstr "Ahoj"
#: hello.c:60
msgid "Greeting time (s)"
msgstr "Èas pozdravu (s)"
#: hello.c:61
msgid "Use alternate greeting"
msgstr "Pou¾ít alternativní pozdrav"
#: hello.c:129
msgid "Hello world!"
msgstr "Ahoj svìte!"
#: hello.c:129
msgid "Howdy folks!"
msgstr "Nazdar vespolek!"

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Mogens Elneff <mogens@elneff.dk>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Klaus Schmidinger <kls@cadsoft.de>, 2000
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr "Ein freundlicher Gruß"
#: hello.c:17
msgid "Hello"
msgstr "Hallo"
#: hello.c:60
msgid "Greeting time (s)"
msgstr "Dauer des Grußes (s)"
#: hello.c:61
msgid "Use alternate greeting"
msgstr "Alternativen Gruß verwenden"
#: hello.c:129
msgid "Hello world!"
msgstr "Hallo Welt!"
#: hello.c:129
msgid "Howdy folks!"
msgstr "Tach zusammen!"

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Dimitrios Dimitrakos <mail@dimitrios.de>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-7\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Ruben Nunez Francisco <ruben.nunez@tang-it.com>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Arthur Konovalov <kasjas@hot.ee>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-13\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,43 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Hannu Savolainen <hannu@opensound.com>, 2002
# Jaakko Hyvätti <jaakko@hyvatti.iki.fi>, 2002
# Niko Tarnanen <niko.tarnanen@hut.fi>, 2003
# Rolf Ahrenberg <rahrenbe@cc.hut.fi>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr "Ystävällisin terveisin"
#: hello.c:17
msgid "Hello"
msgstr "Hei"
#: hello.c:60
msgid "Greeting time (s)"
msgstr "Tervehdysaika (s)"
#: hello.c:61
msgid "Use alternate greeting"
msgstr "Käytä vaihtoehtoista tervehdystä"
#: hello.c:129
msgid "Hello world!"
msgstr "Hei maailma!"
#: hello.c:129
msgid "Howdy folks!"
msgstr "Mitä kuuluu?"

View File

@ -0,0 +1,43 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Jean-Claude Repetto <jc@repetto.org>, 2001
# Olivier Jacques <jacquesolivier@hotmail.com>, 2003
# Gregoire Favre <greg@magma.unil.ch>, 2003
# Nicolas Huillard <nhuillard@e-dition.fr>, 2005
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,41 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Drazen Dupor <drazen.dupor@dupor.com>, 2004
# Dino Ravnic <dino.ravnic@fer.hr>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Drazen Dupor <drazen.dupor@dupor.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,41 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Istvan Koenigsberger <istvnko@hotmail.com>, 2002
# Guido Josten <guido.josten@t-online.de>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,42 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Alberto Carraro <bertocar@tin.it>, 2001
# Antonio Ospite <ospite@studenti.unina.it>, 2003
# Sean Carlos <seanc@libero.it>, 2005
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Sean Carlos <seanc@libero.it>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,42 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Arnold Niessen <niessen@iae.nl> <arnold.niessen@philips.com>, 2001
# Hans Dingemans <hans.dingemans@tacticalops.nl>, 2003
# Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>, 2005
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,41 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Jørgen Tvedt <pjtvedt@online.no>, 2001
# Truls Slevigen <truls@slevigen.no>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Michael Rakowski <mrak@gmx.de>, 2002
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Paulo Lopes <pmml@netvita.pt>, 2001
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,41 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Paul Lacatus <paul@campina.iiruc.ro>, 2002
# Lucian Muresan <lucianm@users.sourceforge.net>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Vyacheslav Dikonov <sdiconov@mail.ru>, 2004
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-5\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr "´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ"
#: hello.c:17
msgid "Hello"
msgstr "¿àØÒÕâ!"
#: hello.c:60
msgid "Greeting time (s)"
msgstr "¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï"
#: hello.c:61
msgid "Use alternate greeting"
msgstr "°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ"
#: hello.c:129
msgid "Hello world!"
msgstr "·ÔàÐÒáâÒãÙ ÜØà!"
#: hello.c:129
msgid "Howdy folks!"
msgstr "ºÐÚ ßÞÖØÒÐÕâÕ?"

View File

@ -0,0 +1,41 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Miha Setina <mihasetina@softhome.net>, 2000
# Matjaz Thaler <matjaz.thaler@guest.arnes.si>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,41 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Tomas Prybil <tomas@prybil.se>, 2002
# Jan Ekholm <chakie@infa.abo.fi>, 2003
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

View File

@ -0,0 +1,40 @@
# VDR plugin language source file.
# Copyright (C) 2007 Klaus Schmidinger <kls@cadsoft.de>
# This file is distributed under the same license as the VDR package.
# Oktay Yolgeçen <oktay_73@yahoo.de>, 2007
#
msgid ""
msgstr ""
"Project-Id-Version: VDR 1.5.7\n"
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-9\n"
"Content-Transfer-Encoding: 8bit\n"
#: hello.c:16
msgid "A friendly greeting"
msgstr ""
#: hello.c:17
msgid "Hello"
msgstr ""
#: hello.c:60
msgid "Greeting time (s)"
msgstr ""
#: hello.c:61
msgid "Use alternate greeting"
msgstr ""
#: hello.c:129
msgid "Hello world!"
msgstr ""
#: hello.c:129
msgid "Howdy folks!"
msgstr ""

42
README.i18n Normal file
View File

@ -0,0 +1,42 @@
Video Disk Recorder ('VDR') - Internationalization
--------------------------------------------------
The internationalized texts of VDR and its plugins use the 'gettext'
functionality. This file provides information on how to maintain
these texts. The instructions apply equally to VDR itself or any
plugin.
How to translate to a new language
----------------------------------
- Change into the source directory.
- Do a 'make i18n' to have the current *.pot file created.
- Make sure your locale is set to the language you want to
translate to.
- Change into the 'po' subdirectory and run 'msginit'. This
will create a new *.po file for your language.
- Edit the new *.po file and translate the texts.
You can do this either with your favorite text editor, or
with a specialited tool like POEdit, GTranslator, KBabel
or whatever you have.
How to maintain an existing language file
-----------------------------------------
- Do a 'make i18n' to have the *.po files brought up-to-date
with the texts in the source code.
- Edit the new *.po file and translate the texts.
If you are using a plain text editor, you should search for
empty strings ("") to find new, untranslated texts. Also,
look for the "fuzzy" keyword to find translations that have
been "guessed" from other, similar texts, and make sure they
are correct. After that you may want to remove the "fuzzy"
keyword. Specialized tools for maintaining translation
files may provide particular functions to guide you through
updating translations.
Once you have created or updated a translation file, please
send it to the maintainer of the respective plugin (in case
it belongs to a plugin) or to kls@cadsoft.de (for core VDR
language files).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.c 1.154 2007/06/23 09:42:49 kls Exp $ * $Id: config.c 1.155 2007/08/10 12:58:08 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -214,7 +214,7 @@ cSetup Setup;
cSetup::cSetup(void) cSetup::cSetup(void)
{ {
OSDLanguage = 0; strcpy(OSDLanguage, I18N_DEFAULT_LOCALE);
strcpy(OSDSkin, "sttng"); strcpy(OSDSkin, "sttng");
strcpy(OSDTheme, "default"); strcpy(OSDTheme, "default");
PrimaryDVB = 1; PrimaryDVB = 1;
@ -349,9 +349,9 @@ bool cSetup::Load(const char *FileName)
void cSetup::StoreLanguages(const char *Name, int *Values) void cSetup::StoreLanguages(const char *Name, int *Values)
{ {
char buffer[I18nNumLanguages * 4]; char buffer[I18nLanguages()->Size() * 4];
char *q = buffer; char *q = buffer;
for (int i = 0; i < I18nNumLanguages; i++) { for (int i = 0; i < I18nLanguages()->Size(); i++) {
if (Values[i] < 0) if (Values[i] < 0)
break; break;
const char *s = I18nLanguageCode(Values[i]); const char *s = I18nLanguageCode(Values[i]);
@ -369,7 +369,7 @@ void cSetup::StoreLanguages(const char *Name, int *Values)
bool cSetup::ParseLanguages(const char *Value, int *Values) bool cSetup::ParseLanguages(const char *Value, int *Values)
{ {
int n = 0; int n = 0;
while (Value && *Value && n < I18nNumLanguages) { while (Value && *Value && n < I18nLanguages()->Size()) {
char buffer[4]; char buffer[4];
strn0cpy(buffer, Value, sizeof(buffer)); strn0cpy(buffer, Value, sizeof(buffer));
int i = I18nLanguageIndex(buffer); int i = I18nLanguageIndex(buffer);
@ -384,7 +384,7 @@ bool cSetup::ParseLanguages(const char *Value, int *Values)
bool cSetup::Parse(const char *Name, const char *Value) bool cSetup::Parse(const char *Name, const char *Value)
{ {
if (!strcasecmp(Name, "OSDLanguage")) OSDLanguage = atoi(Value); if (!strcasecmp(Name, "OSDLanguage")) { strn0cpy(OSDLanguage, Value, sizeof(OSDLanguage)); I18nSetLocale(OSDLanguage); }
else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName); else if (!strcasecmp(Name, "OSDSkin")) Utf8Strn0Cpy(OSDSkin, Value, MaxSkinName);
else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName); else if (!strcasecmp(Name, "OSDTheme")) Utf8Strn0Cpy(OSDTheme, Value, MaxThemeName);
else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value); else if (!strcasecmp(Name, "PrimaryDVB")) PrimaryDVB = atoi(Value);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.h 1.295 2007/07/28 09:45:27 kls Exp $ * $Id: config.h 1.296 2007/08/10 13:01:52 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -199,7 +199,7 @@ private:
public: public:
// Also adjust cMenuSetup (menu.c) when adding parameters here! // Also adjust cMenuSetup (menu.c) when adding parameters here!
int __BeginData__; int __BeginData__;
int OSDLanguage; char OSDLanguage[I18N_MAX_LOCALE_LEN];
char OSDSkin[MaxSkinName]; char OSDSkin[MaxSkinName];
char OSDTheme[MaxThemeName]; char OSDTheme[MaxThemeName];
int PrimaryDVB; int PrimaryDVB;
@ -219,8 +219,8 @@ public:
int TimeSource; int TimeSource;
int TimeTransponder; int TimeTransponder;
int MarginStart, MarginStop; int MarginStart, MarginStop;
int AudioLanguages[I18nNumLanguages + 1]; int AudioLanguages[I18N_MAX_LANGUAGES + 1];
int EPGLanguages[I18nNumLanguages + 1]; int EPGLanguages[I18N_MAX_LANGUAGES + 1];
int EPGScanTimeout; int EPGScanTimeout;
int EPGBugfixLevel; int EPGBugfixLevel;
int EPGLinger; int EPGLinger;

328
i18n-to-gettext.pl Executable file
View File

@ -0,0 +1,328 @@
#!/usr/bin/perl -w
# Convert i18n texts to gettext
#
# Extracts all texts from the file i18n.c and creates language
# specific *.po files.
#
# Usage: i18n-to-gettext.pl
#
# See the main source file 'vdr.c' for copyright information and
# how to reach the author.
#
# $Id: i18n-to-gettext.pl 1.1 2007/08/11 10:36:33 kls Exp $
# How to convert an actual plugin:
#
# - If your code contains something like
#
# const char *Text = "Some text";
# ...
# Function(tr(Text));
#
# you need to enclose the text constant in trNOOP(...), as in
#
# const char *Text = trNOOP("Some text");
#
# The actual usage of the tr() macro remains unchanged.
#
# - If you have comments following the texts in your i18n.c file
# that should be seen by the translators, move them from the
# i18n.c file into the file where the text is actually used,
# and mark them with the TRANSLATORS keyword, as in
#
# // TRANSLATORS: note the plural!
# Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), ...
#
# - Fill in your email address in the line
# $MSGIDBUGS = "" ...
# below, so that users can reach you in case there is a problem
# with a message id.
#
# - Run this Perl script from within your plugin's source directory.
# This script will run 'xgettext' to extract all of your texts
# into a file named <pluginname>.pot. After that it will extract
# your existing i18n texts from the file i18n.c (or wherever you
# have defined them) and generate *.po files for all languages
# currently known by VDR.
#
# - Your Makefile will be automatically adjusted to allow for
# building the *.mo files necessary for supporting gettext().
# Please check carefully whether the automatic adjustments have
# succeeded, though.
#
# - You may want to remove the old internationalized texts from your
# source. Usually this means removing the files i18n.[hc], stripping
# i18n.o from the OBJS variable in the Makefile and removing all
# '#include "i18n.h"' lines from the rest of your source files.
# These steps are not done automatically.
# Check for the existence of a Makefile:
die "Makefile not found!" unless (-f "Makefile");
# Determine the plugin name:
$PLUGIN = `grep '^PLUGIN *=' Makefile | head -1` || die "can't find plugin name!";
$PLUGIN =~ s/.*= *(.*)\n/$1/;
die "can't find plugin name!" unless ($PLUGIN);
# Locate the file containing the texts:
$I18NFILE = "";
for ("i18n.c", `ls *.c`) { # try i18n.c explicitly first
chomp($f = $_);
if (-f $f && `grep tI18nPhrase $f`) {
$I18NFILE = $f;
last;
}
}
die "can't find internationalized texts!" unless ($I18NFILE);
# Plugin specific information:
$TITLE = "VDR plugin language source file";
$COPYRIGHT = "2007 Klaus Schmidinger <kls\@cadsoft.de>";
$PACKAGE = "VDR";
$VERSION = "1.5.7";
$MSGIDBUGS = "" || die "enter your email address here"; # escape the '@', as in "user\@domain.tld"
$LANGUAGETEAM = "<vdr\@linuxtv.org>";
# Gettext environment:
$XGETTEXT = "xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='$MSGIDBUGS'";
$PODIR = "po";
$POTFILE = "$PODIR/$PLUGIN.pot";
# Languages as known by VDR 1.5.6:
@LANGS = (
"en_US",
"de_DE",
"sl_SI",
"it_IT",
"nl_NL",
"pt_PT",
"fr_FR",
"nn_NO",
"fi_FI",
"pl_PL",
"es_ES",
"el_GR",
"sv_SE",
"ro_RO",
"hu_HU",
"ca_ES",
"ru_RU",
"hr_HR",
"et_EE",
"da_DK",
"cs_CZ",
"tr_TR"
);
@CHARSETS = (
"ISO-8859-15",
"ISO-8859-15",
"ISO-8859-2",
"ISO-8859-15",
"ISO-8859-15",
"ISO-8859-1",
"ISO-8859-1",
"ISO-8859-1",
"ISO-8859-15",
"ISO-8859-2",
"ISO-8859-15",
"ISO-8859-7",
"ISO-8859-1",
"ISO-8859-2",
"ISO-8859-2",
"ISO-8859-1",
"ISO-8859-5",
"ISO-8859-2",
"ISO-8859-13",
"ISO-8859-15",
"ISO-8859-2",
"ISO-8859-9",
);
@TRANSLATORS = (
"Klaus Schmidinger <kls\@cadsoft.de>, 2000",
"Klaus Schmidinger <kls\@cadsoft.de>, 2000",
"Miha Setina <mihasetina\@softhome.net>, 2000; Matjaz Thaler <matjaz.thaler\@guest.arnes.si>, 2003",
"Alberto Carraro <bertocar\@tin.it>, 2001; Antonio Ospite <ospite\@studenti.unina.it>, 2003; Sean Carlos <seanc\@libero.it>, 2005",
"Arnold Niessen <niessen\@iae.nl> <arnold.niessen\@philips.com>, 2001; Hans Dingemans <hans.dingemans\@tacticalops.nl>, 2003; Maarten Wisse <Maarten.Wisse\@urz.uni-hd.de>, 2005",
"Paulo Lopes <pmml\@netvita.pt>, 2001",
"Jean-Claude Repetto <jc\@repetto.org>, 2001; Olivier Jacques <jacquesolivier\@hotmail.com>, 2003; Gregoire Favre <greg\@magma.unil.ch>, 2003; Nicolas Huillard <nhuillard\@e-dition.fr>, 2005",
"Jørgen Tvedt <pjtvedt\@online.no>, 2001; Truls Slevigen <truls\@slevigen.no>, 2002",
"Hannu Savolainen <hannu\@opensound.com>, 2002; Jaakko Hyvätti <jaakko\@hyvatti.iki.fi>, 2002; Niko Tarnanen <niko.tarnanen\@hut.fi>, 2003; Rolf Ahrenberg <rahrenbe\@cc.hut.fi>, 2003",
"Michael Rakowski <mrak\@gmx.de>, 2002",
"Ruben Nunez Francisco <ruben.nunez\@tang-it.com>, 2002",
"Dimitrios Dimitrakos <mail\@dimitrios.de>, 2002",
"Tomas Prybil <tomas\@prybil.se>, 2002; Jan Ekholm <chakie\@infa.abo.fi>, 2003",
"Paul Lacatus <paul\@campina.iiruc.ro>, 2002; Lucian Muresan <lucianm\@users.sourceforge.net>, 2004",
"Istvan Koenigsberger <istvnko\@hotmail.com>, 2002; Guido Josten <guido.josten\@t-online.de>, 2002",
"Marc Rovira Vall <tm05462\@salleURL.edu>, 2003; Ramon Roca <ramon.roca\@xcombo.com>, 2003; Jordi Vilà <jvila\@tinet.org>, 2003",
"Vyacheslav Dikonov <sdiconov\@mail.ru>, 2004",
"Drazen Dupor <drazen.dupor\@dupor.com>, 2004; Dino Ravnic <dino.ravnic\@fer.hr>, 2004",
"Arthur Konovalov <kasjas\@hot.ee>, 2004",
"Mogens Elneff <mogens\@elneff.dk>, 2004",
"Vladimír Bárta <vladimir.barta\@k2atmitec.cz>, 2006",
"Oktay Yolgeçen <oktay_73\@yahoo.de>, 2007"
);
@LASTTRANSLATOR = (
"Klaus Schmidinger <kls\@cadsoft.de>",
"Klaus Schmidinger <kls\@cadsoft.de>",
"Matjaz Thaler <matjaz.thaler\@guest.arnes.si>",
"Sean Carlos <seanc\@libero.it>",
"Maarten Wisse <Maarten.Wisse\@urz.uni-hd.de>",
"Paulo Lopes <pmml\@netvita.pt>",
"Nicolas Huillard <nhuillard\@e-dition.fr>",
"Truls Slevigen <truls\@slevigen.no>",
"Rolf Ahrenberg <rahrenbe\@cc.hut.fi>",
"Michael Rakowski <mrak\@gmx.de>",
"Ruben Nunez Francisco <ruben.nunez\@tang-it.com>",
"Dimitrios Dimitrakos <mail\@dimitrios.de>",
"Tomas Prybil <tomas\@prybil.se>",
"Lucian Muresan <lucianm\@users.sourceforge.net>",
"Istvan Koenigsberger <istvnko\@hotmail.com>, Guido Josten <guido.josten\@t-online.de>",
"Jordi Vilà <jvila\@tinet.org>",
"Vyacheslav Dikonov <sdiconov\@mail.ru>",
"Drazen Dupor <drazen.dupor\@dupor.com>",
"Arthur Konovalov <kasjas\@hot.ee>",
"Mogens Elneff <mogens\@elneff.dk>",
"Vladimír Bárta <vladimir.barta\@k2atmitec.cz>",
"Oktay Yolgeçen <oktay_73\@yahoo.de>"
);
# Collect all translated texts:
open(F, $I18NFILE) || die "$I18NFILE: $!\n";
while (<F>) {
chomp;
s/\t/ /g; # get rid of tabs
s/ *$//; # get rid of trailing blanks
s/^ *\/\/.*//; # remove comment lines
s/, *\/\/.*/,/; # strip trailing comments
next if (/^ *$/); # skip empty lines
next unless ($found or $found = /const *tI18nPhrase .*{/); # sync on phrases
next if (/const *tI18nPhrase .*{/); # skip sync line
last if (/{ *NULL *}/); # stop after last phrase
if (/{ *(.*),/) {
$Original = $1;
$Index = 0;
}
elsif (/}/) {
}
else {
$Translated = $_;
$Translated =~ s/ *(.*),/$1/;
$Index++;
$Map{$Original}[$Index] = $Translated;
}
}
close(F);
# Generate the .pot file:
(mkdir($PODIR) || die "$PODIR: $!\n") unless -d $PODIR;
system("$XGETTEXT -o $POTFILE *.c");
# Generate .po files for all languages:
open(POT, $POTFILE) || die "$POTFILE: $!\n";
@POT = <POT>;
close(POT);
for ($Index = 1; $LANGS[$Index]; $Index++) {
$Authors = "# " . join("\n# ", split(/; */, $TRANSLATORS[$Index])) . "\n";
$POFILE = "$PODIR/$LANGS[$Index].po";
open(PO, ">$POFILE") || die "$POFILE: $!\n";
$msgid = "";
for (@POT) {
next if (/^#, fuzzy$/); # skip the 'fuzzy' keyword
$msgid = $1 if (/^msgid (".+")/);
$date = $1 if (/POT-Creation-Date: (.*)\\n/);
$s = $_;
if (!$msgid) {
$s =~ s/SOME DESCRIPTIVE TITLE/$TITLE/;
$s =~ s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/$COPYRIGHT/;
$s =~ s/PACKAGE/$PACKAGE/;
$s =~ s/VERSION/$VERSION/;
$s = $Authors if (/FIRST AUTHOR/);
$s =~ s/YEAR-MO-DA HO:MI\+ZONE/$date/;
$s =~ s/FULL NAME <EMAIL\@ADDRESS>/$LASTTRANSLATOR[$Index]/;
$s =~ s/LANGUAGE <LL\@li\.org>/$LANGUAGETEAM/;
$s =~ s/CHARSET/$CHARSETS[$Index]/;
}
else {
$s =~ s/""/$Map{$msgid}[$Index]/ if ($msgid && /^msgstr ""/ && defined $Map{$msgid}[$Index]);
$Used{$msgid} = 1;
}
print PO $s;
}
close(PO);
}
# Report missing phrases:
for (keys %Map) {
push(@Missing, "$_\n") unless $Used{$_};
}
if (@Missing) {
print "Missing phrases (may need to use trNOOP):\n\n";
print sort(@Missing);
}
# Adjust the Makefile:
$MAKEI18N = q{### Internationalization (I18N):
PODIR = po
LOCALEDIR = $(VDRDIR)/locale
I18Npo = $(wildcard $(PODIR)/*.po)
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file))))
I18Ndirs = $(notdir $(foreach file, $(I18Npo), $(basename $(file))))
I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<} . $MSGIDBUGS . q{>' -o $@ $(wildcard *.c)
$(I18Npo): $(I18Npot)
msgmerge -U --no-wrap -F --backup=none -q $@ $<
i18n: $(I18Nmo)
@mkdir -p $(LOCALEDIR)
for i in $(I18Ndirs); do\
mkdir -p $(LOCALEDIR)/$$i/LC_MESSAGES;\
cp $(PODIR)/$$i.mo $(LOCALEDIR)/$$i/LC_MESSAGES/$(PLUGIN).mo;\
done
};
`mv Makefile Makefile.old`;
open(OLD, "Makefile.old") || die "Makefile.old: $!";
open(NEW, ">Makefile") || die "Makefile: $!";
while (<OLD>) {
chomp;
if (/Targets:/) {
print NEW $MAKEI18N;
}
elsif (/^all:/) {
$_ .= " i18n";
}
elsif (/^clean:/) {
$_ .= "\n\t\@-rm -f \$(PODIR)/*.mo \$(PODIR)/*.pot";
}
print NEW "$_\n";
}
close(NEW);
close(OLD);

7034
i18n.c

File diff suppressed because it is too large Load Diff

51
i18n.h
View File

@ -4,25 +4,58 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: i18n.h 1.20 2007/05/28 11:43:14 kls Exp $ * $Id: i18n.h 1.21 2007/08/10 13:53:57 kls Exp $
*/ */
#ifndef __I18N_H #ifndef __I18N_H
#define __I18N_H #define __I18N_H
#include <stdio.h> #include <stdio.h>
#include "tools.h"
const int I18nNumLanguages = 22; typedef const char *tI18nPhrase[22]; ///< obsolete - switch to 'gettext'!
typedef const char *tI18nPhrase[I18nNumLanguages]; #define I18N_DEFAULT_LOCALE "en_US"
#define I18N_MAX_LOCALE_LEN 16 // for buffers that hold en_US etc.
void I18nRegister(const tI18nPhrase * const Phrases, const char *Plugin); #define I18N_MAX_LANGUAGES 256 // for buffers that hold all available languages
void I18nInitialize(void);
///< Detects all available locales and loads the language names and codes.
void I18nRegister(const char *Plugin);
///< Registers the named plugin, so that it can use internationalized texts.
void I18nSetLocale(const char *Locale);
///< Sets the current locale to Locale. The default locale is "en_US".
///< If no such locale has been found in the call to I18nInitialize(),
///< nothing happens.
int I18nCurrentLanguage(void);
///< Returns the index of the current language. This number stays the
///< same for any given language while the program is running, but may
///< be different when the program is run again (for instance because
///< a locale has been added or removed). The default locale ("en_US")
///< always has a zero index.
void I18nSetLanguage(int Language);
///< Sets the current language index to Language. If Language is outside
///< the range of available languages, nothing happens.
const cStringList *I18nLanguages(void);
///< Returns the list of available languages. Values returned by
///< I18nCurrentLanguage() are indexes into this list.
const char *I18nTranslate(const char *s, const char *Plugin = NULL) __attribute_format_arg__(1); const char *I18nTranslate(const char *s, const char *Plugin = NULL) __attribute_format_arg__(1);
///< Translates the given string (with optional Plugin context) into
const char * const * I18nLanguages(void); ///< the current language. If no translation is available, the original
const char *I18nLanguageCode(int Index); ///< string will be returned.
const char *I18nLocale(int Language);
///< Returns the locale code of the given Language (which is an index as
///< returned by I18nCurrentLanguage()). If Language is outside the range
///< of available languages, NULL is returned.
const char *I18nLanguageCode(int Language);
///< Returns the three letter language code of the given Language (which
///< is an index as returned by I18nCurrentLanguage()). If Language is
///< outside the range of available languages, NULL is returned.
///< The returned string may consist of several alternative three letter
///< language codes, separated by commas (as in "deu,ger").
int I18nLanguageIndex(const char *Code); int I18nLanguageIndex(const char *Code);
///< Returns the index of the language with the given three letter
///< language Code. If no suitable language is found, -1 is returned.
const char *I18nNormalizeLanguageCode(const char *Code); const char *I18nNormalizeLanguageCode(const char *Code);
///< Returns a 3 letter language code that may not be zero terminated. ///< Returns a 3 letter language code that may not be zero terminated.
///< If no normalized language code can be found, the given Code is returned. ///< If no normalized language code can be found, the given Code is returned.
@ -44,4 +77,6 @@ bool I18nIsPreferredLanguage(int *PreferredLanguages, const char *LanguageCode,
#define tr(s) I18nTranslate(s) #define tr(s) I18nTranslate(s)
#endif #endif
#define trNOOP(s) (s)
#endif //__I18N_H #endif //__I18N_H

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: interface.c 1.75 2006/03/31 14:20:04 kls Exp $ * $Id: interface.c 1.76 2007/08/04 14:39:25 kls Exp $
*/ */
#include "interface.h" #include "interface.h"
@ -87,9 +87,7 @@ bool cInterface::QueryKeys(cRemote *Remote, cSkinDisplayMenu *DisplayMenu)
eKeys NewKey = kUp; eKeys NewKey = kUp;
while (NewKey != kNone) { while (NewKey != kNone) {
char *Prompt; char *Prompt;
char buf[32]; asprintf(&Prompt, tr("Press key for '%s'"), cKey::ToString(NewKey, true));
snprintf(buf, sizeof(buf), "Key$%s", cKey::ToString(NewKey));
asprintf(&Prompt, tr("Press key for '%s'"), tr(buf));
DisplayMenu->SetItem(Prompt, 4, false, false); DisplayMenu->SetItem(Prompt, 4, false, false);
free(Prompt); free(Prompt);
cRemote::Clear(); cRemote::Clear();

107
keys.c
View File

@ -4,24 +4,24 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: keys.c 1.14 2006/10/14 10:18:05 kls Exp $ * $Id: keys.c 1.15 2007/08/11 11:30:18 kls Exp $
*/ */
#include "keys.h" #include "keys.h"
#include "plugin.h" #include "plugin.h"
static tKey keyTable[] = { // "Up" and "Down" must be the first two keys! static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
{ kUp, "Up" }, { kUp, trNOOP("Key$Up") },
{ kDown, "Down" }, { kDown, trNOOP("Key$Down") },
{ kMenu, "Menu" }, { kMenu, trNOOP("Key$Menu") },
{ kOk, "Ok" }, { kOk, trNOOP("Key$Ok") },
{ kBack, "Back" }, { kBack, trNOOP("Key$Back") },
{ kLeft, "Left" }, { kLeft, trNOOP("Key$Left") },
{ kRight, "Right" }, { kRight, trNOOP("Key$Right") },
{ kRed, "Red" }, { kRed, trNOOP("Key$Red") },
{ kGreen, "Green" }, { kGreen, trNOOP("Key$Green") },
{ kYellow, "Yellow" }, { kYellow, trNOOP("Key$Yellow") },
{ kBlue, "Blue" }, { kBlue, trNOOP("Key$Blue") },
{ k0, "0" }, { k0, "0" },
{ k1, "1" }, { k1, "1" },
{ k2, "2" }, { k2, "2" },
@ -32,38 +32,38 @@ static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
{ k7, "7" }, { k7, "7" },
{ k8, "8" }, { k8, "8" },
{ k9, "9" }, { k9, "9" },
{ kInfo, "Info" }, { kInfo, trNOOP("Key$Info") },
{ kPlay, "Play" }, { kPlay, trNOOP("Key$Play") },
{ kPause, "Pause" }, { kPause, trNOOP("Key$Pause") },
{ kStop, "Stop" }, { kStop, trNOOP("Key$Stop") },
{ kRecord, "Record" }, { kRecord, trNOOP("Key$Record") },
{ kFastFwd, "FastFwd" }, { kFastFwd, trNOOP("Key$FastFwd") },
{ kFastRew, "FastRew" }, { kFastRew, trNOOP("Key$FastRew") },
{ kNext, "Next" }, { kNext, trNOOP("Key$Next") },
{ kPrev, "Prev" }, { kPrev, trNOOP("Key$Prev") },
{ kPower, "Power" }, { kPower, trNOOP("Key$Power") },
{ kChanUp, "Channel+" }, { kChanUp, trNOOP("Key$Channel+") },
{ kChanDn, "Channel-" }, { kChanDn, trNOOP("Key$Channel-") },
{ kChanPrev, "PrevChannel"}, { kChanPrev, trNOOP("Key$PrevChannel") },
{ kVolUp, "Volume+" }, { kVolUp, trNOOP("Key$Volume+") },
{ kVolDn, "Volume-" }, { kVolDn, trNOOP("Key$Volume-") },
{ kMute, "Mute" }, { kMute, trNOOP("Key$Mute") },
{ kAudio, "Audio" }, { kAudio, trNOOP("Key$Audio") },
{ kSchedule, "Schedule" }, { kSchedule, trNOOP("Key$Schedule") },
{ kChannels, "Channels" }, { kChannels, trNOOP("Key$Channels") },
{ kTimers, "Timers" }, { kTimers, trNOOP("Key$Timers") },
{ kRecordings, "Recordings" }, { kRecordings, trNOOP("Key$Recordings") },
{ kSetup, "Setup" }, { kSetup, trNOOP("Key$Setup") },
{ kCommands, "Commands" }, { kCommands, trNOOP("Key$Commands") },
{ kUser1, "User1" }, { kUser1, trNOOP("Key$User1") },
{ kUser2, "User2" }, { kUser2, trNOOP("Key$User2") },
{ kUser3, "User3" }, { kUser3, trNOOP("Key$User3") },
{ kUser4, "User4" }, { kUser4, trNOOP("Key$User4") },
{ kUser5, "User5" }, { kUser5, trNOOP("Key$User5") },
{ kUser6, "User6" }, { kUser6, trNOOP("Key$User6") },
{ kUser7, "User7" }, { kUser7, trNOOP("Key$User7") },
{ kUser8, "User8" }, { kUser8, trNOOP("Key$User8") },
{ kUser9, "User9" }, { kUser9, trNOOP("Key$User9") },
{ kNone, "" }, { kNone, "" },
{ k_Setup, "_Setup" }, { k_Setup, "_Setup" },
{ kNone, NULL }, { kNone, NULL },
@ -121,18 +121,29 @@ eKeys cKey::FromString(const char *Name)
{ {
if (Name) { if (Name) {
for (tKey *k = keyTable; k->name; k++) { for (tKey *k = keyTable; k->name; k++) {
if (strcasecmp(k->name, Name) == 0) const char *n = k->name;
const char *p = strchr(n, '$');
if (p)
n = p + 1;
if (strcasecmp(n, Name) == 0)
return k->type; return k->type;
} }
} }
return kNone; return kNone;
} }
const char *cKey::ToString(eKeys Key) const char *cKey::ToString(eKeys Key, bool Translate)
{ {
for (tKey *k = keyTable; k->name; k++) { for (tKey *k = keyTable; k->name; k++) {
if (k->type == Key) if (k->type == Key) {
return k->name; const char *n = k->name;
if (Translate)
n = tr(n);
const char *p = strchr(n, '$');
if (p)
n = p + 1;
return n;
}
} }
return NULL; return NULL;
} }

4
keys.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: keys.h 1.11 2007/02/25 10:49:35 kls Exp $ * $Id: keys.h 1.12 2007/08/04 14:40:23 kls Exp $
*/ */
#ifndef __KEYS_H #ifndef __KEYS_H
@ -100,7 +100,7 @@ public:
bool Parse(char *s); bool Parse(char *s);
bool Save(FILE *f); bool Save(FILE *f);
static eKeys FromString(const char *Name); static eKeys FromString(const char *Name);
static const char *ToString(eKeys Key); static const char *ToString(eKeys Key, bool Translate = false);
}; };
class cKeys : public cConfig<cKey> { class cKeys : public cConfig<cKey> {

54
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.c 1.456 2007/06/23 09:27:13 kls Exp $ * $Id: menu.c 1.457 2007/08/10 13:13:13 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -2153,6 +2153,7 @@ void cMenuSetupBase::Store(void)
class cMenuSetupOSD : public cMenuSetupBase { class cMenuSetupOSD : public cMenuSetupBase {
private: private:
const char *useSmallFontTexts[3]; const char *useSmallFontTexts[3];
int osdLanguageIndex;
int numSkins; int numSkins;
int originalSkinIndex; int originalSkinIndex;
int skinIndex; int skinIndex;
@ -2171,6 +2172,7 @@ public:
cMenuSetupOSD::cMenuSetupOSD(void) cMenuSetupOSD::cMenuSetupOSD(void)
{ {
osdLanguageIndex = I18nCurrentLanguage();
numSkins = Skins.Count(); numSkins = Skins.Count();
skinIndex = originalSkinIndex = Skins.Current()->Index(); skinIndex = originalSkinIndex = Skins.Current()->Index();
skinDescriptions = new const char*[numSkins]; skinDescriptions = new const char*[numSkins];
@ -2203,7 +2205,7 @@ void cMenuSetupOSD::Set(void)
useSmallFontTexts[2] = tr("always"); useSmallFontTexts[2] = tr("always");
Clear(); Clear();
SetSection(tr("OSD")); SetSection(tr("OSD"));
Add(new cMenuEditStraItem(tr("Setup.OSD$Language"), &data.OSDLanguage, I18nNumLanguages, I18nLanguages())); Add(new cMenuEditStraItem(tr("Setup.OSD$Language"), &osdLanguageIndex, I18nLanguages()->Size(), &I18nLanguages()->At(0)));
Add(new cMenuEditStraItem(tr("Setup.OSD$Skin"), &skinIndex, numSkins, skinDescriptions)); Add(new cMenuEditStraItem(tr("Setup.OSD$Skin"), &skinIndex, numSkins, skinDescriptions));
if (themes.NumThemes()) if (themes.NumThemes())
Add(new cMenuEditStraItem(tr("Setup.OSD$Theme"), &themeIndex, themes.NumThemes(), themes.Descriptions())); Add(new cMenuEditStraItem(tr("Setup.OSD$Theme"), &themeIndex, themes.NumThemes(), themes.Descriptions()));
@ -2237,6 +2239,7 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
bool ModifiedApperance = false; bool ModifiedApperance = false;
if (Key == kOk) { if (Key == kOk) {
I18nSetLocale(data.OSDLanguage);
if (skinIndex != originalSkinIndex) { if (skinIndex != originalSkinIndex) {
cSkin *Skin = Skins.Get(skinIndex); cSkin *Skin = Skins.Get(skinIndex);
if (Skin) { if (Skin) {
@ -2273,16 +2276,17 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
} }
} }
int osdLanguage = data.OSDLanguage;
int oldSkinIndex = skinIndex; int oldSkinIndex = skinIndex;
int oldOsdLanguageIndex = osdLanguageIndex;
eOSState state = cMenuSetupBase::ProcessKey(Key); eOSState state = cMenuSetupBase::ProcessKey(Key);
if (ModifiedApperance) if (ModifiedApperance)
SetDisplayMenu(); SetDisplayMenu();
if (data.OSDLanguage != osdLanguage || skinIndex != oldSkinIndex) { if (osdLanguageIndex != oldOsdLanguageIndex || skinIndex != oldSkinIndex) {
int OriginalOSDLanguage = Setup.OSDLanguage; strn0cpy(data.OSDLanguage, I18nLocale(osdLanguageIndex), sizeof(data.OSDLanguage));
Setup.OSDLanguage = data.OSDLanguage; int OriginalOSDLanguage = I18nCurrentLanguage();
I18nSetLanguage(osdLanguageIndex);
cSkin *Skin = Skins.Get(skinIndex); cSkin *Skin = Skins.Get(skinIndex);
if (Skin) { if (Skin) {
@ -2294,7 +2298,7 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
} }
Set(); Set();
Setup.OSDLanguage = OriginalOSDLanguage; I18nSetLanguage(OriginalOSDLanguage);
} }
return state; return state;
} }
@ -2313,7 +2317,7 @@ public:
cMenuSetupEPG::cMenuSetupEPG(void) cMenuSetupEPG::cMenuSetupEPG(void)
{ {
for (numLanguages = 0; numLanguages < I18nNumLanguages && data.EPGLanguages[numLanguages] >= 0; numLanguages++) for (numLanguages = 0; numLanguages < I18nLanguages()->Size() && data.EPGLanguages[numLanguages] >= 0; numLanguages++)
; ;
originalNumLanguages = numLanguages; originalNumLanguages = numLanguages;
SetSection(tr("EPG")); SetSection(tr("EPG"));
@ -2333,9 +2337,11 @@ void cMenuSetupEPG::Setup(void)
Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime)); Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime));
if (data.SetSystemTime) if (data.SetSystemTime)
Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder, &data.TimeSource)); Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder, &data.TimeSource));
Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), &numLanguages, 0, I18nNumLanguages)); // TRANSLATORS: note the plural!
Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), &numLanguages, 0, I18nLanguages()->Size()));
for (int i = 0; i < numLanguages; i++) for (int i = 0; i < numLanguages; i++)
Add(new cMenuEditStraItem(tr("Setup.EPG$Preferred language"), &data.EPGLanguages[i], I18nNumLanguages, I18nLanguages())); // TRANSLATORS: note the singular!
Add(new cMenuEditStraItem(tr("Setup.EPG$Preferred language"), &data.EPGLanguages[i], I18nLanguages()->Size(), &I18nLanguages()->At(0)));
SetCurrent(Get(current)); SetCurrent(Get(current));
Display(); Display();
@ -2365,7 +2371,7 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
if (numLanguages != oldnumLanguages || data.SetSystemTime != oldSetSystemTime) { if (numLanguages != oldnumLanguages || data.SetSystemTime != oldSetSystemTime) {
for (int i = oldnumLanguages; i < numLanguages; i++) { for (int i = oldnumLanguages; i < numLanguages; i++) {
data.EPGLanguages[i] = 0; data.EPGLanguages[i] = 0;
for (int l = 0; l < I18nNumLanguages; l++) { for (int l = 0; l < I18nLanguages()->Size(); l++) {
int k; int k;
for (k = 0; k < oldnumLanguages; k++) { for (k = 0; k < oldnumLanguages; k++) {
if (data.EPGLanguages[k] == l) if (data.EPGLanguages[k] == l)
@ -2404,7 +2410,7 @@ public:
cMenuSetupDVB::cMenuSetupDVB(void) cMenuSetupDVB::cMenuSetupDVB(void)
{ {
for (numAudioLanguages = 0; numAudioLanguages < I18nNumLanguages && data.AudioLanguages[numAudioLanguages] >= 0; numAudioLanguages++) for (numAudioLanguages = 0; numAudioLanguages < I18nLanguages()->Size() && data.AudioLanguages[numAudioLanguages] >= 0; numAudioLanguages++)
; ;
originalNumAudioLanguages = numAudioLanguages; originalNumAudioLanguages = numAudioLanguages;
videoDisplayFormatTexts[0] = tr("pan&scan"); videoDisplayFormatTexts[0] = tr("pan&scan");
@ -2433,9 +2439,9 @@ void cMenuSetupDVB::Setup(void)
Add(new cMenuEditStraItem(tr("Setup.DVB$Video display format"), &data.VideoDisplayFormat, 3, videoDisplayFormatTexts)); Add(new cMenuEditStraItem(tr("Setup.DVB$Video display format"), &data.VideoDisplayFormat, 3, videoDisplayFormatTexts));
Add(new cMenuEditBoolItem(tr("Setup.DVB$Use Dolby Digital"), &data.UseDolbyDigital)); Add(new cMenuEditBoolItem(tr("Setup.DVB$Use Dolby Digital"), &data.UseDolbyDigital));
Add(new cMenuEditStraItem(tr("Setup.DVB$Update channels"), &data.UpdateChannels, 6, updateChannelsTexts)); Add(new cMenuEditStraItem(tr("Setup.DVB$Update channels"), &data.UpdateChannels, 6, updateChannelsTexts));
Add(new cMenuEditIntItem( tr("Setup.DVB$Audio languages"), &numAudioLanguages, 0, I18nNumLanguages)); Add(new cMenuEditIntItem( tr("Setup.DVB$Audio languages"), &numAudioLanguages, 0, I18nLanguages()->Size()));
for (int i = 0; i < numAudioLanguages; i++) for (int i = 0; i < numAudioLanguages; i++)
Add(new cMenuEditStraItem(tr("Setup.DVB$Audio language"), &data.AudioLanguages[i], I18nNumLanguages, I18nLanguages())); Add(new cMenuEditStraItem(tr("Setup.DVB$Audio language"), &data.AudioLanguages[i], I18nLanguages()->Size(), &I18nLanguages()->At(0)));
SetCurrent(Get(current)); SetCurrent(Get(current));
Display(); Display();
@ -2455,7 +2461,7 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
if (numAudioLanguages != oldnumAudioLanguages) { if (numAudioLanguages != oldnumAudioLanguages) {
for (int i = oldnumAudioLanguages; i < numAudioLanguages; i++) { for (int i = oldnumAudioLanguages; i < numAudioLanguages; i++) {
data.AudioLanguages[i] = 0; data.AudioLanguages[i] = 0;
for (int l = 0; l < I18nNumLanguages; l++) { for (int l = 0; l < I18nLanguages()->Size(); l++) {
int k; int k;
for (k = 0; k < oldnumAudioLanguages; k++) { for (k = 0; k < oldnumAudioLanguages; k++) {
if (data.AudioLanguages[k] == l) if (data.AudioLanguages[k] == l)
@ -2826,7 +2832,7 @@ eOSState cMenuSetup::Restart(void)
eOSState cMenuSetup::ProcessKey(eKeys Key) eOSState cMenuSetup::ProcessKey(eKeys Key)
{ {
int osdLanguage = Setup.OSDLanguage; int osdLanguage = I18nCurrentLanguage();
eOSState state = cOsdMenu::ProcessKey(Key); eOSState state = cOsdMenu::ProcessKey(Key);
switch (state) { switch (state) {
@ -2842,7 +2848,7 @@ eOSState cMenuSetup::ProcessKey(eKeys Key)
case osUser10: return Restart(); case osUser10: return Restart();
default: ; default: ;
} }
if (Setup.OSDLanguage != osdLanguage) { if (I18nCurrentLanguage() != osdLanguage) {
Set(); Set();
if (!HasSubMenu()) if (!HasSubMenu())
Display(); Display();
@ -2868,7 +2874,8 @@ cMenuPluginItem::cMenuPluginItem(const char *Name, int Index)
// --- cMenuMain ------------------------------------------------------------- // --- cMenuMain -------------------------------------------------------------
#define STOP_RECORDING tr(" Stop recording ") // TRANSLATORS: note the leading and trailing blanks!
#define STOP_RECORDING trNOOP(" Stop recording ")
cOsdObject *cMenuMain::pluginOsdObject = NULL; cOsdObject *cMenuMain::pluginOsdObject = NULL;
@ -2967,6 +2974,7 @@ bool cMenuMain::Update(bool Force)
replaying = NewReplaying; replaying = NewReplaying;
// Replay control: // Replay control:
if (replaying && !stopReplayItem) if (replaying && !stopReplayItem)
// TRANSLATORS: note the leading blank!
Add(stopReplayItem = new cOsdItem(tr(" Stop replaying"), osStopReplay)); Add(stopReplayItem = new cOsdItem(tr(" Stop replaying"), osStopReplay));
else if (stopReplayItem && !replaying) { else if (stopReplayItem && !replaying) {
Del(stopReplayItem->Index()); Del(stopReplayItem->Index());
@ -2980,6 +2988,7 @@ bool cMenuMain::Update(bool Force)
// Editing control: // Editing control:
bool CutterActive = cCutter::Active(); bool CutterActive = cCutter::Active();
if (CutterActive && !cancelEditingItem) { if (CutterActive && !cancelEditingItem) {
// TRANSLATORS: note the leading blank!
Add(cancelEditingItem = new cOsdItem(tr(" Cancel editing"), osCancelEdit)); Add(cancelEditingItem = new cOsdItem(tr(" Cancel editing"), osCancelEdit));
result = true; result = true;
} }
@ -2999,7 +3008,7 @@ bool cMenuMain::Update(bool Force)
const char *s = NULL; const char *s = NULL;
while ((s = cRecordControls::GetInstantId(s)) != NULL) { while ((s = cRecordControls::GetInstantId(s)) != NULL) {
char *buffer = NULL; char *buffer = NULL;
asprintf(&buffer, "%s%s", STOP_RECORDING, s); asprintf(&buffer, "%s%s", tr(STOP_RECORDING), s);
cOsdItem *item = new cOsdItem(osStopRecord); cOsdItem *item = new cOsdItem(osStopRecord);
item->SetText(buffer, false); item->SetText(buffer, false);
Add(item); Add(item);
@ -3015,7 +3024,7 @@ bool cMenuMain::Update(bool Force)
eOSState cMenuMain::ProcessKey(eKeys Key) eOSState cMenuMain::ProcessKey(eKeys Key)
{ {
bool HadSubMenu = HasSubMenu(); bool HadSubMenu = HasSubMenu();
int osdLanguage = Setup.OSDLanguage; int osdLanguage = I18nCurrentLanguage();
eOSState state = cOsdMenu::ProcessKey(Key); eOSState state = cOsdMenu::ProcessKey(Key);
HadSubMenu |= HasSubMenu(); HadSubMenu |= HasSubMenu();
@ -3029,7 +3038,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
case osStopRecord: if (Interface->Confirm(tr("Stop recording?"))) { case osStopRecord: if (Interface->Confirm(tr("Stop recording?"))) {
cOsdItem *item = Get(Current()); cOsdItem *item = Get(Current());
if (item) { if (item) {
cRecordControls::Stop(item->Text() + strlen(STOP_RECORDING)); cRecordControls::Stop(item->Text() + strlen(tr(STOP_RECORDING)));
return osEnd; return osEnd;
} }
} }
@ -3080,7 +3089,7 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
if (!HasSubMenu() && Update(HadSubMenu)) if (!HasSubMenu() && Update(HadSubMenu))
Display(); Display();
if (Key != kNone) { if (Key != kNone) {
if (Setup.OSDLanguage != osdLanguage) { if (I18nCurrentLanguage() != osdLanguage) {
Set(); Set();
if (!HasSubMenu()) if (!HasSubMenu())
Display(); Display();
@ -4026,6 +4035,7 @@ bool cReplayControl::ShowProgress(bool Initial)
void cReplayControl::TimeSearchDisplay(void) void cReplayControl::TimeSearchDisplay(void)
{ {
char buf[64]; char buf[64];
// TRANSLATORS: note the trailing blank!
strcpy(buf, tr("Jump: ")); strcpy(buf, tr("Jump: "));
int len = strlen(buf); int len = strlen(buf);
char h10 = '0' + (timeSearchTime >> 24); char h10 = '0' + (timeSearchTime >> 24);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menuitems.c 1.49 2007/06/08 15:16:38 kls Exp $ * $Id: menuitems.c 1.50 2007/08/04 09:12:18 kls Exp $
*/ */
#include "menuitems.h" #include "menuitems.h"
@ -18,7 +18,7 @@
#define AUTO_ADVANCE_TIMEOUT 1500 // ms before auto advance when entering characters via numeric keys #define AUTO_ADVANCE_TIMEOUT 1500 // ms before auto advance when entering characters via numeric keys
const char *FileNameChars = " abcdefghijklmnopqrstuvwxyz0123456789-.#~,/_@"; const char *FileNameChars = trNOOP(" abcdefghijklmnopqrstuvwxyz0123456789-.#~,/_@");
// --- cMenuEditItem --------------------------------------------------------- // --- cMenuEditItem ---------------------------------------------------------
@ -316,7 +316,7 @@ void cMenuEditStrItem::LeaveEditMode(bool SaveValue)
void cMenuEditStrItem::SetHelpKeys(void) void cMenuEditStrItem::SetHelpKeys(void)
{ {
if (InEditMode()) if (InEditMode())
cSkinDisplay::Current()->SetButtons(tr("Button$ABC/abc"), tr(insert ? "Button$Overwrite" : "Button$Insert"), tr("Button$Delete")); cSkinDisplay::Current()->SetButtons(tr("Button$ABC/abc"), insert ? tr("Button$Overwrite") : tr("Button$Insert"), tr("Button$Delete"));
else else
cSkinDisplay::Current()->SetButtons(NULL); cSkinDisplay::Current()->SetButtons(NULL);
} }

View File

@ -12,7 +12,7 @@
# See the main source file 'vdr.c' for copyright information and # See the main source file 'vdr.c' for copyright information and
# how to reach the author. # how to reach the author.
# #
# $Id: newplugin 1.32 2007/04/28 14:46:39 kls Exp $ # $Id: newplugin 1.33 2007/08/10 15:54:46 kls Exp $
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n"; $PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
@ -109,7 +109,7 @@ OBJS = \$(PLUGIN).o
%.o: %.c %.o: %.c
\$(CXX) \$(CXXFLAGS) -c \$(DEFINES) \$(INCLUDES) \$< \$(CXX) \$(CXXFLAGS) -c \$(DEFINES) \$(INCLUDES) \$<
# Dependencies: ### Dependencies:
MAKEDEP = \$(CXX) -MM -MG MAKEDEP = \$(CXX) -MM -MG
DEPFILE = .dependencies DEPFILE = .dependencies
@ -118,9 +118,34 @@ DEPFILE = .dependencies
-include \$(DEPFILE) -include \$(DEPFILE)
### Internationalization (I18N):
PODIR = po
LOCALEDIR = \$(VDRDIR)/locale
I18Npo = \$(wildcard \$(PODIR)/*.po)
I18Nmo = \$(addsuffix .mo, \$(foreach file, \$(I18Npo), \$(basename \$(file))))
I18Ndirs = \$(notdir \$(foreach file, \$(I18Npo), \$(basename \$(file))))
I18Npot = \$(PODIR)/\$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o \$\@ \$<
\$(I18Npot): \$(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o \$\@ \$(wildcard *.c)
\$(I18Npo): \$(I18Npot)
msgmerge -U --no-wrap -F --backup=none -q \$\@ \$<
i18n: \$(I18Nmo)
\@mkdir -p \$(LOCALEDIR)
for i in \$(I18Ndirs); do\\
mkdir -p \$(LOCALEDIR)/\$\$i/LC_MESSAGES;\\
cp \$(PODIR)/\$\$i.mo \$(LOCALEDIR)/\$\$i/LC_MESSAGES/\$(PLUGIN).mo;\\
done
### Targets: ### Targets:
all: libvdr-\$(PLUGIN).so all: libvdr-\$(PLUGIN).so i18n
libvdr-\$(PLUGIN).so: \$(OBJS) libvdr-\$(PLUGIN).so: \$(OBJS)
\$(CXX) \$(CXXFLAGS) -shared \$(OBJS) -o \$\@ \$(CXX) \$(CXXFLAGS) -shared \$(OBJS) -o \$\@
@ -135,7 +160,7 @@ dist: clean
\@echo Distribution package created as \$(PACKAGE).tgz \@echo Distribution package created as \$(PACKAGE).tgz
clean: clean:
\@-rm -f \$(OBJS) \$(DEPFILE) *.so *.tgz core* *~ \@-rm -f \$(OBJS) \$(DEPFILE) *.so *.tgz core* *~ \$(PODIR)/*.mo \$(PODIR)/*.pot
}; };
$MAIN = qq $MAIN = qq

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: plugin.c 1.25 2007/02/24 13:44:23 kls Exp $ * $Id: plugin.c 1.26 2007/08/05 12:48:50 kls Exp $
*/ */
#include "plugin.h" #include "plugin.h"
@ -35,12 +35,12 @@ cPlugin::cPlugin(void)
cPlugin::~cPlugin() cPlugin::~cPlugin()
{ {
I18nRegister(NULL, Name());
} }
void cPlugin::SetName(const char *s) void cPlugin::SetName(const char *s)
{ {
name = s; name = s;
I18nRegister(name);
} }
const char *cPlugin::CommandLineHelp(void) const char *cPlugin::CommandLineHelp(void)
@ -130,9 +130,9 @@ cString cPlugin::SVDRPCommand(const char *Command, const char *Option, int &Repl
return NULL; return NULL;
} }
void cPlugin::RegisterI18n(const tI18nPhrase * const Phrases) void cPlugin::RegisterI18n(const void *)
{ {
I18nRegister(Phrases, Name()); dsyslog("plugin '%s' called obsolete function RegisterI18n()", Name());
} }
void cPlugin::SetConfigDirectory(const char *Dir) void cPlugin::SetConfigDirectory(const char *Dir)
@ -338,10 +338,7 @@ bool cPluginManager::InitializePlugins(void)
for (cDll *dll = dlls.First(); dll; dll = dlls.Next(dll)) { for (cDll *dll = dlls.First(); dll; dll = dlls.Next(dll)) {
cPlugin *p = dll->Plugin(); cPlugin *p = dll->Plugin();
if (p) { if (p) {
int Language = Setup.OSDLanguage;
Setup.OSDLanguage = 0; // the i18n texts are only available _after_ Start()
isyslog("initializing plugin: %s (%s): %s", p->Name(), p->Version(), p->Description()); isyslog("initializing plugin: %s (%s): %s", p->Name(), p->Version(), p->Description());
Setup.OSDLanguage = Language;
if (!p->Initialize()) if (!p->Initialize())
return false; return false;
} }
@ -354,10 +351,7 @@ bool cPluginManager::StartPlugins(void)
for (cDll *dll = dlls.First(); dll; dll = dlls.Next(dll)) { for (cDll *dll = dlls.First(); dll; dll = dlls.Next(dll)) {
cPlugin *p = dll->Plugin(); cPlugin *p = dll->Plugin();
if (p) { if (p) {
int Language = Setup.OSDLanguage;
Setup.OSDLanguage = 0; // the i18n texts are only available _after_ Start()
isyslog("starting plugin: %s", p->Name()); isyslog("starting plugin: %s", p->Name());
Setup.OSDLanguage = Language;
if (!p->Start()) if (!p->Start())
return false; return false;
p->started = true; p->started = true;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: plugin.h 1.14 2007/02/24 13:45:28 kls Exp $ * $Id: plugin.h 1.15 2007/08/04 09:56:26 kls Exp $
*/ */
#ifndef __PLUGIN_H #ifndef __PLUGIN_H
@ -51,7 +51,7 @@ public:
void SetupStore(const char *Name, const char *Value = NULL); void SetupStore(const char *Name, const char *Value = NULL);
void SetupStore(const char *Name, int Value); void SetupStore(const char *Name, int Value);
void RegisterI18n(const tI18nPhrase * const Phrases); void RegisterI18n(const void *); ///< This function is obsolete and may be removed in future versions of VDR!
virtual bool Service(const char *Id, void *Data = NULL); virtual bool Service(const char *Id, void *Data = NULL);
virtual const char **SVDRPHelpPages(void); virtual const char **SVDRPHelpPages(void);

1272
po/ca_ES.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/cs_CZ.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/da_DK.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/de_DE.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/el_GR.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/es_ES.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/et_EE.po Normal file

File diff suppressed because it is too large Load Diff

1273
po/fi_FI.po Normal file

File diff suppressed because it is too large Load Diff

1273
po/fr_FR.po Normal file

File diff suppressed because it is too large Load Diff

1271
po/hr_HR.po Normal file

File diff suppressed because it is too large Load Diff

1271
po/hu_HU.po Normal file

File diff suppressed because it is too large Load Diff

1272
po/it_IT.po Normal file

File diff suppressed because it is too large Load Diff

1272
po/nl_NL.po Normal file

File diff suppressed because it is too large Load Diff

1271
po/nn_NO.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/pl_PL.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/pt_PT.po Normal file

File diff suppressed because it is too large Load Diff

1271
po/ro_RO.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/ru_RU.po Normal file

File diff suppressed because it is too large Load Diff

1271
po/sl_SI.po Normal file

File diff suppressed because it is too large Load Diff

1271
po/sv_SE.po Normal file

File diff suppressed because it is too large Load Diff

1270
po/tr_TR.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: skinclassic.c 1.17 2007/06/17 13:53:09 kls Exp $ * $Id: skinclassic.c 1.18 2007/07/29 12:35:03 kls Exp $
*/ */
#include "skinclassic.h" #include "skinclassic.h"
@ -549,6 +549,7 @@ void cSkinClassicDisplayVolume::SetVolume(int Current, int Total, bool Mute)
osd->DrawText(0, 0, tr("Key$Mute"), Theme.Color(clrVolumePrompt), Theme.Color(clrBackground), font); osd->DrawText(0, 0, tr("Key$Mute"), Theme.Color(clrVolumePrompt), Theme.Color(clrBackground), font);
} }
else { else {
// TRANSLATORS: note the trailing blank!
const char *Prompt = tr("Volume "); const char *Prompt = tr("Volume ");
int l = font->Width(Prompt); int l = font->Width(Prompt);
int p = (osd->Width() - l) * Current / Total; int p = (osd->Width() - l) * Current / Total;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: themes.c 1.6 2005/11/04 14:19:54 kls Exp $ * $Id: themes.c 1.7 2007/08/05 14:11:35 kls Exp $
*/ */
#include "themes.h" #include "themes.h"
@ -18,7 +18,6 @@
cTheme::cTheme(void) cTheme::cTheme(void)
{ {
name = strdup("default"); name = strdup("default");
memset(descriptions, 0, sizeof(descriptions));
memset(colorNames, 0, sizeof(colorNames)); memset(colorNames, 0, sizeof(colorNames));
memset(colorValues, 0, sizeof(colorValues)); memset(colorValues, 0, sizeof(colorValues));
descriptions[0] = strdup("Default"); descriptions[0] = strdup("Default");
@ -27,8 +26,6 @@ cTheme::cTheme(void)
cTheme::~cTheme() cTheme::~cTheme()
{ {
free(name); free(name);
for (int i = 0; i < I18nNumLanguages; i++)
free(descriptions[i]);
for (int i = 0; i < MaxThemeColors; i++) for (int i = 0; i < MaxThemeColors; i++)
free(colorNames[i]); free(colorNames[i]);
} }
@ -77,7 +74,7 @@ bool cTheme::FileNameOk(const char *FileName, bool SetName)
const char *cTheme::Description(void) const char *cTheme::Description(void)
{ {
char *s = descriptions[Setup.OSDLanguage]; char *s = descriptions[I18nCurrentLanguage()];
if (!s) if (!s)
s = descriptions[0]; s = descriptions[0];
return s ? s : name; return s ? s : name;
@ -167,7 +164,7 @@ bool cTheme::Save(const char *FileName)
bool result = true; bool result = true;
cSafeFile f(FileName); cSafeFile f(FileName);
if (f.Open()) { if (f.Open()) {
for (int i = 0; i < I18nNumLanguages; i++) { for (int i = 0; i < I18nLanguages()->Size(); i++) {
if (descriptions[i]) if (descriptions[i])
fprintf(f, "Description%s%.*s = %s\n", i ? "." : "", 3, i ? I18nLanguageCode(i) : "", descriptions[i]); fprintf(f, "Description%s%.*s = %s\n", i ? "." : "", 3, i ? I18nLanguageCode(i) : "", descriptions[i]);
} }

View File

@ -4,13 +4,14 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: themes.h 1.1 2004/05/15 14:22:16 kls Exp $ * $Id: themes.h 1.2 2007/08/05 14:10:22 kls Exp $
*/ */
#ifndef __THEMES_H #ifndef __THEMES_H
#define __THEMES_H #define __THEMES_H
#include "i18n.h" #include "i18n.h"
#include "tools.h"
#include "osd.h" #include "osd.h"
class cTheme { class cTheme {
@ -18,7 +19,7 @@ public:
enum { MaxThemeColors = 128 }; enum { MaxThemeColors = 128 };
private: private:
char *name; char *name;
char *descriptions[I18nNumLanguages]; cStringList descriptions;
char *colorNames[MaxThemeColors]; char *colorNames[MaxThemeColors];
tColor colorValues[MaxThemeColors]; tColor colorValues[MaxThemeColors];
bool FileNameOk(const char *FileName, bool SetName = false); bool FileNameOk(const char *FileName, bool SetName = false);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: timers.c 1.67 2007/06/16 10:41:21 kls Exp $ * $Id: timers.c 1.68 2007/08/04 09:23:33 kls Exp $
*/ */
#include "timers.h" #include "timers.h"
@ -218,7 +218,8 @@ cString cTimer::PrintDay(time_t Day, int WeekDays, bool SingleByteChars)
char buffer[DAYBUFFERSIZE]; char buffer[DAYBUFFERSIZE];
char *b = buffer; char *b = buffer;
if (WeekDays) { if (WeekDays) {
const char *w = "MTWTFSS"; // TRANSLATORS: the first character of each weekday, beginning with monday
const char *w = trNOOP("MTWTFSS");
if (!SingleByteChars) if (!SingleByteChars)
w = tr(w); w = tr(w);
while (*w) { while (*w) {

19
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.c 1.134 2007/07/21 13:02:45 kls Exp $ * $Id: tools.c 1.135 2007/08/05 12:18:15 kls Exp $
*/ */
#include "tools.h" #include "tools.h"
@ -852,6 +852,7 @@ cString WeekDayName(int WeekDay)
char buffer[16]; char buffer[16];
WeekDay = WeekDay == 0 ? 6 : WeekDay - 1; // we start with Monday==0! WeekDay = WeekDay == 0 ? 6 : WeekDay - 1; // we start with Monday==0!
if (0 <= WeekDay && WeekDay <= 6) { if (0 <= WeekDay && WeekDay <= 6) {
// TRANSLATORS: abbreviated weekdays, beginning with monday (must all be 3 letters!)
const char *day = tr("MonTueWedThuFriSatSun"); const char *day = tr("MonTueWedThuFriSatSun");
day += Utf8SymChars(day, WeekDay * 3); day += Utf8SymChars(day, WeekDay * 3);
strn0cpy(buffer, day, min(Utf8SymChars(day, 3) + 1, int(sizeof(buffer)))); strn0cpy(buffer, day, min(Utf8SymChars(day, 3) + 1, int(sizeof(buffer))));
@ -1178,12 +1179,12 @@ void cStringList::Clear(void)
// --- cFileNameList --------------------------------------------------------- // --- cFileNameList ---------------------------------------------------------
// TODO better GetFileNames(const char *Directory, cStringList *List)? // TODO better GetFileNames(const char *Directory, cStringList *List)?
cFileNameList::cFileNameList(const char *Directory) cFileNameList::cFileNameList(const char *Directory, bool DirsOnly)
{ {
Load(Directory); Load(Directory, DirsOnly);
} }
bool cFileNameList::Load(const char *Directory) bool cFileNameList::Load(const char *Directory, bool DirsOnly)
{ {
Clear(); Clear();
if (Directory) { if (Directory) {
@ -1191,9 +1192,17 @@ bool cFileNameList::Load(const char *Directory)
struct dirent *e; struct dirent *e;
if (d.Ok()) { if (d.Ok()) {
while ((e = d.Next()) != NULL) { while ((e = d.Next()) != NULL) {
if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
if (DirsOnly) {
struct stat ds;
if (stat(e->d_name, &ds) == 0) {
if (S_ISDIR(ds.st_mode))
continue;
}
}
Append(strdup(e->d_name)); Append(strdup(e->d_name));
} }
}
Sort(); Sort();
return true; return true;
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.h 1.106 2007/07/28 12:54:49 kls Exp $ * $Id: tools.h 1.107 2007/08/05 12:11:52 kls Exp $
*/ */
#ifndef __TOOLS_H #ifndef __TOOLS_H
@ -487,8 +487,8 @@ public:
class cFileNameList : public cStringList { class cFileNameList : public cStringList {
public: public:
cFileNameList(const char *Directory = NULL); cFileNameList(const char *Directory = NULL, bool DirsOnly = false);
bool Load(const char *Directory); bool Load(const char *Directory, bool DirsOnly = false);
}; };
class cHashObject : public cListObject { class cHashObject : public cListObject {

7
vdr.5
View File

@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the .\" License as specified in the file COPYING that comes with the
.\" vdr distribution. .\" vdr distribution.
.\" .\"
.\" $Id: vdr.5 1.62 2007/06/03 13:21:34 kls Exp $ .\" $Id: vdr.5 1.63 2007/08/05 12:58:35 kls Exp $
.\" .\"
.TH vdr 5 "07 Jan 2007" "1.4.5" "Video Disk Recorder Files" .TH vdr 5 "07 Jan 2007" "1.4.5" "Video Disk Recorder Files"
.SH NAME .SH NAME
@ -542,9 +542,10 @@ you can provide language specific descriptions as
.br .br
\fBDescription.ger = Blaut\(:one\fR \fBDescription.ger = Blaut\(:one\fR
where the language code (as defined in VDR/i18n.c) is added to the keyword where the language code is added to the keyword
"Description", separated by a dot. You can enter as many language specific "Description", separated by a dot. You can enter as many language specific
descriptions as there are languages defined in VDR/i18n.h. descriptions as you like, but only those that have a corresponding locale
messages file will be actually used.
If a theme file doesn't contain a Description, the name of the theme (as If a theme file doesn't contain a Description, the name of the theme (as
given in the theme's file name) will be used. given in the theme's file name) will be used.
.SS AUDIO/VIDEO DATA .SS AUDIO/VIDEO DATA

6
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.cadsoft.de/vdr * The project's page is at http://www.cadsoft.de/vdr
* *
* $Id: vdr.c 1.294 2007/07/22 11:40:01 kls Exp $ * $Id: vdr.c 1.295 2007/08/05 09:53:20 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -511,6 +511,10 @@ int main(int argc, char *argv[])
cCharSetConv::SetSystemCharacterTable(CodeSet); cCharSetConv::SetSystemCharacterTable(CodeSet);
} }
// Initialize internationalization:
I18nInitialize();
// Main program loop variables - need to be here to have them initialized before any EXIT(): // Main program loop variables - need to be here to have them initialized before any EXIT():
cOsdObject *Menu = NULL; cOsdObject *Menu = NULL;