mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Implemented '0' key function in the "Schedule" menu
This commit is contained in:
parent
1de5335922
commit
197b8c27fa
7
HISTORY
7
HISTORY
@ -4135,7 +4135,7 @@ Video Disk Recorder Revision History
|
|||||||
Schneider).
|
Schneider).
|
||||||
- Cleaned up some trailing white space.
|
- Cleaned up some trailing white space.
|
||||||
|
|
||||||
2006-01-14: Version 1.3.39
|
2006-01-15: Version 1.3.39
|
||||||
|
|
||||||
- The SVDRP command LSTT now accepts the new option 'id' to have the channels
|
- The SVDRP command LSTT now accepts the new option 'id' to have the channels
|
||||||
of the timers listed with their unique channel ids instead of their numbers
|
of the timers listed with their unique channel ids instead of their numbers
|
||||||
@ -4176,3 +4176,8 @@ Video Disk Recorder Revision History
|
|||||||
(suggested by Andreas Brachold).
|
(suggested by Andreas Brachold).
|
||||||
- The SVDRP command GRAB allows file names without extension again (suggested by
|
- The SVDRP command GRAB allows file names without extension again (suggested by
|
||||||
Stefan Huelswitt).
|
Stefan Huelswitt).
|
||||||
|
- Pressing '0' in the "Schedule" menu now rotates through displaying "This event on
|
||||||
|
this channel", "This event on all channels" and "All events on all channels".
|
||||||
|
This can be used to find reruns of a given show, or the episodes of a series.
|
||||||
|
Note that if there are many channels in your channels.conf, displaying the
|
||||||
|
"All events on all channels" page may take a while.
|
||||||
|
6
MANUAL
6
MANUAL
@ -177,6 +177,12 @@ Version 1.3
|
|||||||
whether there is currently a DVB card receiving the transponder this channel
|
whether there is currently a DVB card receiving the transponder this channel
|
||||||
is on).
|
is on).
|
||||||
|
|
||||||
|
Pressing '0' in the "Schedule" menu rotates through displaying "This event on
|
||||||
|
this channel", "This event on all channels" and "All events on all channels".
|
||||||
|
This can be used to find reruns of a given show, or the episodes of a series.
|
||||||
|
Note that if there are many channels in your channels.conf, displaying the
|
||||||
|
"All events on all channels" page may take a while.
|
||||||
|
|
||||||
* Selecting a Channel
|
* Selecting a Channel
|
||||||
|
|
||||||
There are four ways to select a channel:
|
There are four ways to select a channel:
|
||||||
|
65
i18n.c
65
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.234 2006/01/13 16:24:07 kls Exp $
|
* $Id: i18n.c 1.235 2006/01/15 12:22:15 kls Exp $
|
||||||
*
|
*
|
||||||
* Translations provided by:
|
* Translations provided by:
|
||||||
*
|
*
|
||||||
@ -441,6 +441,69 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"Programm - %s",
|
"Programm - %s",
|
||||||
"Program - %s",
|
"Program - %s",
|
||||||
},
|
},
|
||||||
|
{ "This event - %s",
|
||||||
|
"Diese Sendung - %s",
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
},
|
||||||
|
{ "This event - all channels",
|
||||||
|
"Diese Sendung - alle Kanäle",
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
},
|
||||||
|
{ "All events - all channels",
|
||||||
|
"Alle Sendungen - alle Kanäle",
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
"",//TODO
|
||||||
|
},
|
||||||
{ "What's on now?",
|
{ "What's on now?",
|
||||||
"Was läuft jetzt?",
|
"Was läuft jetzt?",
|
||||||
"Kaj je na sporedu?",
|
"Kaj je na sporedu?",
|
||||||
|
144
menu.c
144
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.393 2006/01/14 14:53:43 kls Exp $
|
* $Id: menu.c 1.394 2006/01/15 12:46:07 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -323,10 +323,10 @@ public:
|
|||||||
cMenuChannelItem(cChannel *Channel);
|
cMenuChannelItem(cChannel *Channel);
|
||||||
static void SetSortMode(eChannelSortMode SortMode) { sortMode = SortMode; }
|
static void SetSortMode(eChannelSortMode SortMode) { sortMode = SortMode; }
|
||||||
static void IncSortMode(void) { sortMode = eChannelSortMode((sortMode == csmProvider) ? csmNumber : sortMode + 1); }
|
static void IncSortMode(void) { sortMode = eChannelSortMode((sortMode == csmProvider) ? csmNumber : sortMode + 1); }
|
||||||
|
static eChannelSortMode SortMode(void) { return sortMode; }
|
||||||
virtual int Compare(const cListObject &ListObject) const;
|
virtual int Compare(const cListObject &ListObject) const;
|
||||||
virtual void Set(void);
|
virtual void Set(void);
|
||||||
cChannel *Channel(void) { return channel; }
|
cChannel *Channel(void) { return channel; }
|
||||||
static eChannelSortMode SortMode(void) { return sortMode; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
cMenuChannelItem::eChannelSortMode cMenuChannelItem::sortMode = csmNumber;
|
cMenuChannelItem::eChannelSortMode cMenuChannelItem::sortMode = csmNumber;
|
||||||
@ -961,22 +961,45 @@ eOSState cMenuEvent::ProcessKey(eKeys Key)
|
|||||||
// --- cMenuScheduleItem -----------------------------------------------------
|
// --- cMenuScheduleItem -----------------------------------------------------
|
||||||
|
|
||||||
class cMenuScheduleItem : public cOsdItem {
|
class cMenuScheduleItem : public cOsdItem {
|
||||||
|
public:
|
||||||
|
enum eScheduleSortMode { ssmAllThis, ssmThisThis, ssmThisAll, ssmAllAll }; // "which event(s) on which channel(s)"
|
||||||
|
private:
|
||||||
|
static eScheduleSortMode sortMode;
|
||||||
public:
|
public:
|
||||||
const cEvent *event;
|
const cEvent *event;
|
||||||
const cChannel *channel;
|
const cChannel *channel;
|
||||||
|
bool withDate;
|
||||||
int timerMatch;
|
int timerMatch;
|
||||||
cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL);
|
cMenuScheduleItem(const cEvent *Event, cChannel *Channel = NULL, bool WithDate = false);
|
||||||
|
static void SetSortMode(eScheduleSortMode SortMode) { sortMode = SortMode; }
|
||||||
|
static void IncSortMode(void) { sortMode = eScheduleSortMode((sortMode == ssmAllAll) ? ssmAllThis : sortMode + 1); }
|
||||||
|
static eScheduleSortMode SortMode(void) { return sortMode; }
|
||||||
|
virtual int Compare(const cListObject &ListObject) const;
|
||||||
bool Update(bool Force = false);
|
bool Update(bool Force = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event, cChannel *Channel)
|
cMenuScheduleItem::eScheduleSortMode cMenuScheduleItem::sortMode = ssmAllThis;
|
||||||
|
|
||||||
|
cMenuScheduleItem::cMenuScheduleItem(const cEvent *Event, cChannel *Channel, bool WithDate)
|
||||||
{
|
{
|
||||||
event = Event;
|
event = Event;
|
||||||
channel = Channel;
|
channel = Channel;
|
||||||
|
withDate = WithDate;
|
||||||
timerMatch = tmNone;
|
timerMatch = tmNone;
|
||||||
Update(true);
|
Update(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cMenuScheduleItem::Compare(const cListObject &ListObject) const
|
||||||
|
{
|
||||||
|
cMenuScheduleItem *p = (cMenuScheduleItem *)&ListObject;
|
||||||
|
int r = -1;
|
||||||
|
if (sortMode != ssmAllThis)
|
||||||
|
r = strcoll(event->Title(), p->event->Title());
|
||||||
|
if (sortMode == ssmAllThis || r == 0)
|
||||||
|
r = event->StartTime() - p->event->StartTime();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static char *TimerMatchChars = " tT";
|
static char *TimerMatchChars = " tT";
|
||||||
|
|
||||||
bool cMenuScheduleItem::Update(bool Force)
|
bool cMenuScheduleItem::Update(bool Force)
|
||||||
@ -989,7 +1012,9 @@ bool cMenuScheduleItem::Update(bool Force)
|
|||||||
char t = TimerMatchChars[timerMatch];
|
char t = TimerMatchChars[timerMatch];
|
||||||
char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' ';
|
char v = event->Vps() && (event->Vps() - event->StartTime()) ? 'V' : ' ';
|
||||||
char r = event->IsRunning() ? '*' : ' ';
|
char r = event->IsRunning() ? '*' : ' ';
|
||||||
if (channel)
|
if (channel && withDate)
|
||||||
|
asprintf(&buffer, "%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), 6, *event->GetDateString(), *event->GetTimeString(), t, v, r, event->Title());
|
||||||
|
else if (channel)
|
||||||
asprintf(&buffer, "%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), *event->GetTimeString(), t, v, r, event->Title());
|
asprintf(&buffer, "%d\t%.*s\t%s\t%c%c%c\t%s", channel->Number(), 6, channel->ShortName(true), *event->GetTimeString(), t, v, r, event->Title());
|
||||||
else
|
else
|
||||||
asprintf(&buffer, "%.*s\t%s\t%c%c%c\t%s", 6, *event->GetDateString(), *event->GetTimeString(), t, v, r, event->Title());
|
asprintf(&buffer, "%.*s\t%s\t%c%c%c\t%s", 6, *event->GetDateString(), *event->GetTimeString(), t, v, r, event->Title());
|
||||||
@ -1163,9 +1188,13 @@ private:
|
|||||||
bool now, next;
|
bool now, next;
|
||||||
int otherChannel;
|
int otherChannel;
|
||||||
int helpKeys;
|
int helpKeys;
|
||||||
|
eOSState Number(void);
|
||||||
eOSState Record(void);
|
eOSState Record(void);
|
||||||
eOSState Switch(void);
|
eOSState Switch(void);
|
||||||
void PrepareSchedule(cChannel *Channel);
|
void PrepareScheduleAllThis(const cEvent *Event, const cChannel *Channel);
|
||||||
|
void PrepareScheduleThisThis(const cEvent *Event, const cChannel *Channel);
|
||||||
|
void PrepareScheduleThisAll(const cEvent *Event, const cChannel *Channel);
|
||||||
|
void PrepareScheduleAllAll(const cEvent *Event, const cChannel *Channel);
|
||||||
bool Update(void);
|
bool Update(void);
|
||||||
void SetHelpKeys(void);
|
void SetHelpKeys(void);
|
||||||
public:
|
public:
|
||||||
@ -1175,16 +1204,17 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
cMenuSchedule::cMenuSchedule(void)
|
cMenuSchedule::cMenuSchedule(void)
|
||||||
:cOsdMenu("", 7, 6, 4)
|
:cOsdMenu("")
|
||||||
{
|
{
|
||||||
now = next = false;
|
now = next = false;
|
||||||
otherChannel = 0;
|
otherChannel = 0;
|
||||||
helpKeys = -1;
|
helpKeys = -1;
|
||||||
|
cMenuScheduleItem::SetSortMode(cMenuScheduleItem::ssmAllThis);
|
||||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
if (channel) {
|
if (channel) {
|
||||||
cMenuWhatsOn::SetCurrentChannel(channel->Number());
|
cMenuWhatsOn::SetCurrentChannel(channel->Number());
|
||||||
schedules = cSchedules::Schedules(schedulesLock);
|
schedules = cSchedules::Schedules(schedulesLock);
|
||||||
PrepareSchedule(channel);
|
PrepareScheduleAllThis(NULL, channel);
|
||||||
SetHelpKeys();
|
SetHelpKeys();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1194,21 +1224,80 @@ cMenuSchedule::~cMenuSchedule()
|
|||||||
cMenuWhatsOn::ScheduleEvent(); // makes sure any posted data is cleared
|
cMenuWhatsOn::ScheduleEvent(); // makes sure any posted data is cleared
|
||||||
}
|
}
|
||||||
|
|
||||||
void cMenuSchedule::PrepareSchedule(cChannel *Channel)
|
void cMenuSchedule::PrepareScheduleAllThis(const cEvent *Event, const cChannel *Channel)
|
||||||
{
|
{
|
||||||
Clear();
|
Clear();
|
||||||
|
SetCols(7, 6, 4);
|
||||||
char *buffer = NULL;
|
char *buffer = NULL;
|
||||||
asprintf(&buffer, tr("Schedule - %s"), Channel->Name());
|
asprintf(&buffer, tr("Schedule - %s"), Channel->Name());
|
||||||
SetTitle(buffer);
|
SetTitle(buffer);
|
||||||
free(buffer);
|
free(buffer);
|
||||||
if (schedules) {
|
if (schedules && Channel) {
|
||||||
const cSchedule *Schedule = schedules->GetSchedule(Channel);
|
const cSchedule *Schedule = schedules->GetSchedule(Channel);
|
||||||
if (Schedule) {
|
if (Schedule) {
|
||||||
const cEvent *PresentEvent = Schedule->GetPresentEvent(Channel->Number() == cDevice::CurrentChannel());
|
const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent(Channel->Number() == cDevice::CurrentChannel());
|
||||||
time_t now = time(NULL) - Setup.EPGLinger * 60;
|
time_t now = time(NULL) - Setup.EPGLinger * 60;
|
||||||
for (const cEvent *Event = Schedule->Events()->First(); Event; Event = Schedule->Events()->Next(Event)) {
|
for (const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->Next(ev)) {
|
||||||
if (Event->EndTime() > now || Event == PresentEvent)
|
if (ev->EndTime() > now || ev == PresentEvent)
|
||||||
Add(new cMenuScheduleItem(Event), Event == PresentEvent);
|
Add(new cMenuScheduleItem(ev), ev == PresentEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cMenuSchedule::PrepareScheduleThisThis(const cEvent *Event, const cChannel *Channel)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
SetCols(7, 6, 4);
|
||||||
|
char *buffer = NULL;
|
||||||
|
asprintf(&buffer, tr("This event - %s"), Channel->Name());
|
||||||
|
SetTitle(buffer);
|
||||||
|
free(buffer);
|
||||||
|
if (schedules && Channel && Event) {
|
||||||
|
const cSchedule *Schedule = schedules->GetSchedule(Channel);
|
||||||
|
if (Schedule) {
|
||||||
|
time_t now = time(NULL) - Setup.EPGLinger * 60;
|
||||||
|
for (const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->Next(ev)) {
|
||||||
|
if ((ev->EndTime() > now || ev == Event) && !strcmp(ev->Title(), Event->Title()))
|
||||||
|
Add(new cMenuScheduleItem(ev), ev == Event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cMenuSchedule::PrepareScheduleThisAll(const cEvent *Event, const cChannel *Channel)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
SetCols(CHNUMWIDTH, 7, 7, 6, 4);
|
||||||
|
SetTitle(tr("This event - all channels"));
|
||||||
|
if (schedules && Event) {
|
||||||
|
for (cChannel *ch = Channels.First(); ch; ch = Channels.Next(ch)) {
|
||||||
|
const cSchedule *Schedule = schedules->GetSchedule(ch);
|
||||||
|
if (Schedule) {
|
||||||
|
time_t now = time(NULL) - Setup.EPGLinger * 60;
|
||||||
|
for (const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->Next(ev)) {
|
||||||
|
if ((ev->EndTime() > now || ev == Event) && !strcmp(ev->Title(), Event->Title()))
|
||||||
|
Add(new cMenuScheduleItem(ev, ch, true), ev == Event && ch == Channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cMenuSchedule::PrepareScheduleAllAll(const cEvent *Event, const cChannel *Channel)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
SetCols(CHNUMWIDTH, 7, 7, 6, 4);
|
||||||
|
SetTitle(tr("All events - all channels"));
|
||||||
|
if (schedules) {
|
||||||
|
for (cChannel *ch = Channels.First(); ch; ch = Channels.Next(ch)) {
|
||||||
|
const cSchedule *Schedule = schedules->GetSchedule(ch);
|
||||||
|
if (Schedule) {
|
||||||
|
time_t now = time(NULL) - Setup.EPGLinger * 60;
|
||||||
|
for (const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->Next(ev)) {
|
||||||
|
if (ev->EndTime() > now || ev == Event)
|
||||||
|
Add(new cMenuScheduleItem(ev, ch, true), ev == Event && ch == Channel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1241,6 +1330,29 @@ void cMenuSchedule::SetHelpKeys(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
eOSState cMenuSchedule::Number(void)
|
||||||
|
{
|
||||||
|
cMenuScheduleItem::IncSortMode();
|
||||||
|
cMenuScheduleItem *CurrentItem = (cMenuScheduleItem *)Get(Current());
|
||||||
|
const cChannel *Channel = NULL;
|
||||||
|
const cEvent *Event = NULL;
|
||||||
|
if (CurrentItem) {
|
||||||
|
Event = CurrentItem->event;
|
||||||
|
Channel = Channels.GetByChannelID(Event->ChannelID(), true);
|
||||||
|
}
|
||||||
|
switch (cMenuScheduleItem::SortMode()) {
|
||||||
|
case cMenuScheduleItem::ssmAllThis: PrepareScheduleAllThis(Event, Channel); break;
|
||||||
|
case cMenuScheduleItem::ssmThisThis: PrepareScheduleThisThis(Event, Channel); break;
|
||||||
|
case cMenuScheduleItem::ssmThisAll: PrepareScheduleThisAll(Event, Channel); break;
|
||||||
|
case cMenuScheduleItem::ssmAllAll: PrepareScheduleAllAll(Event, Channel); break;
|
||||||
|
}
|
||||||
|
CurrentItem = (cMenuScheduleItem *)Get(Current());
|
||||||
|
Sort();
|
||||||
|
SetCurrent(CurrentItem);
|
||||||
|
Display();
|
||||||
|
return osContinue;
|
||||||
|
}
|
||||||
|
|
||||||
eOSState cMenuSchedule::Record(void)
|
eOSState cMenuSchedule::Record(void)
|
||||||
{
|
{
|
||||||
cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current());
|
cMenuScheduleItem *item = (cMenuScheduleItem *)Get(Current());
|
||||||
@ -1290,6 +1402,7 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
|
|||||||
|
|
||||||
if (state == osUnknown) {
|
if (state == osUnknown) {
|
||||||
switch (Key) {
|
switch (Key) {
|
||||||
|
case k0: return Number();
|
||||||
case kRecord:
|
case kRecord:
|
||||||
case kRed: return Record();
|
case kRed: return Record();
|
||||||
case kGreen: if (schedules) {
|
case kGreen: if (schedules) {
|
||||||
@ -1325,7 +1438,8 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
|
|||||||
if (ei) {
|
if (ei) {
|
||||||
cChannel *channel = Channels.GetByChannelID(ei->ChannelID(), true);
|
cChannel *channel = Channels.GetByChannelID(ei->ChannelID(), true);
|
||||||
if (channel) {
|
if (channel) {
|
||||||
PrepareSchedule(channel);
|
cMenuScheduleItem::SetSortMode(cMenuScheduleItem::ssmAllThis);
|
||||||
|
PrepareScheduleAllThis(NULL, channel);
|
||||||
if (channel->Number() != cDevice::CurrentChannel()) {
|
if (channel->Number() != cDevice::CurrentChannel()) {
|
||||||
otherChannel = channel->Number();
|
otherChannel = channel->Number();
|
||||||
SetHelp(Count() ? tr("Button$Record") : NULL, tr("Button$Now"), tr("Button$Next"), tr("Button$Switch"));
|
SetHelp(Count() ? tr("Button$Record") : NULL, tr("Button$Now"), tr("Button$Next"), tr("Button$Switch"));
|
||||||
|
Loading…
Reference in New Issue
Block a user