2020-06-30 Fred Gleason <fredg@paravelsystems.com>

* Added a 'RDFeed::publicUrl()' static method.
	* Added a 'Public URL' column in the 'List Feeds' dialog in
	rdadmin(1).
	* Removed the 'Superfeed' and 'Description' columns from the
	main window of rdcastmanager(1).
	* Added a 'Public URL' column and a 'Copy URL to Clipboard'
	button to the main window of rdcastmanager(1).

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2020-06-30 15:15:19 -04:00
parent 85791995c7
commit 4f96349789
20 changed files with 194 additions and 49 deletions

View File

@ -20051,3 +20051,11 @@
devices to fail to be properly restored by the connection watchdog. devices to fail to be properly restored by the connection watchdog.
2020-06-11 Fred Gleason <fredg@paravelsystems.com> 2020-06-11 Fred Gleason <fredg@paravelsystems.com>
* Incremented the package version to 3.4.0rss0. * Incremented the package version to 3.4.0rss0.
2020-06-30 Fred Gleason <fredg@paravelsystems.com>
* Added a 'RDFeed::publicUrl()' static method.
* Added a 'Public URL' column in the 'List Feeds' dialog in
rdadmin(1).
* Removed the 'Superfeed' and 'Description' columns from the
main window of rdcastmanager(1).
* Added a 'Public URL' column and a 'Copy URL to Clipboard'
button to the main window of rdcastmanager(1).

View File

@ -1664,6 +1664,12 @@ QString RDFeed::imageFilename(int feed_id,int img_id,const QString &ext)
} }
QString RDFeed::publicUrl(const QString &base_url,const QString &keyname)
{
return base_url+"/"+keyname+"."+RD_RSS_XML_FILE_EXTENSION;
}
unsigned RDFeed::CreateCast(QString *filename,int bytes,int msecs) const unsigned RDFeed::CreateCast(QString *filename,int bytes,int msecs) const
{ {
QString sql; QString sql;

View File

@ -154,6 +154,7 @@ class RDFeed : public QObject
QString *err_msg,const QString &exemplar=""); QString *err_msg,const QString &exemplar="");
static QString errorString(RDFeed::Error err); static QString errorString(RDFeed::Error err);
static QString imageFilename(int feed_id,int img_id,const QString &ext); static QString imageFilename(int feed_id,int img_id,const QString &ext);
static QString publicUrl(const QString &base_url,const QString &keyname);
signals: signals:
void postProgressChanged(int step); void postProgressChanged(int step);

View File

@ -45,8 +45,7 @@ ListFeeds::ListFeeds(QWidget *parent)
// //
// Fix the Window Size // Fix the Window Size
// //
setMinimumWidth(sizeHint().width()); setMinimumSize(sizeHint());
setMinimumHeight(sizeHint().height());
setWindowTitle("RDAdmin - "+tr("Rivendell Feed List")); setWindowTitle("RDAdmin - "+tr("Rivendell Feed List"));
@ -93,14 +92,16 @@ ListFeeds::ListFeeds(QWidget *parent)
list_feeds_view->setColumnAlignment(0,Qt::AlignCenter|Qt::AlignVCenter); list_feeds_view->setColumnAlignment(0,Qt::AlignCenter|Qt::AlignVCenter);
list_feeds_view->addColumn(tr("Title")); list_feeds_view->addColumn(tr("Title"));
list_feeds_view->setColumnAlignment(1,Qt::AlignLeft); list_feeds_view->setColumnAlignment(1,Qt::AlignLeft);
list_feeds_view->addColumn(tr("Public URL"));
list_feeds_view->setColumnAlignment(2,Qt::AlignLeft);
list_feeds_view->addColumn(tr("Superfeed")); list_feeds_view->addColumn(tr("Superfeed"));
list_feeds_view->setColumnAlignment(2,Qt::AlignCenter|Qt::AlignVCenter);
list_feeds_view->addColumn(tr("AutoPost"));
list_feeds_view->setColumnAlignment(3,Qt::AlignCenter|Qt::AlignVCenter); list_feeds_view->setColumnAlignment(3,Qt::AlignCenter|Qt::AlignVCenter);
list_feeds_view->addColumn(tr("Keep Metadata")); list_feeds_view->addColumn(tr("AutoPost"));
list_feeds_view->setColumnAlignment(4,Qt::AlignCenter|Qt::AlignVCenter); list_feeds_view->setColumnAlignment(4,Qt::AlignCenter|Qt::AlignVCenter);
list_feeds_view->addColumn(tr("Creation Date")); list_feeds_view->addColumn(tr("Keep Metadata"));
list_feeds_view->setColumnAlignment(5,Qt::AlignCenter|Qt::AlignVCenter); list_feeds_view->setColumnAlignment(5,Qt::AlignCenter|Qt::AlignVCenter);
list_feeds_view->addColumn(tr("Creation Date"));
list_feeds_view->setColumnAlignment(6,Qt::AlignCenter|Qt::AlignVCenter);
QLabel *list_box_label=new QLabel(list_feeds_view,tr("&Feeds:"),this); QLabel *list_box_label=new QLabel(list_feeds_view,tr("&Feeds:"),this);
list_box_label->setFont(labelFont()); list_box_label->setFont(labelFont());
list_box_label->setGeometry(14,11,85,19); list_box_label->setGeometry(14,11,85,19);
@ -120,7 +121,7 @@ ListFeeds::~ListFeeds()
QSize ListFeeds::sizeHint() const QSize ListFeeds::sizeHint() const
{ {
return QSize(500,280); return QSize(800,300);
} }
@ -329,7 +330,8 @@ void ListFeeds::RefreshList()
"IS_SUPERFEED,"+ // 03 "IS_SUPERFEED,"+ // 03
"ENABLE_AUTOPOST,"+ // 04 "ENABLE_AUTOPOST,"+ // 04
"KEEP_METADATA,"+ // 05 "KEEP_METADATA,"+ // 05
"ORIGIN_DATETIME "+ // 06 "ORIGIN_DATETIME,"+ // 06
"BASE_URL "+ // 07
"from FEEDS"; "from FEEDS";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while (q->next()) { while (q->next()) {
@ -337,10 +339,12 @@ void ListFeeds::RefreshList()
item->setId(q->value(0).toInt()); item->setId(q->value(0).toInt());
item->setText(0,q->value(1).toString()); item->setText(0,q->value(1).toString());
item->setText(1,q->value(2).toString()); item->setText(1,q->value(2).toString());
item->setText(2,q->value(3).toString()); item->setText(2,RDFeed::publicUrl(q->value(7).toString(),
item->setText(3,q->value(4).toString()); q->value(1).toString()));
item->setText(4,q->value(5).toString()); item->setText(3,q->value(3).toString());
item->setText(5,q->value(6).toDateTime().toString("MM/dd/yyyy")); item->setText(4,q->value(4).toString());
item->setText(5,q->value(5).toString());
item->setText(6,q->value(6).toDateTime().toString("MM/dd/yyyy"));
} }
delete q; delete q;
} }
@ -357,17 +361,20 @@ void ListFeeds::RefreshItem(RDListViewItem *item)
"IS_SUPERFEED,"+ // 02 "IS_SUPERFEED,"+ // 02
"ENABLE_AUTOPOST,"+ // 03 "ENABLE_AUTOPOST,"+ // 03
"KEEP_METADATA,"+ // 04 "KEEP_METADATA,"+ // 04
"ORIGIN_DATETIME "+ // 05 "ORIGIN_DATETIME,"+ // 05
"BASE_URL "+ // 06
"from FEEDS where "+ "from FEEDS where "+
QString().sprintf("ID=%d",item->id()); QString().sprintf("ID=%d",item->id());
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
if(q->next()) { if(q->next()) {
item->setText(0,q->value(0).toString()); item->setText(0,q->value(0).toString());
item->setText(1,q->value(1).toString()); item->setText(1,q->value(1).toString());
item->setText(2,q->value(2).toString()); item->setText(2,RDFeed::publicUrl(q->value(0).toString(),
item->setText(3,q->value(3).toString()); q->value(6).toString()));
item->setText(4,q->value(4).toString()); item->setText(3,q->value(2).toString());
item->setText(5,q->value(5).toDateTime().toString("MM/dd/yyyy")); item->setText(4,q->value(3).toString());
item->setText(5,q->value(4).toString());
item->setText(6,q->value(5).toDateTime().toString("MM/dd/yyyy"));
} }
delete q; delete q;
} }

View File

@ -5183,6 +5183,10 @@ Stále ještě jej chcete smazat?</translation>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -4997,6 +4997,10 @@ Wollen Sie ihn immernoch löschen?</translation>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -5150,6 +5150,10 @@ Do you still want to delete it?</source>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -4147,6 +4147,10 @@ Permissions</source>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -4854,6 +4854,10 @@ Klikk på &quot;Lisens&quot;-knappen for fleire opplysningar.</translation>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -4854,6 +4854,10 @@ Klikk på &quot;Lisens&quot;-knappen for fleire opplysningar.</translation>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -4977,6 +4977,10 @@ Você ainda quer Deletar?</translation>
<source>Deleting remote audio...</source> <source>Deleting remote audio...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Public URL</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>ListGpis</name> <name>ListGpis</name>

View File

@ -19,9 +19,11 @@
// //
#include <qapplication.h> #include <qapplication.h>
#include <qclipboard.h>
#include <qtranslator.h> #include <qtranslator.h>
#include <qmessagebox.h> #include <qmessagebox.h>
#include <rdconf.h>
#include <rdescape_string.h> #include <rdescape_string.h>
#include <rdpodcast.h> #include <rdpodcast.h>
@ -104,6 +106,8 @@ MainWidget::MainWidget(RDConfig *c,QWidget *parent)
cast_feed_list=new RDListView(this); cast_feed_list=new RDListView(this);
cast_feed_list->setAllColumnsShowFocus(true); cast_feed_list->setAllColumnsShowFocus(true);
cast_feed_list->setItemMargin(5); cast_feed_list->setItemMargin(5);
connect(cast_feed_list,SIGNAL(clicked(Q3ListViewItem *)),
this,SLOT(feedClickedData(Q3ListViewItem *)));
connect(cast_feed_list, connect(cast_feed_list,
SIGNAL(doubleClicked(Q3ListViewItem *,const QPoint &,int)), SIGNAL(doubleClicked(Q3ListViewItem *,const QPoint &,int)),
this, this,
@ -112,28 +116,35 @@ MainWidget::MainWidget(RDConfig *c,QWidget *parent)
cast_feed_list->setColumnAlignment(0,Qt::AlignCenter); cast_feed_list->setColumnAlignment(0,Qt::AlignCenter);
cast_feed_list->addColumn(tr("Key Name")); cast_feed_list->addColumn(tr("Key Name"));
cast_feed_list->setColumnAlignment(1,Qt::AlignHCenter); cast_feed_list->setColumnAlignment(1,Qt::AlignLeft);
cast_feed_list->addColumn(tr("Feed Name")); cast_feed_list->addColumn(tr("Feed Name"));
cast_feed_list->setColumnAlignment(2,Qt::AlignLeft); cast_feed_list->setColumnAlignment(2,Qt::AlignLeft);
cast_feed_list->addColumn(tr("Superfeed")); cast_feed_list->addColumn(tr("Casts"));
cast_feed_list->setColumnAlignment(3,Qt::AlignCenter); cast_feed_list->setColumnAlignment(3,Qt::AlignCenter);
cast_feed_list->addColumn(tr("Description")); cast_feed_list->addColumn(tr("Public URL"));
cast_feed_list->setColumnAlignment(4,Qt::AlignLeft); cast_feed_list->setColumnAlignment(4,Qt::AlignLeft);
cast_feed_list->addColumn(tr("Casts"));
cast_feed_list->setColumnAlignment(5,Qt::AlignCenter);
// //
// Open Button // Open Button
// //
cast_open_button=new QPushButton(this); cast_open_button=new QPushButton(this);
cast_open_button->setFont(buttonFont()); cast_open_button->setFont(buttonFont());
cast_open_button->setText(tr("&View\nFeed")); cast_open_button->setText(tr("&View\nFeed"));
cast_open_button->setDisabled(true);
connect(cast_open_button,SIGNAL(clicked()),this,SLOT(openData())); connect(cast_open_button,SIGNAL(clicked()),this,SLOT(openData()));
//
// Copy Button
//
cast_copy_button=new QPushButton(this);
cast_copy_button->setFont(buttonFont());
cast_copy_button->setText(tr("Copy URL to\nClipboard"));
cast_copy_button->setDisabled(true);
connect(cast_copy_button,SIGNAL(clicked()),this,SLOT(copyData()));
// //
// Close Button // Close Button
// //
@ -170,6 +181,13 @@ void MainWidget::userChangedData()
} }
void MainWidget::feedClickedData(Q3ListViewItem *item)
{
cast_open_button->setDisabled(item==NULL);
cast_copy_button->setDisabled(item==NULL);
}
void MainWidget::openData() void MainWidget::openData()
{ {
RDListViewItem *item=(RDListViewItem *)cast_feed_list->selectedItem(); RDListViewItem *item=(RDListViewItem *)cast_feed_list->selectedItem();
@ -183,6 +201,16 @@ void MainWidget::openData()
} }
void MainWidget::copyData()
{
RDListViewItem *item=(RDListViewItem *)cast_feed_list->selectedItem();
if(item==NULL) {
return;
}
QApplication::clipboard()->setText(item->text(4));
}
void MainWidget::feedDoubleclickedData(Q3ListViewItem *,const QPoint &,int) void MainWidget::feedDoubleclickedData(Q3ListViewItem *,const QPoint &,int)
{ {
openData(); openData();
@ -200,6 +228,7 @@ void MainWidget::resizeEvent(QResizeEvent *e)
if(cast_resize) { if(cast_resize) {
cast_feed_list->setGeometry(10,10,size().width()-20,size().height()-70); cast_feed_list->setGeometry(10,10,size().width()-20,size().height()-70);
cast_open_button->setGeometry(10,size().height()-55,80,50); cast_open_button->setGeometry(10,size().height()-55,80,50);
cast_copy_button->setGeometry(120,size().height()-55,100,50);
cast_close_button->setGeometry(size().width()-90,size().height()-55,80,50); cast_close_button->setGeometry(size().width()-90,size().height()-55,80,50);
} }
} }
@ -214,16 +243,16 @@ void MainWidget::RefreshItem(RDListViewItem *item)
int total=0; int total=0;
sql=QString("select ")+ sql=QString("select ")+
"CHANNEL_TITLE,"+ // 00 "CHANNEL_TITLE,"+ // 00
"IS_SUPERFEED,"+ // 01 "IS_SUPERFEED,"+ // 01
"CHANNEL_DESCRIPTION,"+ // 02 "ID,"+ // 02
"ID "+ // 03 "BASE_URL "+ // 03
"from FEEDS where "+ "from FEEDS where "+
"KEY_NAME=\""+RDEscapeString(item->text(1))+"\""; "KEY_NAME=\""+RDEscapeString(item->text(1))+"\"";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
sql=QString().sprintf("select STATUS from PODCASTS where FEED_ID=%u", sql=QString().sprintf("select STATUS from PODCASTS where FEED_ID=%u",
q->value(3).toUInt()); q->value(2).toUInt());
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
while(q1->next()) { while(q1->next()) {
total++; total++;
@ -245,9 +274,13 @@ void MainWidget::RefreshItem(RDListViewItem *item)
item->setPixmap(0,*cast_redx_map); item->setPixmap(0,*cast_redx_map);
} }
item->setText(2,q->value(0).toString()); item->setText(2,q->value(0).toString());
item->setText(3,q->value(1).toString()); if(RDBool(q->value(1).toString())) {
item->setText(4,q->value(2).toString()); item->setText(3,tr("[superfeed]"));
item->setText(5,QString().sprintf("%d / %d",active,total)); }
else {
item->setText(3,QString().sprintf("%d / %d",active,total));
}
item->setText(4,RDFeed::publicUrl(q->value(3).toString(),item->text(1)));
} }
delete q; delete q;
} }

View File

@ -2,7 +2,7 @@
// //
// A RSS Feed Management Utility for Rivendell. // A RSS Feed Management Utility for Rivendell.
// //
// (C) Copyright 2002-2018 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as // it under the terms of the GNU General Public License version 2 as
@ -39,7 +39,9 @@ class MainWidget : public RDWidget
private slots: private slots:
void openData(); void openData();
void copyData();
void userChangedData(); void userChangedData();
void feedClickedData(Q3ListViewItem *item);
void feedDoubleclickedData(Q3ListViewItem *item,const QPoint &pt,int col); void feedDoubleclickedData(Q3ListViewItem *item,const QPoint &pt,int col);
void quitMainWidget(); void quitMainWidget();
@ -54,6 +56,7 @@ class MainWidget : public RDWidget
QPixmap *cast_greencheckmark_map; QPixmap *cast_greencheckmark_map;
QPixmap *cast_redx_map; QPixmap *cast_redx_map;
QPushButton *cast_open_button; QPushButton *cast_open_button;
QPushButton *cast_copy_button;
QPushButton *cast_close_button; QPushButton *cast_close_button;
bool cast_resize; bool cast_resize;
}; };

View File

@ -334,7 +334,7 @@ Podcast trotzdem löschen?</translation>
</message> </message>
<message> <message>
<source>Description</source> <source>Description</source>
<translation>Popis</translation> <translation type="obsolete">Popis</translation>
</message> </message>
<message> <message>
<source>Casts</source> <source>Casts</source>
@ -367,7 +367,16 @@ přívod</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View File

@ -323,7 +323,7 @@ Podcast trotzdem löschen?</translation>
</message> </message>
<message> <message>
<source>Description</source> <source>Description</source>
<translation>Beschreibung</translation> <translation type="obsolete">Beschreibung</translation>
</message> </message>
<message> <message>
<source>Casts</source> <source>Casts</source>
@ -356,7 +356,16 @@ Feed</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View File

@ -274,7 +274,7 @@ Suscripción</translation>
</message> </message>
<message> <message>
<source>Description</source> <source>Description</source>
<translation>Descripción</translation> <translation type="obsolete">Descripción</translation>
</message> </message>
<message> <message>
<source>Casts</source> <source>Casts</source>
@ -306,7 +306,16 @@ Feed</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View File

@ -251,10 +251,6 @@ Car&amp;t/Cut</source>
<source>Feed Name</source> <source>Feed Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Casts</source> <source>Casts</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -285,7 +281,16 @@ Feed</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View File

@ -322,7 +322,7 @@ Vil du halda fram med å sletta podkasten?</translation>
</message> </message>
<message> <message>
<source>Description</source> <source>Description</source>
<translation>Skildring</translation> <translation type="obsolete">Skildring</translation>
</message> </message>
<message> <message>
<source>Casts</source> <source>Casts</source>
@ -355,7 +355,16 @@ straum</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View File

@ -322,7 +322,7 @@ Vil du halda fram med å sletta podkasten?</translation>
</message> </message>
<message> <message>
<source>Description</source> <source>Description</source>
<translation>Skildring</translation> <translation type="obsolete">Skildring</translation>
</message> </message>
<message> <message>
<source>Casts</source> <source>Casts</source>
@ -355,7 +355,16 @@ straum</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>

View File

@ -288,7 +288,7 @@ Continuar deletando cast?</translation>
</message> </message>
<message> <message>
<source>Description</source> <source>Description</source>
<translation>Descrição</translation> <translation type="obsolete">Descrição</translation>
</message> </message>
<message> <message>
<source>Casts</source> <source>Casts</source>
@ -321,7 +321,16 @@ Feed</translation>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Superfeed</source> <source>Public URL</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy URL to
Clipboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>[superfeed]</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>