mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Added support for selecting preferred EPG languages
This commit is contained in:
parent
bd38a10ff9
commit
6484771bf6
@ -639,6 +639,7 @@ Teemu Rantanen <tvr@iki.fi>
|
|||||||
for fixing faulty calculation of section length in eit.c
|
for fixing faulty calculation of section length in eit.c
|
||||||
for reporting a problem in calculation of channel ids for tv stations that use
|
for reporting a problem in calculation of channel ids for tv stations that use
|
||||||
the undefined NID value 0
|
the undefined NID value 0
|
||||||
|
for adding EPG preferred languages
|
||||||
|
|
||||||
Jan Ekholm <chakie@infa.abo.fi>
|
Jan Ekholm <chakie@infa.abo.fi>
|
||||||
for adding/improving some Swedish language OSD texts
|
for adding/improving some Swedish language OSD texts
|
||||||
|
2
HISTORY
2
HISTORY
@ -2555,3 +2555,5 @@ Video Disk Recorder Revision History
|
|||||||
- Changed calculation of channel ids to make it work for tv stations that use
|
- Changed calculation of channel ids to make it work for tv stations that use
|
||||||
the undefined NID value 0 (thanks to Teemu Rantanen for reporting this one).
|
the undefined NID value 0 (thanks to Teemu Rantanen for reporting this one).
|
||||||
- Enhanced the SDT filter to handle multi part sections.
|
- Enhanced the SDT filter to handle multi part sections.
|
||||||
|
- Added support for selecting preferred EPG languages (based upon a patch by
|
||||||
|
Teemu Rantanen).
|
||||||
|
13
MANUAL
13
MANUAL
@ -482,6 +482,19 @@ Version 1.2
|
|||||||
be taken. Note that in order to set the system time from
|
be taken. Note that in order to set the system time from
|
||||||
the transponder data the option "Set system time" must also
|
the transponder data the option "Set system time" must also
|
||||||
be enabled.
|
be enabled.
|
||||||
|
Preferred languages = 0
|
||||||
|
Some tv stations broadcast their EPG data in various
|
||||||
|
different languages. This option allows you to define
|
||||||
|
which language(s) you prefer in such cases. By default,
|
||||||
|
or if none of the preferred languages is broadcast, any
|
||||||
|
language will be accepted and the EPG data will be
|
||||||
|
displayed in the first language received from the data
|
||||||
|
stream. If this option is set to a non-zero value, the
|
||||||
|
menu page will contain that many "Preferred language"
|
||||||
|
options which allow you to select the individual preferred
|
||||||
|
languages. If an actual EPG data record is received in
|
||||||
|
different languages, the preferred languages are checked
|
||||||
|
in the given order to decide which one to take.
|
||||||
|
|
||||||
DVB:
|
DVB:
|
||||||
|
|
||||||
|
38
config.c
38
config.c
@ -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.118 2004/01/05 11:45:40 kls Exp $
|
* $Id: config.c 1.119 2004/01/06 17:09:54 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@ -259,6 +259,7 @@ cSetup::cSetup(void)
|
|||||||
TimeTransponder = 0;
|
TimeTransponder = 0;
|
||||||
MarginStart = 2;
|
MarginStart = 2;
|
||||||
MarginStop = 10;
|
MarginStop = 10;
|
||||||
|
EPGLanguages[0] = -1;
|
||||||
EPGScanTimeout = 5;
|
EPGScanTimeout = 5;
|
||||||
EPGBugfixLevel = 2;
|
EPGBugfixLevel = 2;
|
||||||
SVDRPTimeout = 300;
|
SVDRPTimeout = 300;
|
||||||
@ -395,6 +396,39 @@ bool cSetup::ParseCaCaps(const char *Value)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cSetup::StoreLanguages(const char *Name, int *Values)
|
||||||
|
{
|
||||||
|
char buffer[I18nNumLanguages * 4];
|
||||||
|
char *q = buffer;
|
||||||
|
for (int i = 0; i < I18nNumLanguages; i++) {
|
||||||
|
if (Values[i] < 0)
|
||||||
|
break;
|
||||||
|
const char *s = I18nLanguageAbbreviation(Values[i]);
|
||||||
|
if (s) {
|
||||||
|
if (q > buffer)
|
||||||
|
*q++ = ' ';
|
||||||
|
strncpy(q, s, 3);
|
||||||
|
q += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*q = 0;
|
||||||
|
Store(Name, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cSetup::ParseLanguages(const char *Value, int *Values)
|
||||||
|
{
|
||||||
|
int n = 0;
|
||||||
|
while (Value && *Value && n < I18nNumLanguages) {
|
||||||
|
int i = I18nLanguageIndex(Value);
|
||||||
|
if (i >= 0)
|
||||||
|
Values[n++] = i;
|
||||||
|
if ((Value = strchr(Value, ' ')) != NULL)
|
||||||
|
Value++;
|
||||||
|
}
|
||||||
|
Values[n] = -1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
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")) OSDLanguage = atoi(Value);
|
||||||
@ -412,6 +446,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
|
|||||||
else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
|
else if (!strcasecmp(Name, "TimeTransponder")) TimeTransponder = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value);
|
else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
|
else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
|
||||||
|
else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages);
|
||||||
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
|
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
|
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
|
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
|
||||||
@ -463,6 +498,7 @@ bool cSetup::Save(void)
|
|||||||
Store("TimeTransponder", TimeTransponder);
|
Store("TimeTransponder", TimeTransponder);
|
||||||
Store("MarginStart", MarginStart);
|
Store("MarginStart", MarginStart);
|
||||||
Store("MarginStop", MarginStop);
|
Store("MarginStop", MarginStop);
|
||||||
|
StoreLanguages("EPGLanguages", EPGLanguages);
|
||||||
Store("EPGScanTimeout", EPGScanTimeout);
|
Store("EPGScanTimeout", EPGScanTimeout);
|
||||||
Store("EPGBugfixLevel", EPGBugfixLevel);
|
Store("EPGBugfixLevel", EPGBugfixLevel);
|
||||||
Store("SVDRPTimeout", SVDRPTimeout);
|
Store("SVDRPTimeout", SVDRPTimeout);
|
||||||
|
6
config.h
6
config.h
@ -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.181 2004/01/05 11:31:54 kls Exp $
|
* $Id: config.h 1.182 2004/01/06 16:47:41 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -17,6 +17,7 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
#include "i18n.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define VDRVERSION "1.3.1"
|
#define VDRVERSION "1.3.1"
|
||||||
@ -195,6 +196,8 @@ class cSetup : public cConfig<cSetupLine> {
|
|||||||
private:
|
private:
|
||||||
void StoreCaCaps(const char *Name);
|
void StoreCaCaps(const char *Name);
|
||||||
bool ParseCaCaps(const char *Value);
|
bool ParseCaCaps(const char *Value);
|
||||||
|
void StoreLanguages(const char *Name, int *Values);
|
||||||
|
bool ParseLanguages(const char *Value, int *Values);
|
||||||
bool Parse(const char *Name, const char *Value);
|
bool Parse(const char *Name, const char *Value);
|
||||||
cSetupLine *Get(const char *Name, const char *Plugin = NULL);
|
cSetupLine *Get(const char *Name, const char *Plugin = NULL);
|
||||||
void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
|
void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
|
||||||
@ -216,6 +219,7 @@ public:
|
|||||||
int SetSystemTime;
|
int SetSystemTime;
|
||||||
int TimeTransponder;
|
int TimeTransponder;
|
||||||
int MarginStart, MarginStop;
|
int MarginStart, MarginStop;
|
||||||
|
int EPGLanguages[I18nNumLanguages + 1];
|
||||||
int EPGScanTimeout;
|
int EPGScanTimeout;
|
||||||
int EPGBugfixLevel;
|
int EPGBugfixLevel;
|
||||||
int SVDRPTimeout;
|
int SVDRPTimeout;
|
||||||
|
47
eit.c
47
eit.c
@ -8,11 +8,12 @@
|
|||||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||||
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
||||||
*
|
*
|
||||||
* $Id: eit.c 1.84 2004/01/02 22:27:29 kls Exp $
|
* $Id: eit.c 1.85 2004/01/09 15:44:43 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
#include "epg.h"
|
#include "epg.h"
|
||||||
|
#include "i18n.h"
|
||||||
#include "libsi/section.h"
|
#include "libsi/section.h"
|
||||||
#include "libsi/descriptor.h"
|
#include "libsi/descriptor.h"
|
||||||
|
|
||||||
@ -88,19 +89,36 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
|
|||||||
pEvent->SetTableID(Tid);
|
pEvent->SetTableID(Tid);
|
||||||
pEvent->SetEventID(SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-(
|
pEvent->SetEventID(SiEitEvent.getEventId()); // unfortunately some stations use different event ids for the same event in different tables :-(
|
||||||
|
|
||||||
|
int LanguagePreferenceShort = -1;
|
||||||
|
int LanguagePreferenceExt = -1;
|
||||||
|
bool UseExtendedEventDescriptor = false;
|
||||||
SI::Descriptor *d;
|
SI::Descriptor *d;
|
||||||
SI::ExtendedEventDescriptors exGroup;
|
SI::ExtendedEventDescriptors *ExtendedEventDescriptors = NULL;
|
||||||
char text[256];
|
SI::ShortEventDescriptor *ShortEventDescriptor = NULL;
|
||||||
for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) {
|
for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) {
|
||||||
switch (d->getDescriptorTag()) {
|
switch (d->getDescriptorTag()) {
|
||||||
case SI::ExtendedEventDescriptorTag:
|
case SI::ExtendedEventDescriptorTag: {
|
||||||
exGroup.Add((SI::ExtendedEventDescriptor *)d);
|
SI::ExtendedEventDescriptor *eed = (SI::ExtendedEventDescriptor *)d;
|
||||||
d = NULL; //so that it is not deleted
|
if (I18nIsPreferredLanguage(Setup.EPGLanguages, I18nLanguageIndex(eed->languageCode), LanguagePreferenceExt) || !ExtendedEventDescriptors) {
|
||||||
|
delete ExtendedEventDescriptors;
|
||||||
|
ExtendedEventDescriptors = new SI::ExtendedEventDescriptors;
|
||||||
|
UseExtendedEventDescriptor = true;
|
||||||
|
}
|
||||||
|
if (UseExtendedEventDescriptor) {
|
||||||
|
ExtendedEventDescriptors->Add(eed);
|
||||||
|
d = NULL; // so that it is not deleted
|
||||||
|
}
|
||||||
|
if (eed->getDescriptorNumber() == eed->getLastDescriptorNumber())
|
||||||
|
UseExtendedEventDescriptor = false;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SI::ShortEventDescriptorTag: {
|
case SI::ShortEventDescriptorTag: {
|
||||||
SI::ShortEventDescriptor *sed = (SI::ShortEventDescriptor *)d;
|
SI::ShortEventDescriptor *sed = (SI::ShortEventDescriptor *)d;
|
||||||
pEvent->SetTitle(sed->name.getText(text));
|
if (I18nIsPreferredLanguage(Setup.EPGLanguages, I18nLanguageIndex(sed->languageCode), LanguagePreferenceShort) || !ShortEventDescriptor) {
|
||||||
pEvent->SetShortText(sed->text.getText(text));
|
delete ShortEventDescriptor;
|
||||||
|
ShortEventDescriptor = sed;
|
||||||
|
d = NULL; // so that it is not deleted
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SI::ContentDescriptorTag:
|
case SI::ContentDescriptorTag:
|
||||||
@ -126,9 +144,18 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!rEvent) {
|
if (!rEvent) {
|
||||||
char buffer[exGroup.getMaximumTextLength()];
|
if (ShortEventDescriptor) {
|
||||||
pEvent->SetDescription(exGroup.getText(buffer));
|
char buffer[256];
|
||||||
|
pEvent->SetTitle(ShortEventDescriptor->name.getText(buffer));
|
||||||
|
pEvent->SetShortText(ShortEventDescriptor->text.getText(buffer));
|
||||||
|
}
|
||||||
|
if (ExtendedEventDescriptors) {
|
||||||
|
char buffer[ExtendedEventDescriptors->getMaximumTextLength()];
|
||||||
|
pEvent->SetDescription(ExtendedEventDescriptors->getText(buffer));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
delete ExtendedEventDescriptors;
|
||||||
|
delete ShortEventDescriptor;
|
||||||
|
|
||||||
pEvent->SetStartTime(SiEitEvent.getStartTime());
|
pEvent->SetStartTime(SiEitEvent.getStartTime());
|
||||||
pEvent->SetDuration(SiEitEvent.getDuration());
|
pEvent->SetDuration(SiEitEvent.getDuration());
|
||||||
|
18
epg.c
18
epg.c
@ -7,7 +7,7 @@
|
|||||||
* Original version (as used in VDR before 1.3.0) written by
|
* Original version (as used in VDR before 1.3.0) written by
|
||||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||||
*
|
*
|
||||||
* $Id: epg.c 1.3 2004/01/04 15:20:42 kls Exp $
|
* $Id: epg.c 1.4 2004/01/09 15:22:18 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "epg.h"
|
#include "epg.h"
|
||||||
@ -486,6 +486,12 @@ bool cSchedule::SetFollowingEvent(cEvent *Event)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cSchedule::ResetVersions(void)
|
||||||
|
{
|
||||||
|
for (cEvent *p = events.First(); p; p = events.Next(p))
|
||||||
|
p->SetVersion(0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
void cSchedule::Cleanup(void)
|
void cSchedule::Cleanup(void)
|
||||||
{
|
{
|
||||||
Cleanup(time(NULL));
|
Cleanup(time(NULL));
|
||||||
@ -613,6 +619,16 @@ void cSchedules::Cleanup(bool Force)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cSchedules::ResetVersions(void)
|
||||||
|
{
|
||||||
|
cSchedulesLock SchedulesLock(true);
|
||||||
|
cSchedules *s = (cSchedules *)Schedules(SchedulesLock);
|
||||||
|
if (s) {
|
||||||
|
for (cSchedule *Schedule = s->First(); Schedule; Schedule = s->Next(Schedule))
|
||||||
|
Schedule->ResetVersions();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool cSchedules::ClearAll(void)
|
bool cSchedules::ClearAll(void)
|
||||||
{
|
{
|
||||||
cSchedulesLock SchedulesLock(true, 1000);
|
cSchedulesLock SchedulesLock(true, 1000);
|
||||||
|
4
epg.h
4
epg.h
@ -7,7 +7,7 @@
|
|||||||
* Original version (as used in VDR before 1.3.0) written by
|
* Original version (as used in VDR before 1.3.0) written by
|
||||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||||
*
|
*
|
||||||
* $Id: epg.h 1.3 2004/01/03 17:00:25 kls Exp $
|
* $Id: epg.h 1.4 2004/01/09 15:21:05 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __EPG_H
|
#ifndef __EPG_H
|
||||||
@ -84,6 +84,7 @@ public:
|
|||||||
tChannelID ChannelID(void) const { return channelID; }
|
tChannelID ChannelID(void) const { return channelID; }
|
||||||
bool SetPresentEvent(cEvent *Event);
|
bool SetPresentEvent(cEvent *Event);
|
||||||
bool SetFollowingEvent(cEvent *Event);
|
bool SetFollowingEvent(cEvent *Event);
|
||||||
|
void ResetVersions(void);
|
||||||
void Cleanup(time_t Time);
|
void Cleanup(time_t Time);
|
||||||
void Cleanup(void);
|
void Cleanup(void);
|
||||||
cEvent *AddEvent(cEvent *Event);
|
cEvent *AddEvent(cEvent *Event);
|
||||||
@ -122,6 +123,7 @@ public:
|
|||||||
///< time the returned cSchedules is accessed. Once the cSchedules is no
|
///< time the returned cSchedules is accessed. Once the cSchedules is no
|
||||||
///< longer used, the cSchedulesLock must be destroyed.
|
///< longer used, the cSchedulesLock must be destroyed.
|
||||||
static void Cleanup(bool Force = false);
|
static void Cleanup(bool Force = false);
|
||||||
|
static void ResetVersions(void);
|
||||||
static bool ClearAll(void);
|
static bool ClearAll(void);
|
||||||
static bool Dump(FILE *f, const char *Prefix = "");
|
static bool Dump(FILE *f, const char *Prefix = "");
|
||||||
static bool Read(FILE *f = NULL);
|
static bool Read(FILE *f = NULL);
|
||||||
|
92
i18n.c
92
i18n.c
@ -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: i18n.c 1.138 2004/01/05 11:56:24 kls Exp $
|
* $Id: i18n.c 1.139 2004/01/09 15:48:03 kls Exp $
|
||||||
*
|
*
|
||||||
* Translations provided by:
|
* Translations provided by:
|
||||||
*
|
*
|
||||||
@ -111,6 +111,24 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"iso8859-1",
|
"iso8859-1",
|
||||||
"iso8859-1",
|
"iso8859-1",
|
||||||
},
|
},
|
||||||
|
// The 3-letter names of the language (this MUST be the third phrase!):
|
||||||
|
{ "eng",
|
||||||
|
"deu,ger",
|
||||||
|
"slv",
|
||||||
|
"ita",
|
||||||
|
"dut,nla",
|
||||||
|
"por",
|
||||||
|
"fra,fre",
|
||||||
|
"nor",
|
||||||
|
"fin",
|
||||||
|
"pol",
|
||||||
|
"esl,spa",
|
||||||
|
"ell,gre",
|
||||||
|
"sve,swe",
|
||||||
|
"ron,rum",
|
||||||
|
"hun",
|
||||||
|
"cat,cln",
|
||||||
|
},
|
||||||
// Menu titles:
|
// Menu titles:
|
||||||
{ "VDR",
|
{ "VDR",
|
||||||
"VDR",
|
"VDR",
|
||||||
@ -2227,6 +2245,40 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"Idöhöz tartozó Transponder",
|
"Idöhöz tartozó Transponder",
|
||||||
"Usar el temps del múltiplex",
|
"Usar el temps del múltiplex",
|
||||||
},
|
},
|
||||||
|
{ "Setup.EPG$Preferred languages",
|
||||||
|
"Bevorzugte Sprachen",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Suosikkikielet",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
},
|
||||||
|
{ "Setup.EPG$Preferred language",
|
||||||
|
"Bevorzugte Sprache",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Suosikkikieli",
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
},
|
||||||
{ "Setup.DVB$Primary DVB interface",
|
{ "Setup.DVB$Primary DVB interface",
|
||||||
"Primäres DVB Interface",
|
"Primäres DVB Interface",
|
||||||
"Primarna naprava",
|
"Primarna naprava",
|
||||||
@ -3920,3 +3972,41 @@ const char * const * I18nCharSets(void)
|
|||||||
{
|
{
|
||||||
return &Phrases[1][0];
|
return &Phrases[1][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char * I18nLanguageAbbreviation(int Index)
|
||||||
|
{
|
||||||
|
return Index < I18nNumLanguages ? Phrases[2][Index] : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int I18nLanguageIndex(const char Code[3])
|
||||||
|
{
|
||||||
|
char s[4];
|
||||||
|
memcpy(s, Code, 3);
|
||||||
|
s[3] = 0;
|
||||||
|
for (int i = 0; i < I18nNumLanguages; i++) {
|
||||||
|
if (strcasestr(Phrases[2][i], s))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
//dsyslog("unknown language code: '%s'", s);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool I18nIsPreferredLanguage(int *PreferredLanguages, int LanguageIndex, int &OldPreference)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < I18nNumLanguages; i++) {
|
||||||
|
if (PreferredLanguages[i] < 0)
|
||||||
|
break; // the language is not a preferred one
|
||||||
|
if (PreferredLanguages[i] == LanguageIndex) {
|
||||||
|
if (OldPreference < 0 || i < OldPreference) {
|
||||||
|
OldPreference = i;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OldPreference < 0) {
|
||||||
|
OldPreference = I18nNumLanguages; // higher than the maximum possible value
|
||||||
|
return true; // if we don't find a preferred one, we take the first one
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
5
i18n.h
5
i18n.h
@ -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: i18n.h 1.7 2003/10/19 15:02:05 kls Exp $
|
* $Id: i18n.h 1.8 2004/01/06 15:56:53 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __I18N_H
|
#ifndef __I18N_H
|
||||||
@ -22,6 +22,9 @@ const char *I18nTranslate(const char *s, const char *Plugin = NULL);
|
|||||||
|
|
||||||
const char * const * I18nLanguages(void);
|
const char * const * I18nLanguages(void);
|
||||||
const char * const * I18nCharSets(void);
|
const char * const * I18nCharSets(void);
|
||||||
|
const char * I18nLanguageAbbreviation(int Index);
|
||||||
|
int I18nLanguageIndex(const char Code[3]);
|
||||||
|
bool I18nIsPreferredLanguage(int *PreferredLanguages, int LanguageIndex, int &OldPreference);
|
||||||
|
|
||||||
#ifdef PLUGIN_NAME_I18N
|
#ifdef PLUGIN_NAME_I18N
|
||||||
#define tr(s) I18nTranslate(s, PLUGIN_NAME_I18N)
|
#define tr(s) I18nTranslate(s, PLUGIN_NAME_I18N)
|
||||||
|
70
menu.c
70
menu.c
@ -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.277 2004/01/05 11:51:33 kls Exp $
|
* $Id: menu.c 1.278 2004/01/09 15:42:59 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -2029,17 +2029,83 @@ eOSState cMenuSetupOSD::ProcessKey(eKeys Key)
|
|||||||
// --- cMenuSetupEPG ---------------------------------------------------------
|
// --- cMenuSetupEPG ---------------------------------------------------------
|
||||||
|
|
||||||
class cMenuSetupEPG : public cMenuSetupBase {
|
class cMenuSetupEPG : public cMenuSetupBase {
|
||||||
|
private:
|
||||||
|
int originalNumLanguages;
|
||||||
|
int numLanguages;
|
||||||
|
void Setup(void);
|
||||||
public:
|
public:
|
||||||
cMenuSetupEPG(void);
|
cMenuSetupEPG(void);
|
||||||
|
virtual eOSState ProcessKey(eKeys Key);
|
||||||
};
|
};
|
||||||
|
|
||||||
cMenuSetupEPG::cMenuSetupEPG(void)
|
cMenuSetupEPG::cMenuSetupEPG(void)
|
||||||
{
|
{
|
||||||
|
for (numLanguages = 0; numLanguages < I18nNumLanguages && data.EPGLanguages[numLanguages] >= 0; numLanguages++)
|
||||||
|
;
|
||||||
|
originalNumLanguages = numLanguages;
|
||||||
SetSection(tr("EPG"));
|
SetSection(tr("EPG"));
|
||||||
|
Setup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cMenuSetupEPG::Setup(void)
|
||||||
|
{
|
||||||
|
int current = Current();
|
||||||
|
|
||||||
|
Clear();
|
||||||
|
|
||||||
Add(new cMenuEditIntItem( tr("Setup.EPG$EPG scan timeout (h)"), &data.EPGScanTimeout));
|
Add(new cMenuEditIntItem( tr("Setup.EPG$EPG scan timeout (h)"), &data.EPGScanTimeout));
|
||||||
Add(new cMenuEditIntItem( tr("Setup.EPG$EPG bugfix level"), &data.EPGBugfixLevel, 0, MAXEPGBUGFIXLEVEL));
|
Add(new cMenuEditIntItem( tr("Setup.EPG$EPG bugfix level"), &data.EPGBugfixLevel, 0, MAXEPGBUGFIXLEVEL));
|
||||||
Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime));
|
Add(new cMenuEditBoolItem(tr("Setup.EPG$Set system time"), &data.SetSystemTime));
|
||||||
Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder));
|
if (data.SetSystemTime)
|
||||||
|
Add(new cMenuEditTranItem(tr("Setup.EPG$Use time from transponder"), &data.TimeTransponder));
|
||||||
|
Add(new cMenuEditIntItem( tr("Setup.EPG$Preferred languages"), &numLanguages, 0, I18nNumLanguages));
|
||||||
|
for (int i = 0; i < numLanguages; i++)
|
||||||
|
Add(new cMenuEditStraItem(tr("Setup.EPG$Preferred language"), &data.EPGLanguages[i], I18nNumLanguages, I18nLanguages()));
|
||||||
|
|
||||||
|
SetCurrent(Get(current));
|
||||||
|
Display();
|
||||||
|
}
|
||||||
|
|
||||||
|
eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
||||||
|
{
|
||||||
|
int oldnumLanguages = numLanguages;
|
||||||
|
int oldSetSystemTime = data.SetSystemTime;
|
||||||
|
|
||||||
|
eOSState state = cMenuSetupBase::ProcessKey(Key);
|
||||||
|
if (Key == kOk) {
|
||||||
|
bool Modified = numLanguages != originalNumLanguages;
|
||||||
|
if (!Modified) {
|
||||||
|
for (int i = 0; i < numLanguages; i++) {
|
||||||
|
if (data.EPGLanguages[i] != ::Setup.EPGLanguages[i]) {
|
||||||
|
Modified = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Modified)
|
||||||
|
cSchedules::ResetVersions();
|
||||||
|
}
|
||||||
|
else if (Key != kNone) {
|
||||||
|
if (numLanguages != oldnumLanguages || data.SetSystemTime != oldSetSystemTime) {
|
||||||
|
for (int i = oldnumLanguages; i < numLanguages; i++) {
|
||||||
|
data.EPGLanguages[i] = 0;
|
||||||
|
for (int l = 0; l < I18nNumLanguages; l++) {
|
||||||
|
int k;
|
||||||
|
for (k = 0; k < oldnumLanguages; k++) {
|
||||||
|
if (data.EPGLanguages[k] == l)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (k >= oldnumLanguages) {
|
||||||
|
data.EPGLanguages[i] = l;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.EPGLanguages[numLanguages] = -1;
|
||||||
|
Setup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- cMenuSetupDVB ---------------------------------------------------------
|
// --- cMenuSetupDVB ---------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user