Update localization string use and data

Review the code for proper use of localized strings. Fix display code to
always output them as utf8. Recreate the localization template with the
strings currently in use. Convert all existing .po files to utf8. Run
msgmerge on all .po files to update strings to match the new template.

Due to my lack of experience in using gettext and subsequent avoidance
of messing with it, the localization data has not been updated in quite
some time and most strings have become obsolete. This unfortunately has
resulted in wasted effort from some translators, most recently @J0hsHH
and @Strahinja, to whom I can only offer an apology and an invitation to
review their translations.
This commit is contained in:
Mike Sharov 2021-10-25 13:46:37 -04:00
parent dbea2ae857
commit 82e16c8630
30 changed files with 11841 additions and 10130 deletions

45
about.c
View File

@ -17,6 +17,7 @@
#include "main.h"
#include "about.h"
#include "uiutil.h"
#include <ncurses.h>
#include <sys/time.h>
@ -55,6 +56,11 @@ static unsigned nrand (unsigned r)
return rand() % r;
}
static void mvadd_center_utf8 (unsigned line, const char* text)
{
mvadd_utf8 (line, (COLS - utf8_length (text)) / 2u, text);
}
//----------------------------------------------------------------------
// Santa Hunta
@ -74,7 +80,9 @@ static void SHDrawGun (unsigned gun_pos)
static void SHDrawStatus (void)
{
attron (WA_BOLD);
mvprintw (LINES - 1, 1, _("Move: cursor or %c/%c; shoot: space; quit: %c"), _settings.keybindings.prev, _settings.keybindings.next, _settings.keybindings.quit);
char helpstr[128];
snprintf (helpstr, sizeof (helpstr), _("Move: cursor or %c/%c; shoot: space; quit: %c"), _settings.keybindings.prev, _settings.keybindings.next, _settings.keybindings.quit);
mvadd_utf8 (LINES - 1, 1, helpstr);
move (LINES - 1, COLS - 1);
attroff (WA_BOLD);
}
@ -83,15 +91,15 @@ static void SHDrawScore (int score, int level)
{
attron (WA_REVERSE);
mvhline (0, 0, ' ', COLS);
mvaddstr (0, 1, "Santa Hunta!");
mvadd_utf8 (0, 1, _("Santa Hunta!"));
char scorestr[16];
snprintf (scorestr, sizeof (scorestr), _("Score: %d"), score);
mvaddstr (0, COLS - strlen (scorestr) - 1, scorestr);
mvadd_utf8 (0, COLS - utf8_length (scorestr) - 1, scorestr);
char levelstr[16];
snprintf (levelstr, sizeof (levelstr), _("Level: %d"), level);
mvaddstr (0, (COLS - strlen (levelstr)) / 2u, levelstr);
mvadd_center_utf8 (0, levelstr);
attroff (WA_REVERSE);
}
@ -232,7 +240,7 @@ static void printFinalScore (unsigned score)
static void SHFinalScore (int score)
{
attron (WA_BOLD);
mvaddstr ((LINES - 5) / 2u - 2, (COLS - strlen ("Final score:")) / 2u, "Final score:");
mvadd_center_utf8 ((LINES - 5) / 2u - 2, _("Final score:"));
for (int k; (k = getch()) < ' ' || k > '~';) {
unsigned rand_color = 10 + nrand (6);
attron (COLOR_PAIR (rand_color));
@ -333,10 +341,9 @@ static void santaHunta (void)
void UIAbout (void)
{
if (COLS < 80) {
erase();
mvprintw (0, 0, _("Need at least 80 COLS terminal, sorry!"));
mvadd_utf8 (0, 0, _("Need at least 80 COLS terminal, sorry!"));
getch();
return;
}
@ -351,18 +358,20 @@ void UIAbout (void)
mvaddstr (5, xpos, " / \\ / | \\\\ \\/ / \\ | / / | \\\\ ___\\ \\ | / / \\");
mvaddstr (6, xpos, "/______ / / ___|___/ \\____/ /__|__/ / ___|___/ \\____ \\ /__|__/ /______ /");
mvaddstr (7, xpos, " \\/ \\/ \\/ \\/ \\/");
mvprintw (9, (COLS - strlen ("Version " SNOWNEWS_VERSTRING)) / 2u, "Version %s", SNOWNEWS_VERSTRING);
char verstrbuf [128];
snprintf (verstrbuf, sizeof(verstrbuf), _("Version %s"), SNOWNEWS_VERSTRING);
mvadd_center_utf8 (9, verstrbuf);
mvaddstr (11, COLS / 2 - (strlen (_("Brought to you by:"))) / 2, _("Brought to you by:"));
mvaddstr (13, COLS / 2 - (strlen (_("Main code"))) / 2, _("Main code"));
mvaddstr (14, COLS / 2 - 6, "Oliver Feiler");
mvaddstr (16, COLS / 2 - (strlen (_("Additional code"))) / 2, _("Additional code"));
mvaddstr (17, COLS / 2 - 4, "Rene Puls");
mvaddstr (19, COLS / 2 - (strlen (_("Translation team"))) / 2, _("Translation team"));
mvaddstr (20, COLS / 2 - 31, "Oliver Feiler, Frank van der Loo, Pascal Varet, Simon Isakovic,");
mvaddstr (21, COLS / 2 - 32, "Fernando J. Pereda, Marco Cova, Cheng-Lung Sung, Dmitry Petukhov");
mvaddstr (22, COLS / 2 - 26, "Douglas Campos, Ray Iwata, Piotr Ozarowski, Yang Huan");
mvaddstr (23, COLS / 2 - 15, "Ihar Hrachyshka, Mats Berglund");
mvadd_center_utf8 (11, _("Brought to you by:"));
mvadd_center_utf8 (13, _("Main code"));
mvadd_center_utf8 (14, "Oliver Feiler");
mvadd_center_utf8 (16, _("Additional code"));
mvadd_center_utf8 (17, "Mike Sharov, Rene Puls");
mvadd_center_utf8 (19, _("Translation team"));
mvadd_center_utf8 (20, "Frank van der Loo, Pascal Varet, Simon Isakovic, Страхиња Радић");
mvadd_center_utf8 (21, "Fernando J. Pereda, Marco Cova, Cheng-Lung Sung, Dmitry Petukhov");
mvadd_center_utf8 (22, "Douglas Campos, Ray Iwata, Piotr Ozarowski, Yang Huan");
mvadd_center_utf8 (23, "Ihar Hrachyshka, Mats Berglund, Johannes Hove-Henriksen");
key = getch();
}

101
conv.c
View File

@ -25,12 +25,6 @@
#include <openssl/evp.h>
#include <openssl/md5.h>
//----------------------------------------------------------------------
static int calcAgeInDays (const struct tm* t);
//----------------------------------------------------------------------
// This is a replacement for strsep which is not portable (missing on Solaris).
//
// http://www.winehq.com/hypermail/wine-patches/2001/11/0024.html
@ -303,74 +297,6 @@ time_t pubDateToUnix (const char* pubDate)
#endif
}
char* unixToPostDateString (time_t unixDate)
{
int len = 64;
char* time_str = malloc (len);
int strfstr_len = 32;
char* time_strfstr = malloc (strfstr_len);
struct tm t;
gmtime_r (&unixDate, &t);
strftime (time_strfstr, strfstr_len, _(", %H:%M"), &t);
strcpy (time_str, _("Posted "));
len -= strlen (_("Posted "));
if (len <= 0)
return NULL;
int age = calcAgeInDays (&t);
if (age == 0) {
strncat (time_str, _("today"), len - 1);
len -= strlen (_("today"));
if (len <= 0)
return NULL;
if (!(!t.tm_hour && !t.tm_min && !t.tm_sec))
strncat (time_str, time_strfstr, len - 1);
} else if (age == 1) {
strncat (time_str, _("yesterday"), len - 1);
len -= strlen (_("yesterday"));
if (len <= 0)
return NULL;
if (!(!t.tm_hour && !t.tm_min && !t.tm_sec))
strncat (time_str, time_strfstr, len - 1);
} else if ((age > 1) && (age < 7)) {
char tmpstr[32];
snprintf (tmpstr, sizeof (tmpstr), _("%d days ago"), age);
strncat (time_str, tmpstr, len - 1);
len -= strlen (tmpstr);
if (len <= 0)
return NULL;
if (!(!t.tm_hour && !t.tm_min && !t.tm_sec))
strncat (time_str, time_strfstr, len - 1);
} else if (age == 7) {
strncat (time_str, _("a week ago"), len - 1);
len -= strlen (_("a week ago"));
if (len <= 0)
return NULL;
if (!(!t.tm_hour && !t.tm_min && !t.tm_sec))
strncat (time_str, time_strfstr, len - 1);
} else if (age < 0) {
strcpy (time_str, _("Not yet posted: "));
len = 64 - strlen (_("Not yet posted: "));
if (!t.tm_hour && !t.tm_min && !t.tm_sec)
strftime (time_strfstr, strfstr_len, _("%x"), &t);
else
strftime (time_strfstr, strfstr_len, _("%x, %H:%M"), &t);
strncat (time_str, time_strfstr, len - 1);
} else {
if (!t.tm_hour && !t.tm_min && !t.tm_sec)
strftime (time_strfstr, strfstr_len, _("%x"), &t);
else
strftime (time_strfstr, strfstr_len, _("%x, %H:%M"), &t);
strncat (time_str, time_strfstr, len - 1);
}
free (time_strfstr);
return time_str;
}
static int calcAgeInDays (const struct tm* t)
{
time_t unix_t = time (NULL);
@ -380,3 +306,30 @@ static int calcAgeInDays (const struct tm* t)
// (((current year - passed year) * 365) + current year day) - passed year day
return (((current_t.tm_year - t->tm_year) * 365) + current_t.tm_yday) - t->tm_yday;
}
char* unixToPostDateString (time_t unixDate)
{
struct tm t;
gmtime_r (&unixDate, &t);
int age = calcAgeInDays (&t);
char daystr[32];
if (age == 0)
snprintf (daystr, sizeof(daystr), _("today"));
else if (age == 1)
snprintf (daystr, sizeof(daystr), _("yesterday"));
else if (age < 7)
snprintf (daystr, sizeof(daystr), _("%d days ago"), age);
else if (age == 7)
snprintf (daystr, sizeof(daystr), _("a week ago"));
else
strftime (daystr, sizeof(daystr), _("on %x"), &t);
char timestr[32] = "";
if (!(!t.tm_hour && !t.tm_min && !t.tm_sec))
strftime (timestr, sizeof(timestr), ", %R", &t);
char rstr[96];
snprintf (rstr, sizeof(rstr), "%s%s%s", _("Posted "), daystr, timestr);
return strdup (rstr);
}

153
dialog.c
View File

@ -28,8 +28,6 @@
char* UIOneLineEntryField (int x, int y)
{
char* text = malloc (512);
// UIStatus switches off attron!
attron (WA_REVERSE);
echo();
@ -39,7 +37,8 @@ char* UIOneLineEntryField (int x, int y)
// Beware of hardcoded textlength size!
// getnstr size does NOT include \0. This is really stupid and causes
// 1-byte overflows. Always size=len-1!
getnstr (text, 511);
char text [512] = {0};
getnstr (text, sizeof(text)-1);
noecho();
if (!_settings.cursor_always_visible)
@ -47,7 +46,7 @@ char* UIOneLineEntryField (int x, int y)
attroff (WA_REVERSE);
// This memory needs to be freed in the calling function!
return text;
return strdup (text);
}
void UIChangeBrowser (void)
@ -221,13 +220,14 @@ void FeedInfo (const struct feed* current_feed)
if (pauthinfo)
memmove (strstr (url, "://") + 3, pauthinfo + 1, strlen (pauthinfo));
UISupportDrawBox (5, 4, COLS - 6, 13);
unsigned boxw = COLS - 6, centerx = COLS / 2u, leftx = centerx - boxw/2 + 4;
UISupportDrawBox (5, 4, boxw, 13);
unsigned centerx = COLS / 2u;
attron (WA_REVERSE);
mvaddstr (5, centerx - ((strlen (current_feed->title)) / 2), current_feed->title);
mvaddnstr (7, centerx - (COLS / 2 - 7), url, COLS - 14);
move (8, centerx - (COLS / 2 - 7));
mvaddn_utf8 (5, centerx - utf8_length(current_feed->title), current_feed->title, boxw-8);
mvaddn_utf8 (7, leftx, url, boxw-8);
move (8, leftx);
if (current_feed->lastmodified) {
char timebuf [32] = "";
ctime_r (&current_feed->lastmodified, timebuf);
@ -235,9 +235,10 @@ void FeedInfo (const struct feed* current_feed)
if (timebuf[i] == '\n')
timebuf[i] = 0;
timebuf[sizeof(timebuf)-1] = 0;
printw (_("Last updated: %s"), timebuf);
add_utf8 (_("Last updated: "));
addstr (timebuf);
} else
addstr (_("No modification date."));
add_utf8 (_("No modification date."));
free (url);
url = NULL;
@ -247,14 +248,17 @@ void FeedInfo (const struct feed* current_feed)
free (hashme);
struct stat cachestat;
move (9, centerx - (COLS / 2 - 7));
move (9, leftx);
if (stat (cachefile, &cachestat) < 0)
addstr (_("Not in disk cache."));
else
printw (_("In disk cache: %jd bytes"), cachestat.st_size);
add_utf8 (_("Not in disk cache."));
else {
char cacheszbuf [64];
snprintf (cacheszbuf, sizeof(cacheszbuf), _("In disk cache: %jd bytes"), cachestat.st_size);
add_utf8 (cacheszbuf);
}
// Print category info
mvaddstr (10, centerx - (COLS / 2 - 7), _("Categories:"));
mvadd_utf8 (10, leftx, _("Categories:"));
addstr (" ");
if (current_feed->feedcategories == NULL)
addstr (_("none"));
@ -265,21 +269,23 @@ void FeedInfo (const struct feed* current_feed)
}
// Tell user if feed uses auth, but don't display the string.
move (11, centerx - (COLS / 2 - 7));
move (11, leftx);
if (current_feed->lasterror) {
addstr (_("Download failed: "));
addstr (current_feed->lasterror);
add_utf8 (_("Download failed: "));
add_utf8 (current_feed->lasterror);
} else if (pauthinfo)
addstr (_("Feed uses authentication."));
add_utf8 (_("Feed uses authentication."));
else
addstr (_("Feed does not use authentication."));
add_utf8 (_("Feed does not use authentication."));
// Display filter script if any.
if (current_feed->perfeedfilter != NULL) {
UISupportDrawBox (5, 13, COLS - 6, 14);
UISupportDrawBox (5, 13, boxw, 14);
attron (WA_REVERSE);
mvaddstr (13, 7, _("Filtered through:"));
mvaddnstr (13, 7 + strlen (_("Filtered through:")) + 1, current_feed->perfeedfilter, COLS - 14 - strlen (_("Filtered through:")));
const char* filteredmsg = _("Filtered through:");
mvadd_utf8 (13, leftx, filteredmsg);
addstr (" ");
addn_utf8 (current_feed->perfeedfilter, boxw-8-utf8_length(filteredmsg));
}
UIStatus (_("Displaying feed information."), 0, 0);
@ -293,7 +299,7 @@ bool UIDeleteFeed (const char* feedname)
UISupportDrawBox (3, 5, COLS - 3, 8);
attron (WA_REVERSE);
mvaddstr (6, COLS / 2 - 21, _("Are you sure you want to delete this feed?"));
mvadd_utf8 (6, COLS / 2 - 21, _("Are you sure you want to delete this feed?"));
mvprintw (7, 5, "%s", feedname);
UIStatus (_("Type 'y' to delete, any other key to abort."), 0, 0);
@ -325,28 +331,28 @@ void UIHelpScreen (void)
mvprintw (centery + 3, centerx - offset, "%c:", _settings.keybindings.nofilter);
mvprintw (centery + 4, centerx - offset, "%c:", _settings.keybindings.newheadlines);
mvprintw (centery + 5, centerx - offset, "%c:", _settings.keybindings.perfeedfilter);
mvaddstr (centery + 6, centerx - offset, _("tab:"));
mvadd_utf8 (centery + 6, centerx - offset, _("tab:"));
mvprintw (centery + 7, centerx - offset, "%c:", _settings.keybindings.about);
mvprintw (centery + 8, centerx - offset, "%c:", _settings.keybindings.quit);
// Descriptions
mvaddstr (centery - 9, centerx - offsetstr, _("Add RSS feed..."));
mvaddstr (centery - 8, centerx - offsetstr, _("Delete highlighted RSS feed..."));
mvaddstr (centery - 7, centerx - offsetstr, _("Rename feed..."));
mvaddstr (centery - 6, centerx - offsetstr, _("Reload all feeds"));
mvaddstr (centery - 5, centerx - offsetstr, _("Reload this feed"));
mvaddstr (centery - 4, centerx - offsetstr, _("Mark all read"));
mvaddstr (centery - 3, centerx - offsetstr, _("Change default browser..."));
mvaddstr (centery - 2, centerx - offsetstr, _("Move item up, down"));
mvaddstr (centery - 1, centerx - offsetstr, _("Sort feed list alphabetically"));
mvaddstr (centery, centerx - offsetstr, _("Categorize feed..."));
mvaddstr (centery + 1, centerx - offsetstr, _("Apply filter..."));
mvaddstr (centery + 2, centerx - offsetstr, _("Only current category"));
mvaddstr (centery + 3, centerx - offsetstr, _("Remove filter"));
mvaddstr (centery + 4, centerx - offsetstr, _("Show new headlines"));
mvaddstr (centery + 5, centerx - offsetstr, _("Add conversion filter..."));
mvaddstr (centery + 6, centerx - offsetstr, _("Type Ahead Find"));
mvaddstr (centery + 7, centerx - offsetstr, _("About"));
mvaddstr (centery + 8, centerx - offsetstr, _("Quit program"));
mvadd_utf8 (centery - 9, centerx - offsetstr, _("Add RSS feed..."));
mvadd_utf8 (centery - 8, centerx - offsetstr, _("Delete highlighted RSS feed..."));
mvadd_utf8 (centery - 7, centerx - offsetstr, _("Rename feed..."));
mvadd_utf8 (centery - 6, centerx - offsetstr, _("Reload all feeds"));
mvadd_utf8 (centery - 5, centerx - offsetstr, _("Reload this feed"));
mvadd_utf8 (centery - 4, centerx - offsetstr, _("Mark all read"));
mvadd_utf8 (centery - 3, centerx - offsetstr, _("Change default browser..."));
mvadd_utf8 (centery - 2, centerx - offsetstr, _("Move item up, down"));
mvadd_utf8 (centery - 1, centerx - offsetstr, _("Sort feed list alphabetically"));
mvadd_utf8 (centery, centerx - offsetstr, _("Categorize feed..."));
mvadd_utf8 (centery + 1, centerx - offsetstr, _("Apply filter..."));
mvadd_utf8 (centery + 2, centerx - offsetstr, _("Only current category"));
mvadd_utf8 (centery + 3, centerx - offsetstr, _("Remove filter"));
mvadd_utf8 (centery + 4, centerx - offsetstr, _("Show new headlines"));
mvadd_utf8 (centery + 5, centerx - offsetstr, _("Add conversion filter..."));
mvadd_utf8 (centery + 6, centerx - offsetstr, _("Type Ahead Find"));
mvadd_utf8 (centery + 7, centerx - offsetstr, _("About"));
mvadd_utf8 (centery + 8, centerx - offsetstr, _("Quit program"));
attroff (WA_REVERSE);
UIStatus (_("Press the any(tm) key to exit help screen."), 0, 0);
@ -361,9 +367,11 @@ void UIDisplayFeedHelp (void)
attron (WA_REVERSE);
// Keys
const int offset = 18, offsetstr = 7;
mvprintw (centery - 5, centerx - offset, _("%c, up:"), _settings.keybindings.prev);
mvprintw (centery - 4, centerx - offset, _("%c, down:"), _settings.keybindings.next);
mvaddstr (centery - 3, centerx - offset, _("enter:"));
mvprintw (centery - 5, centerx - offset, "%c", _settings.keybindings.prev);
add_utf8 (_(", up:"));
mvprintw (centery - 4, centerx - offset, "%c", _settings.keybindings.next);
add_utf8 (_(", down:"));
mvadd_utf8 (centery - 3, centerx - offset, _("enter:"));
mvprintw (centery - 2, centerx - offset, "%c:", _settings.keybindings.reload);
mvprintw (centery - 1, centerx - offset, "%c:", _settings.keybindings.forcereload);
mvprintw (centery, centerx - offset, "%c:", _settings.keybindings.urljump);
@ -371,21 +379,21 @@ void UIDisplayFeedHelp (void)
mvprintw (centery + 2, centerx - offset, "%c:", _settings.keybindings.markread);
mvprintw (centery + 3, centerx - offset, "%c:", _settings.keybindings.markunread);
mvprintw (centery + 4, centerx - offset, "%c:", _settings.keybindings.feedinfo);
mvaddstr (centery + 5, centerx - offset, _("tab:"));
mvadd_utf8 (centery + 5, centerx - offset, _("tab:"));
mvprintw (centery + 6, centerx - offset, "%c:", _settings.keybindings.prevmenu);
// Descriptions
mvprintw (centery - 5, centerx - offsetstr, _("Previous item"));
mvprintw (centery - 4, centerx - offsetstr, _("Next item"));
mvaddstr (centery - 3, centerx - offsetstr, _("View item"));
mvprintw (centery - 2, centerx - offsetstr, _("Reload this feed"));
mvprintw (centery - 1, centerx - offsetstr, _("Force reload this feed"));
mvprintw (centery, centerx - offsetstr, _("Open homepage"));
mvprintw (centery + 1, centerx - offsetstr, _("Open link"));
mvprintw (centery + 2, centerx - offsetstr, _("Mark all read"));
mvprintw (centery + 3, centerx - offsetstr, _("Toggle item read status"));
mvprintw (centery + 4, centerx - offsetstr, _("Show feed info..."));
mvaddstr (centery + 5, centerx - offsetstr, _("Type Ahead Find"));
mvprintw (centery + 6, centerx - offsetstr, _("Return to main menu"));
mvadd_utf8 (centery - 5, centerx - offsetstr, _("Previous item"));
mvadd_utf8 (centery - 4, centerx - offsetstr, _("Next item"));
mvadd_utf8 (centery - 3, centerx - offsetstr, _("View item"));
mvadd_utf8 (centery - 2, centerx - offsetstr, _("Reload this feed"));
mvadd_utf8 (centery - 1, centerx - offsetstr, _("Force reload this feed"));
mvadd_utf8 (centery, centerx - offsetstr, _("Open homepage"));
mvadd_utf8 (centery + 1, centerx - offsetstr, _("Open link"));
mvadd_utf8 (centery + 2, centerx - offsetstr, _("Mark all read"));
mvadd_utf8 (centery + 3, centerx - offsetstr, _("Toggle item read status"));
mvadd_utf8 (centery + 4, centerx - offsetstr, _("Show feed info..."));
mvadd_utf8 (centery + 5, centerx - offsetstr, _("Type Ahead Find"));
mvadd_utf8 (centery + 6, centerx - offsetstr, _("Return to main menu"));
attroff (WA_REVERSE);
UIStatus (_("Press the any(tm) key to exit help screen."), 0, 0);
@ -394,7 +402,6 @@ void UIDisplayFeedHelp (void)
void UIDisplayItemHelp (void)
{
unsigned centerx = COLS / 2u, centery = LINES / 2u;
UISupportDrawBox (centerx - 18, centery - 2, centerx + 18, centery + 3);
@ -404,12 +411,13 @@ void UIDisplayItemHelp (void)
mvprintw (centery - 1, centerx - offset, "%c, <-:", _settings.keybindings.prev);
mvprintw (centery, centerx - offset, "%c, ->:", _settings.keybindings.next);
mvprintw (centery + 1, centerx - offset, "%c:", _settings.keybindings.urljump);
mvprintw (centery + 2, centerx - offset, _("%c, enter:"), _settings.keybindings.prevmenu);
mvprintw (centery + 2, centerx - offset, "%c", _settings.keybindings.prevmenu);
add_utf8 (_(", enter:"));
// Descriptions
mvaddstr (centery - 1, centerx - offsetstr, _("Previous item"));
mvaddstr (centery, centerx - offsetstr, _("Next item"));
mvaddstr (centery + 1, centerx - offsetstr, _("Open link"));
mvaddstr (centery + 2, centerx - offsetstr, _("Return to overview"));
mvadd_utf8 (centery - 1, centerx - offsetstr, _("Previous item"));
mvadd_utf8 (centery, centerx - offsetstr, _("Next item"));
mvadd_utf8 (centery + 1, centerx - offsetstr, _("Open link"));
mvadd_utf8 (centery + 2, centerx - offsetstr, _("Return to overview"));
attroff (WA_REVERSE);
UIStatus (_("Press the any(tm) key to exit help screen."), 0, 0);
@ -438,13 +446,15 @@ void CategorizeFeed (struct feed* current_feed)
UISupportDrawBox ((COLS / 2) - 37, 2, (COLS / 2) + 37, 1 + 4 + nfeedcat + 1);
attron (WA_REVERSE);
mvprintw (3, (COLS / 2) - ((strlen (_("Category configuration for %s")) + strlen (current_feed->title)) / 2), _("Category configuration for %s"), current_feed->title);
char titlebuf [256];
snprintf (titlebuf, sizeof(titlebuf), _("Category configuration for %s"), current_feed->title);
mvadd_utf8 (3, (COLS - utf8_length(titlebuf))/2u, titlebuf);
char catletter = '1';
// No category defined yet
if (current_feed->feedcategories == NULL) {
unsigned y = 5;
mvaddstr (y, (COLS / 2) - 33, _("No category defined. Select one or add a new category:"));
mvadd_utf8 (y, (COLS / 2) - 33, _("No category defined. Select one or add a new category:"));
for (const struct categories * c = _settings.global_categories; c; ++y, c = c->next) {
mvprintw (y + 1, COLS / 2 - 33, "%c. %s", catletter, c->name);
if (++catletter == '9' + 1)
@ -455,7 +465,7 @@ void CategorizeFeed (struct feed* current_feed)
UIStatus (tmp, 0, 0);
} else {
unsigned y = 5;
mvaddstr (y, (COLS / 2) - 33, _("Categories defined for this feed:"));
mvadd_utf8 (y, (COLS / 2) - 33, _("Categories defined for this feed:"));
for (const struct feedcategories * c = current_feed->feedcategories; c; ++y, c = c->next) {
mvprintw (y + 1, COLS / 2 - 33, "%c. %s", catletter, c->name);
if (++catletter == '9' + 1)
@ -478,7 +488,7 @@ void CategorizeFeed (struct feed* current_feed)
attron (WA_REVERSE);
catletter = '1';
unsigned y = 5;
mvaddstr (y, (COLS / 2) - 33, _("Select a new category or add a new one:"));
mvadd_utf8 (y, (COLS / 2) - 33, _("Select a new category or add a new one:"));
for (const struct categories * c = _settings.global_categories; c; ++y, c = c->next) {
mvprintw (y + 1, COLS / 2 - 33, "%c. %s", catletter, c->name);
if (++catletter == '9' + 1)
@ -542,7 +552,8 @@ char* DialogGetCategoryFilter (void)
UISupportDrawBox ((COLS / 2) - 35, 2, (COLS / 2) + 35, nglobalcat + 4);
attron (WA_REVERSE);
mvaddstr (3, (COLS / 2) - (strlen (_("Select filter to apply")) / 2), _("Select filter to apply"));
const char* title = _("Select filter to apply");
mvaddstr (3, (COLS - utf8_length(title)) / 2u, title);
char catletter = '1';
unsigned y = 3;

View File

@ -381,7 +381,7 @@ void WriteCache (void)
unsigned count = 1;
int oldnumobjects = 0;
unsigned titlestrlen = strlen (_("Saving settings ["));
unsigned titlestrlen = utf8_length (_("Saving settings ["));
for (const struct feed* cur_ptr = _feed_list; cur_ptr; cur_ptr = cur_ptr->next) {
// Progress bar

60
main.c
View File

@ -110,7 +110,7 @@ static void modifyPIDFile (enum EPIDAction action)
if (action == pid_file_create) {
FILE* file = fopen (pid_path, "w");
if (!file) {
printf ("Unable to write PID file %s!", pid_path);
printf (_("Unable to write PID file %s!"), pid_path);
return;
}
fprintf (file, "%d", getpid());
@ -133,12 +133,14 @@ static void checkPIDFile (void)
pid_t pid = atoi (pidbuf);
if (kill (pid, 0) == 0) {
printf ("Snownews seems to be already running with process ID %d.\n", pid);
printf ("A pid file exists at \"%s\".\n", pid_path);
printf (_("Snownews seems to be already running with process ID %d.\n"
"A pid file exists at \"%s\".\n"), pid, pid_path);
exit (2);
} else {
printf ("A pid file exists at \"%s\",\nbut Snownews doesn't seem to be running. Delete that file and start it again.\n", pid_path);
printf ("Continue anyway? (y/n) ");
printf (_("A pid file exists at \"%s\",\n"
"but snownews doesn't seem to be running.\n"
"Delete that file and start it again.\n"
"Continue anyway? (y/n) "), pid_path);
char ybuf[2] = { };
fgets (ybuf, sizeof (ybuf), stdin);
if (ybuf[0] != 'y')
@ -206,13 +208,11 @@ _Noreturn void MainQuit (const char* func, const char* error)
printf ("Exiting via signal %d.\n", last_signal);
#endif
}
printf (_("Aborting program execution!\nAn internal error occured. Snownews has quit, no changes has been saved!\n"));
printf (_("Please submit a bugreport at https://github.com/msharov/snownews/issues\n"));
printf (_("Aborting program execution!\n"
"snownews quit without saving changes due to internal error!\n"
"Please submit a bugreport at https://github.com/msharov/snownews/issues\n"));
printf ("----\n");
// Please don't localize! I don't want to receive Japanese error messages.
// Thanks. :)
printf ("While executing: %s\n", func);
printf ("Error as reported by the system: %s\n\n", error);
printf (_("While executing: %s\nError: %s\n\n"), func, error);
exit (EXIT_FAILURE);
}
@ -257,18 +257,12 @@ static void InstallSignalHandlers (void)
static void printHelp (void)
{
printf (_("Snownews %s\n\n"), SNOWNEWS_VERSTRING);
printf (_("usage: snownews [-huV] [--help|--update|--version]\n\n"));
printf (_("\t--charset|-l\tForce using this charset.\n"));
printf (_("\t--cursor-on|-c\tForce cursor always visible.\n"));
printf (_("\t--help|-h\tPrint this help message.\n"));
printf (_("\t--update|-u\tAutomatically update every feed.\n"));
printf (_("\t--version|-V\tPrint version number and exit.\n"));
}
static void badOption (const char* arg)
{
printf (_("Option %s requires an argument.\n"), arg);
printf ("Snownews " SNOWNEWS_VERSTRING "\n\n");
printf (_("Usage: snownews [-chuV]\n\n"
" -h, --help\t\tPrint this help message.\n"
" -V, --version\t\tPrint version number and exit.\n"
" -c, --cursor-on\tForce cursor always visible.\n"
" -u, --update\t\tAutomatically update every feed.\n"));
}
//}}}-------------------------------------------------------------------
@ -308,26 +302,18 @@ int main (int argc, char* argv[])
bool autoupdate = false; // Automatically update feeds on app start... or not if set to 0.
for (int i = 1; i < argc; ++i) {
char* arg = argv[i];
if (strcmp (arg, "--version") == 0 || strcmp (arg, "-V") == 0) {
printf (_("Snownews version %s\n\n"), SNOWNEWS_VERSION);
return EXIT_SUCCESS;
} else if (strcmp (arg, "-u") == 0 || strcmp (arg, "--update") == 0) {
if (strcmp (arg, "-u") == 0 || strcmp (arg, "--update") == 0)
autoupdate = true;
} else if (strcmp (arg, "-c") == 0 || strcmp (arg, "--cursor-on") == 0) {
else if (strcmp (arg, "-c") == 0 || strcmp (arg, "--cursor-on") == 0)
_settings.cursor_always_visible = true;
} else if (strcmp (arg, "-l") == 0 || strcmp (arg, "--charset") == 0) {
const char* chset = argv[i++];
if (chset)
_settings.global_charset = chset;
else {
badOption (arg);
return EXIT_FAILURE;
}
else if (strcmp (arg, "--version") == 0 || strcmp (arg, "-V") == 0) {
printf ("snownews " SNOWNEWS_VERSTRING "\n");
return EXIT_SUCCESS;
} else if (strcmp (arg, "-h") == 0 || strcmp (arg, "--help") == 0) {
printHelp();
return EXIT_SUCCESS;
} else {
printf ("Unkown option given: \"%s\".\n", arg);
printf (_("Unknown option \"%s\"\n"), arg);
printHelp();
return EXIT_SUCCESS;
}

1
main.h
View File

@ -123,7 +123,6 @@ struct categories {
struct settings {
struct categories* global_categories;
const char* global_charset;
char* browser; // Browser command. lynx is standard.
char* proxyname; // Hostname of proxyserver.
unsigned short proxyport; // Port on proxyserver to use.

View File

@ -198,7 +198,7 @@ static void parse_rdf10_item (struct feed* feed, xmlDocPtr doc, xmlNodePtr node)
item->data->hash = genItemHash (hashitems, 3);
}
if (!item->data->title)
item->data->title = strdup ("Untitled");
item->data->title = strdup (_("No title"));
if (guid) {
xmlFree (guid);
guid = NULL;
@ -310,7 +310,7 @@ static void parse_atom_entry (struct feed* feed, xmlDocPtr doc, xmlNodePtr node)
item->data->hash = genItemHash (hashitems, 3);
}
if (!item->data->title)
item->data->title = strdup ("Untitled");
item->data->title = strdup (_("No title"));
if (guid) {
free (guid);
guid = NULL;
@ -452,7 +452,7 @@ int DeXML (struct feed* cur_ptr)
free (cur_ptr->title);
cur_ptr->title = strdup (cur_ptr->custom_title);
} else if (!cur_ptr->title)
cur_ptr->title = strdup ("Untitled");
cur_ptr->title = strdup (_("No title"));
if (cur_ptr->original)
free (cur_ptr->original);
cur_ptr->original = strdup (cur_ptr->title);

View File

@ -1,6 +1,6 @@
################ Source files ##########################################
po/srcs := $(filter-out po/messages.po,$(wildcard po/*.po))
po/srcs := $(filter-out po/snownews.pot,$(wildcard po/*.po))
po/objs := $(addprefix $O,$(po/srcs:.po=.mo))
locales := $(notdir $(po/srcs:.po=))

File diff suppressed because it is too large Load Diff

1109
po/de.po

File diff suppressed because it is too large Load Diff

934
po/es.po

File diff suppressed because it is too large Load Diff

995
po/fr.po

File diff suppressed because it is too large Load Diff

952
po/it.po

File diff suppressed because it is too large Load Diff

1046
po/ja.po

File diff suppressed because it is too large Load Diff

1103
po/ko.po

File diff suppressed because it is too large Load Diff

View File

@ -1,765 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#: about.c:275 about.c:276 main.c:114 net-support.c:100 netio.c:351
#: netio.c:352 netio.c:359 netio.c:360 netio.c:373 netio.c:374 netio.c:382
#: netio.c:383
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2004-09-22 12:10+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: about.c:254
msgid "Need at least 80 COLS terminal, sorry!"
msgstr ""
#: about.c:306 about.c:328
#, c-format
msgid "Version %s"
msgstr ""
#: about.c:307
msgid "Merry Christmas from the Snownews developers."
msgstr ""
#: about.c:308 about.c:331
msgid "Main code"
msgstr ""
#: about.c:310 about.c:333
msgid "Additional code"
msgstr ""
#: about.c:312 about.c:335
msgid "Translation team"
msgstr ""
#: about.c:328
msgid "Version"
msgstr ""
#: about.c:330
msgid "Brought to you by:"
msgstr ""
#: conversions.c:129 interface.c:164 interface.c:167
msgid "No description available."
msgstr ""
#: conversions.c:443
#, c-format
msgid "ERROR: zlib_uncompress: %d %s\n"
msgstr ""
#: conversions.c:459
msgid "ERROR: No output during decompression"
msgstr ""
#: conversions.c:492
msgid "ERROR: Invalid magic bytes for GZIP data"
msgstr ""
#: conversions.c:497
msgid "ERROR: Compression method is not deflate"
msgstr ""
#: conversions.c:502
#, c-format
msgid "ERROR: Unsupported flags %d\n"
msgstr ""
#: cookies.c:184
#, c-format
msgid "Cookie for %s has expired!"
msgstr ""
#: dialog.c:84 dialog.c:86
#, c-format
msgid "Current setting: %s"
msgstr ""
#: dialog.c:99 dialog.c:653 interface.c:1213 interface.c:1342
msgid "Aborted."
msgstr ""
#: dialog.c:106
#, c-format
msgid "Only %s format strings allowed for default browser!"
msgstr ""
#: dialog.c:111 ui-support.c:244
msgid ""
"Unsafe browser string (contains quotes)! See snownews.kcore.de/faq#toc2.4"
msgstr ""
#: dialog.c:131
msgid "Enter new name. Blank line to abort. '-' to reset."
msgstr ""
#: dialog.c:144
msgid "The new title must not contain a \"|\" character!"
msgstr ""
#: dialog.c:192
msgid "Enter URL of the feed you want to add. Blank line to abort."
msgstr ""
#: dialog.c:272
msgid ""
"The feed could not be parsed. Do you need a filter script for this feed? (y/"
"n)"
msgstr ""
#: dialog.c:324
#, c-format
msgid "Last updated: %s"
msgstr ""
#: dialog.c:326
msgid "No modification date."
msgstr ""
#: dialog.c:329
#, c-format
msgid "In disk cache: %lld bytes"
msgstr ""
#: dialog.c:331
msgid "Not in disk cache."
msgstr ""
#: dialog.c:334 dialog.c:336 dialog.c:339
msgid "Categories:"
msgstr ""
#: dialog.c:336
msgid "none"
msgstr ""
#: dialog.c:345
msgid "Feed uses authentication."
msgstr ""
#: dialog.c:347
msgid "Feed does not use authentication."
msgstr ""
#: dialog.c:353 dialog.c:354
#, c-format
msgid "Last webserver status: %d"
msgstr ""
#: dialog.c:381 dialog.c:382
msgid "Filtered through:"
msgstr ""
#: dialog.c:385
msgid "Displaying feed information."
msgstr ""
#: dialog.c:400
msgid "Are you sure you want to delete this feed?"
msgstr ""
#: dialog.c:403
msgid "Type 'y' to delete, any other key to abort."
msgstr ""
#: dialog.c:440 dialog.c:496
msgid "tab:"
msgstr ""
#: dialog.c:444
msgid "Add RSS feed..."
msgstr ""
#: dialog.c:445
msgid "Delete highlighted RSS feed..."
msgstr ""
#: dialog.c:446
msgid "Rename feed..."
msgstr ""
#: dialog.c:447
msgid "Reload all feeds"
msgstr ""
#: dialog.c:448 dialog.c:502
msgid "Reload this feed"
msgstr ""
#: dialog.c:449 dialog.c:505
msgid "Mark all read"
msgstr ""
#: dialog.c:450
msgid "Change default browser..."
msgstr ""
#: dialog.c:451
msgid "Move item up, down"
msgstr ""
#: dialog.c:452
msgid "Sort feed list alphabetically"
msgstr ""
#: dialog.c:453
msgid "Categorize feed..."
msgstr ""
#: dialog.c:454
msgid "Apply filter..."
msgstr ""
#: dialog.c:455
msgid "Only current category"
msgstr ""
#: dialog.c:456
msgid "Remove filter"
msgstr ""
#: dialog.c:457
msgid "Toggle AND/OR filtering"
msgstr ""
#: dialog.c:458
msgid "Show new headlines"
msgstr ""
#: dialog.c:459
msgid "Add conversion filter..."
msgstr ""
#: dialog.c:460 dialog.c:508
msgid "Type Ahead Find"
msgstr ""
#: dialog.c:461
msgid "About"
msgstr ""
#: dialog.c:462
msgid "Quit program"
msgstr ""
#: dialog.c:465 dialog.c:512 dialog.c:544
msgid "Press the any(tm) key to exit help screen."
msgstr ""
#: dialog.c:487
#, c-format
msgid "%c, up:"
msgstr ""
#: dialog.c:488
#, c-format
msgid "%c, down:"
msgstr ""
#: dialog.c:489
msgid "enter:"
msgstr ""
#: dialog.c:499 dialog.c:538
msgid "Previous item"
msgstr ""
#: dialog.c:500 dialog.c:539
msgid "Next item"
msgstr ""
#: dialog.c:501
msgid "View item"
msgstr ""
#: dialog.c:503
msgid "Open homepage"
msgstr ""
#: dialog.c:504 dialog.c:540
msgid "Open link"
msgstr ""
#: dialog.c:506
msgid "Mark item unread"
msgstr ""
#: dialog.c:507
msgid "Show feed info..."
msgstr ""
#: dialog.c:509
msgid "Return to main menu"
msgstr ""
#: dialog.c:531
msgid "cursor:"
msgstr ""
#: dialog.c:535
#, c-format
msgid "%c, enter:"
msgstr ""
#: dialog.c:537
msgid "Scroll text"
msgstr ""
#: dialog.c:541
msgid "Return to overview"
msgstr ""
#: dialog.c:581 dialog.c:582
#, c-format
msgid "Category configuration for %s"
msgstr ""
#: dialog.c:589
msgid "No category defined. Select one or add a new category:"
msgstr ""
#: dialog.c:598 dialog.c:638
#, c-format
msgid ""
"Select category number to add, press 'A' to add a new category or '%c' to "
"quit."
msgstr ""
#: dialog.c:603
msgid "Categories defined for this feed:"
msgstr ""
#: dialog.c:612
#, c-format
msgid ""
"Select a category number to delete, press 'A' to add a new one or '%c' to "
"quit."
msgstr ""
#: dialog.c:629
msgid "Select a new category or add a new one:"
msgstr ""
#: dialog.c:650
msgid "Enter new category name."
msgstr ""
#: dialog.c:658
msgid "Category already defined for this feed!"
msgstr ""
#: dialog.c:723
msgid "Select filter to apply"
msgstr ""
#: dialog.c:736
msgid "Select a category number or any other key to reset filters."
msgstr ""
#: dialog.c:774
msgid "Enter script to pipe feed through."
msgstr ""
#: filters.c:52
#, c-format
msgid "Loading \"%s\""
msgstr ""
#: filters.c:109
#, c-format
msgid "Could not write temp file for filter: %s"
msgstr ""
#: interface.c:161 interface.c:577 interface.c:580
msgid "No title"
msgstr ""
#: interface.c:241 interface.c:611
msgid "-> No link"
msgstr ""
#: interface.c:256
#, c-format
msgid ""
"Press '%c' or Enter to return to previous screen. Hit '%c' for help screen."
msgstr ""
#: interface.c:627
#, c-format
msgid "Press '%c' to return to main menu, '%c' to show help."
msgstr ""
#: interface.c:734 interface.c:1184 interface.c:1194 interface.c:1204
#: interface.c:1243 interface.c:1468 interface.c:1476 interface.c:1484
#: interface.c:1493
msgid "Please deactivate the category filter before using this function."
msgstr ""
#: interface.c:1115 interface.c:1117 interface.c:1134
msgid "new"
msgstr ""
#: interface.c:1128
#, c-format
msgid "%3d new"
msgstr ""
#: interface.c:1150
#, c-format
msgid "Press '%c' for help window."
msgstr ""
#: interface.c:1210
msgid "Successfully added new item..."
msgstr ""
#: interface.c:1217
msgid "Invalid URL! Please add http:// if you forgot this."
msgstr ""
#: interface.c:1221
msgid "There was a problem adding the feed!"
msgstr ""
#: interface.c:1420 interface.c:1437
msgid "You cannot move items while a category filter is defined!"
msgstr ""
#: io-internal.c:53
#, c-format
msgid "Bad request"
msgstr ""
#: io-internal.c:56
#, c-format
msgid "Payment required"
msgstr ""
#: io-internal.c:59
#, c-format
msgid "Access denied"
msgstr ""
#: io-internal.c:62
#, c-format
msgid "Internal server error"
msgstr ""
#: io-internal.c:65
#, c-format
msgid "Not implemented"
msgstr ""
#: io-internal.c:69
#, c-format
msgid "Service unavailable"
msgstr ""
#: io-internal.c:88
#, c-format
msgid "%s: Invalid URL!"
msgstr ""
#: io-internal.c:91
#, c-format
msgid "%s: Couldn't create network socket!"
msgstr ""
#: io-internal.c:94
#, c-format
msgid "%s: Can't resolve host!"
msgstr ""
#: io-internal.c:97
#, c-format
msgid "%s: Connection refused!"
msgstr ""
#: io-internal.c:100
#, c-format
msgid "%s: Couldn't connect to server: %s"
msgstr ""
#: io-internal.c:105
#, c-format
msgid "%s: Connection timed out."
msgstr ""
#: io-internal.c:110
#, c-format
msgid "%s: Too many HTTP redirects encountered! Giving up."
msgstr ""
#: io-internal.c:113
#, c-format
msgid "%s: Server sent an invalid redirect!"
msgstr ""
#: io-internal.c:117
#, c-format
msgid "%s: This feed no longer exists. Please unsubscribe!"
msgstr ""
#: io-internal.c:121
#, c-format
msgid "%s: Could not download feed: %s"
msgstr ""
#: io-internal.c:124
#, c-format
msgid "%s: Error in server reply."
msgstr ""
#: io-internal.c:127
#, c-format
msgid "%s: Authentication failed!"
msgstr ""
#: io-internal.c:130
#, c-format
msgid "%s: URL does not contain authentication information!"
msgstr ""
#: io-internal.c:133
#, c-format
msgid "%s: Could not generate authentication information!"
msgstr ""
#: io-internal.c:136
#, c-format
msgid "%s: Unsupported authentication method requested by server!"
msgstr ""
#: io-internal.c:139
#, c-format
msgid "%s: Error decompressing server reply!"
msgstr ""
#: io-internal.c:207
msgid "Invalid XML! Cannot parse this feed!"
msgstr ""
#: io-internal.c:251
#, c-format
msgid "Cache for %s is toast. Reloading from server..."
msgstr ""
#: io-internal.c:286
#, c-format
msgid "Could not load %s!"
msgstr ""
#: io-internal.c:305 io-internal.c:306
msgid "Loading cache ["
msgstr ""
#: io-internal.c:351 io-internal.c:352
msgid "Saving settings ["
msgstr ""
#: io-internal.c:357
msgid "Save settings (browser)"
msgstr ""
#: io-internal.c:374
msgid "Save settings (urls)"
msgstr ""
#: io-internal.c:430
msgid "Writing cache file"
msgstr ""
#: main.c:59
#, c-format
msgid ""
"Bye.\n"
"\n"
msgstr ""
#: main.c:68
#, c-format
msgid ""
"Aborting program execution!\n"
"An internal error occured. Snownews has quit, no changes has been saved!\n"
msgstr ""
#: main.c:69
#, c-format
msgid ""
"This shouldn't happen, please submit a bugreport to kiza@kcore.de, tell me "
"what you where doing and include the output below in your mail.\n"
msgstr ""
#: main.c:72
#, c-format
msgid "While executing: %s\n"
msgstr ""
#: main.c:73
#, c-format
msgid ""
"Error as reported by the system: %s\n"
"\n"
msgstr ""
#: main.c:124 main.c:135
#, c-format
msgid ""
"Snownews version %s\n"
"\n"
msgstr ""
#: main.c:130
#, c-format
msgid "The option \"--disable-versioncheck\" has been obsoleted.\n"
msgstr ""
#: main.c:131
#, c-format
msgid "Please see the manpage for details.\n"
msgstr ""
#: main.c:132
#, c-format
msgid "(To deactivate check, put -1 into ~/.snownews/updatecheck)\n"
msgstr ""
#: main.c:136
#, c-format
msgid ""
"usage: snownews [-huV] [--help|--update|--version]\n"
"\n"
msgstr ""
#: main.c:137
#, c-format
msgid "\t--update|-u\tAutomatically update every feed.\n"
msgstr ""
#: main.c:138
#, c-format
msgid "\t--help|-h\tPrint this help message.\n"
msgstr ""
#: main.c:139
#, c-format
msgid "\t--version|-V\tPrint version number and exit.\n"
msgstr ""
#: main.c:140
#, c-format
msgid "\t--disable-versioncheck (obsoleted)\n"
msgstr ""
#: netio.c:149 netio.c:151 netio.c:311
#, c-format
msgid "Downloading \"%s\""
msgstr ""
#: netio.c:309
#, c-format
msgid "Downloading \"http://%s%s\""
msgstr ""
#: netio.c:503 netio.c:504
msgid "URL points to permanent redirect, updating with new location..."
msgstr ""
#: os-support.c:90
msgid "Allocating memory"
msgstr ""
#: setup.c:64
msgid "Creating new config \"browser\"..."
msgstr ""
#: setup.c:67
msgid "Create initial configfile \"config\""
msgstr ""
#: setup.c:557 setup.c:561
msgid "Creating config directory ~/.snownews/"
msgstr ""
#: setup.c:562
msgid "A file with the name \"~/.snownews/\" exists!"
msgstr ""
#: setup.c:570 setup.c:573
msgid "Creating config directory ~/.snownews/cache/"
msgstr ""
#: setup.c:574
msgid "A file with the name \"~/.snownews/cache/\" exists!"
msgstr ""
#: setup.c:584
msgid "Reading configuration settings..."
msgstr ""
#: setup.c:596
msgid "Creating new configfile."
msgstr ""
#: setup.c:599
msgid "Create initial configfile \"urls\""
msgstr ""
#: ui-support.c:179
msgid "Sorting, please wait..."
msgstr ""
#: ui-support.c:256
msgid "Invalid URL passed. Possible shell exploit attempted!"
msgstr ""
#: ui-support.c:261 ui-support.c:263
#, c-format
msgid "Executing %s"
msgstr ""
#: ui-support.c:341
msgid "(New headlines)"
msgstr ""
#: updatecheck.c:96
#, c-format
msgid "A new version %s of Snownews is available.\n"
msgstr ""
#: updatecheck.c:97
#, c-format
msgid ""
"If you want to download it, go to http://snownews.kcore.de/downloading/\n"
"\n"
msgstr ""
#: updatecheck.c:98
#, c-format
msgid ""
"To disable the auto version check see the manpage.\n"
"\n"
msgstr ""
#: updatecheck.c:99
#, c-format
msgid "http://snownews.kcore.de/download/snownews-%s.tar.gz (.sign)\n"
msgstr ""
#: updatecheck.c:100
#, c-format
msgid "http://snownews.kcore.de/download/snownews-%s.i386.tar.bz2 (.sign)\n"
msgstr ""

1094
po/nl.po

File diff suppressed because it is too large Load Diff

1070
po/no.po

File diff suppressed because it is too large Load Diff

1202
po/pl.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1083
po/ru.po

File diff suppressed because it is too large Load Diff

1618
po/se.po

File diff suppressed because it is too large Load Diff

1172
po/sl.po

File diff suppressed because it is too large Load Diff

556
po/snownews.pot Normal file
View File

@ -0,0 +1,556 @@
# This file is part of Snownews - A lightweight console RSS newsreader
#
# Copyright (c) 2003-2009 Oliver Feiler <kiza@kcore.de>
# Copyright (c) 2003-2009 Rene Puls <rpuls@gmx.net>
# Copyright (c) 2021 Mike Sharov <msharov@users.sourceforge.net>
#
# Snownews is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3
# as published by the Free Software Foundation.
#
# Snownews is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Snownews. If not, see http://www.gnu.org/licenses/.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: snownews\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-25 12:47-0400\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: about.c:84
#, c-format
msgid "Move: cursor or %c/%c; shoot: space; quit: %c"
msgstr ""
#: about.c:94
msgid "Santa Hunta!"
msgstr ""
#: about.c:97
#, c-format
msgid "Score: %d"
msgstr ""
#: about.c:101
#, c-format
msgid "Level: %d"
msgstr ""
#: about.c:243
msgid "Final score:"
msgstr ""
#: about.c:346
msgid "Need at least 80 COLS terminal, sorry!"
msgstr ""
#: about.c:362
#, c-format
msgid "Version %s"
msgstr ""
#: about.c:365
msgid "Brought to you by:"
msgstr ""
#: about.c:366
msgid "Main code"
msgstr ""
#: about.c:368
msgid "Additional code"
msgstr ""
#: about.c:370
msgid "Translation team"
msgstr ""
#: conv.c:318
#, c-format
msgid "today"
msgstr ""
#: conv.c:320
#, c-format
msgid "yesterday"
msgstr ""
#: conv.c:322
#, c-format
msgid "%d days ago"
msgstr ""
#: conv.c:324
#, c-format
msgid "a week ago"
msgstr ""
#: conv.c:326
#, c-format
msgid "on %x"
msgstr ""
#: conv.c:333
msgid "Posted "
msgstr ""
#: dialog.c:57 dialog.c:59
#, c-format
msgid "Current setting: %s"
msgstr ""
#: dialog.c:71 dialog.c:511
msgid "Aborted."
msgstr ""
#: dialog.c:78
#, c-format
msgid "Only %s format strings allowed for default browser!"
msgstr ""
#: dialog.c:83 uiutil.c:156
msgid ""
"Unsafe browser string (contains quotes)! See snownews.kcore.de/faq#toc2.4"
msgstr ""
#: dialog.c:98
msgid "Enter new name. Blank line to abort. '-' to reset."
msgstr ""
#: dialog.c:110
msgid "The new title must not contain a \"|\" character!"
msgstr ""
#: dialog.c:150
msgid "Enter URL of the feed you want to add. Blank line to abort."
msgstr ""
#: dialog.c:198
msgid ""
"The feed could not be parsed. Do you need a filter script for this feed? (y/"
"n)"
msgstr ""
#: dialog.c:238
msgid "Last updated: "
msgstr ""
#: dialog.c:241
msgid "No modification date."
msgstr ""
#: dialog.c:253
msgid "Not in disk cache."
msgstr ""
#: dialog.c:256
#, c-format
msgid "In disk cache: %jd bytes"
msgstr ""
#: dialog.c:261
msgid "Categories:"
msgstr ""
#: dialog.c:264
msgid "none"
msgstr ""
#: dialog.c:274
msgid "Download failed: "
msgstr ""
#: dialog.c:277
msgid "Feed uses authentication."
msgstr ""
#: dialog.c:279
msgid "Feed does not use authentication."
msgstr ""
#: dialog.c:285
msgid "Filtered through:"
msgstr ""
#: dialog.c:291
msgid "Displaying feed information."
msgstr ""
#: dialog.c:302
msgid "Are you sure you want to delete this feed?"
msgstr ""
#: dialog.c:305
msgid "Type 'y' to delete, any other key to abort."
msgstr ""
#: dialog.c:334 dialog.c:382
msgid "tab:"
msgstr ""
#: dialog.c:338
msgid "Add RSS feed..."
msgstr ""
#: dialog.c:339
msgid "Delete highlighted RSS feed..."
msgstr ""
#: dialog.c:340
msgid "Rename feed..."
msgstr ""
#: dialog.c:341
msgid "Reload all feeds"
msgstr ""
#: dialog.c:342 dialog.c:388
msgid "Reload this feed"
msgstr ""
#: dialog.c:343 dialog.c:392
msgid "Mark all read"
msgstr ""
#: dialog.c:344
msgid "Change default browser..."
msgstr ""
#: dialog.c:345
msgid "Move item up, down"
msgstr ""
#: dialog.c:346
msgid "Sort feed list alphabetically"
msgstr ""
#: dialog.c:347
msgid "Categorize feed..."
msgstr ""
#: dialog.c:348
msgid "Apply filter..."
msgstr ""
#: dialog.c:349
msgid "Only current category"
msgstr ""
#: dialog.c:350
msgid "Remove filter"
msgstr ""
#: dialog.c:351
msgid "Show new headlines"
msgstr ""
#: dialog.c:352
msgid "Add conversion filter..."
msgstr ""
#: dialog.c:353 dialog.c:395
msgid "Type Ahead Find"
msgstr ""
#: dialog.c:354
msgid "About"
msgstr ""
#: dialog.c:355
msgid "Quit program"
msgstr ""
#: dialog.c:358 dialog.c:399 dialog.c:423
msgid "Press the any(tm) key to exit help screen."
msgstr ""
#: dialog.c:371
msgid ", up:"
msgstr ""
#: dialog.c:373
msgid ", down:"
msgstr ""
#: dialog.c:374
msgid "enter:"
msgstr ""
#: dialog.c:385 dialog.c:417
msgid "Previous item"
msgstr ""
#: dialog.c:386 dialog.c:418
msgid "Next item"
msgstr ""
#: dialog.c:387
msgid "View item"
msgstr ""
#: dialog.c:389
msgid "Force reload this feed"
msgstr ""
#: dialog.c:390
msgid "Open homepage"
msgstr ""
#: dialog.c:391 dialog.c:419
msgid "Open link"
msgstr ""
#: dialog.c:393
msgid "Toggle item read status"
msgstr ""
#: dialog.c:394
msgid "Show feed info..."
msgstr ""
#: dialog.c:396
msgid "Return to main menu"
msgstr ""
#: dialog.c:415
msgid ", enter:"
msgstr ""
#: dialog.c:420
msgid "Return to overview"
msgstr ""
#: dialog.c:450
#, c-format
msgid "Category configuration for %s"
msgstr ""
#: dialog.c:457
msgid "No category defined. Select one or add a new category:"
msgstr ""
#: dialog.c:464 dialog.c:498
#, c-format
msgid ""
"Select category number to add, press 'A' to add a new category or '%c' to "
"quit."
msgstr ""
#: dialog.c:468
msgid "Categories defined for this feed:"
msgstr ""
#: dialog.c:475
#, c-format
msgid ""
"Select a category number to delete, press 'A' to add a new one or '%c' to "
"quit."
msgstr ""
#: dialog.c:491
msgid "Select a new category or add a new one:"
msgstr ""
#: dialog.c:508
msgid "Enter new category name."
msgstr ""
#: dialog.c:515
msgid "Category already defined for this feed!"
msgstr ""
#: dialog.c:555
msgid "Select filter to apply"
msgstr ""
#: dialog.c:566
msgid "Select a category number or any other key to reset filters."
msgstr ""
#: dialog.c:594
msgid "Enter script to pipe feed through."
msgstr ""
#: feedio.c:73
msgid "Invalid XML! Cannot parse this feed!"
msgstr ""
#: feedio.c:110
#, c-format
msgid "Cache for %s is toast. Reloading from server..."
msgstr ""
#: feedio.c:147
#, c-format
msgid "Could not load %s!"
msgstr ""
#: feedio.c:162 feedio.c:163
msgid "Loading cache ["
msgstr ""
#: feedio.c:373 feedio.c:384
msgid "Saving settings ["
msgstr ""
#: filters.c:36
#, c-format
msgid "Loading \"%s\""
msgstr ""
#: main.c:113
#, c-format
msgid "Unable to write PID file %s!"
msgstr ""
#: main.c:136
#, c-format
msgid ""
"Snownews seems to be already running with process ID %d.\n"
"A pid file exists at \"%s\".\n"
msgstr ""
#: main.c:140
#, c-format
msgid ""
"A pid file exists at \"%s\",\n"
"but snownews doesn't seem to be running.\n"
"Delete that file and start it again.\n"
"Continue anyway? (y/n) "
msgstr ""
#: main.c:211
#, c-format
msgid ""
"Aborting program execution!\n"
"snownews quit without saving changes due to internal error!\n"
"Please submit a bugreport at https://github.com/msharov/snownews/issues\n"
msgstr ""
#: main.c:215
#, c-format
msgid ""
"While executing: %s\n"
"Error: %s\n"
"\n"
msgstr ""
#: main.c:261
#, c-format
msgid ""
"Usage: snownews [-chuV]\n"
"\n"
" -h, --help\t\tPrint this help message.\n"
" -V, --version\t\tPrint version number and exit.\n"
" -c, --cursor-on\tForce cursor always visible.\n"
" -u, --update\t\tAutomatically update every feed.\n"
msgstr ""
#: main.c:316
#, c-format
msgid "Unknown option \"%s\"\n"
msgstr ""
#: netio.c:121
msgid "already up to date"
msgstr ""
#: parse.c:201 parse.c:313 parse.c:455 ui.c:224 ui.c:302 ui.c:305
msgid "No title"
msgstr ""
#: setup.c:37
msgid "configuration dir path is too long"
msgstr ""
#: setup.c:51
msgid "cache dir path is too long"
msgstr ""
#: setup.c:98
msgid "Save settings (browser)"
msgstr ""
#: setup.c:456
msgid "Reading configuration settings..."
msgstr ""
#: ui.c:96
msgid "No description available."
msgstr ""
#: ui.c:123
#, c-format
msgid ""
"Press '%c' or Enter to return to previous screen. Hit '%c' for help screen."
msgstr ""
#: ui.c:332
#, c-format
msgid "Press '%c' to return to main menu, '%c' to show help."
msgstr ""
#: ui.c:412 ui.c:776 ui.c:787 ui.c:794 ui.c:824 ui.c:1013 ui.c:1021 ui.c:1028
#: ui.c:1036
msgid "Please deactivate the category filter before using this function."
msgstr ""
#: ui.c:719
#, c-format
msgid "%3u new"
msgid_plural "%3u new"
msgstr[0] ""
msgstr[1] ""
#: ui.c:744
#, c-format
msgid "Press '%c' for help window."
msgstr ""
#: ui.c:746
#, c-format
msgid "Press '%c' for help window. (Press '%c' to play Santa Hunta!)"
msgstr ""
#: ui.c:798
msgid "Successfully added new item..."
msgstr ""
#: ui.c:802
msgid "Invalid URL! Please add http:// if you forgot this."
msgstr ""
#: ui.c:805
msgid "There was a problem adding the feed!"
msgstr ""
#: ui.c:960 ui.c:977
msgid "You cannot move items while a category filter is defined!"
msgstr ""
#: uiutil.c:91
msgid "Sorting, please wait..."
msgstr ""
#: uiutil.c:160
msgid "Invalid URL passed. Possible shell exploit attempted!"
msgstr ""
#: uiutil.c:169
#, c-format
msgid "Executing %s"
msgstr ""
#: uiutil.c:220
msgid "(New headlines)"
msgstr ""

1115
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -34,7 +34,7 @@ void ConfigFilePath (const char* filename, char* path, size_t pathsz)
else
pathlen = snprintf (path, pathsz, "%s/.config/" SNOWNEWS_NAME "/%s", getenv("HOME"), filename);
if (pathlen >= pathsz)
MainQuit ("ConfigFilePath", "configuration dir path is too long");
MainQuit ("ConfigFilePath", _("configuration dir path is too long"));
if (path[pathlen-1] == '/')
path[pathlen-1] = 0;
}
@ -48,7 +48,7 @@ void CacheFilePath (const char* filename, char* path, size_t pathsz)
else
pathlen = snprintf (path, pathsz, "%s/.local/share/" SNOWNEWS_NAME "/%s", getenv("HOME"), filename);
if (pathlen >= pathsz)
MainQuit ("CacheFilePath", "cache dir path is too long");
MainQuit ("CacheFilePath", _("cache dir path is too long"));
if (path[pathlen-1] == '/')
path[pathlen-1] = 0;
}

10
ui.c
View File

@ -221,7 +221,7 @@ static int UIDisplayFeed (struct feed* current_feed)
if (!title)
title = current_feed->title;
if (!title)
title = "Untitled";
title = _("No title");
UISupportDrawHeader (title);
// We start the item list below the header
@ -703,9 +703,9 @@ void UIMainInterface (void)
int columns;
if (cur_ptr->feedcategories != NULL)
columns = COLS - 26 - strlen (_("new"));
columns = COLS - 26 - strlen ("new");
else
columns = COLS - 9 - strlen (_("new"));
columns = COLS - 9 - strlen ("new");
mvaddn_utf8 (ypos, 1, cur_ptr->title, columns);
if (xmlStrlen ((xmlChar*) cur_ptr->title) > columns)
@ -719,11 +719,11 @@ void UIMainInterface (void)
const char* localized_msg = ngettext ("%3u new", "%3u new", newcount);
char msgbuf[16];
snprintf (msgbuf, sizeof (msgbuf), localized_msg, newcount);
mvadd_utf8 (ypos, COLS - 1 - strlen (localized_msg), msgbuf);
mvadd_utf8 (ypos, COLS - 1 - utf8_length (localized_msg), msgbuf);
}
if (cur_ptr->feedcategories != NULL)
mvaddn_utf8 (ypos, COLS - 21 - strlen (_("new")), cur_ptr->feedcategories->name, 15);
mvaddn_utf8 (ypos, COLS - 21 - strlen ("new"), cur_ptr->feedcategories->name, 15);
++ypos;