From 20bb5bf6488d0b0c26364a3ed1802f25ed644ddf Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2011 13:14:47 -0400 Subject: [PATCH] I18N - Localized more commands. --- src/commands/CmdInfo.cpp | 65 ++++++++++++++++++---------------- src/commands/CmdQuery.cpp | 7 ++-- src/commands/CmdReports.cpp | 12 ++++--- src/commands/CmdStatistics.cpp | 59 +++++++++++++++--------------- src/commands/CmdTags.cpp | 30 +++++++++++----- src/commands/CmdUndo.cpp | 5 ++- src/en-US.h | 54 ++++++++++++++++++++++++++++ 7 files changed, 156 insertions(+), 76 deletions(-) diff --git a/src/commands/CmdInfo.cpp b/src/commands/CmdInfo.cpp index 07edc976e..a19318d33 100644 --- a/src/commands/CmdInfo.cpp +++ b/src/commands/CmdInfo.cpp @@ -25,6 +25,8 @@ // //////////////////////////////////////////////////////////////////////////////// +#define L10N // Localization complete. + #include #include #include @@ -33,6 +35,7 @@ #include #include #include +#include #include extern Context context; @@ -41,7 +44,7 @@ CmdInfo::CmdInfo () { _keyword = "information"; _usage = "task information "; - _description = "Shows all data and metadata for specified tasks."; + _description = STRING_CMD_INFO_USAGE; _read_only = true; _displays_id = true; } @@ -79,8 +82,8 @@ int CmdInfo::execute (std::string& output) { ViewText view; view.width (context.getWidth ()); - view.add (Column::factory ("string", "Name")); - view.add (Column::factory ("string", "Value")); + view.add (Column::factory ("string", STRING_COLUMN_LABEL_NAME)); + view.add (Column::factory ("string", STRING_COLUMN_LABEL_VALUE)); // If an alternating row color is specified, notify the table. if (context.color ()) @@ -94,7 +97,7 @@ int CmdInfo::execute (std::string& output) // id int row = view.addRow (); - view.set (row, 0, "ID"); + view.set (row, 0, STRING_COLUMN_LABEL_ID); view.set (row, 1, format (task->id)); std::string status = ucFirst (Task::statusToText (task->getStatus ())); @@ -104,19 +107,19 @@ int CmdInfo::execute (std::string& output) autoColorize (*task, c); row = view.addRow (); - view.set (row, 0, "Description"); + view.set (row, 0, STRING_COLUMN_LABEL_DESC); view.set (row, 1, getFullDescription (*task, "info"), c); // status row = view.addRow (); - view.set (row, 0, "Status"); + view.set (row, 0, STRING_COLUMN_LABEL_STATUS); view.set (row, 1, status); // project if (task->has ("project")) { row = view.addRow (); - view.set (row, 0, "Project"); + view.set (row, 0, STRING_COLUMN_LABEL_PROJECT); view.set (row, 1, task->get ("project")); } @@ -124,7 +127,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("priority")) { row = view.addRow (); - view.set (row, 0, "Priority"); + view.set (row, 0, STRING_COLUMN_LABEL_PRIORITY); view.set (row, 1, task->get ("priority")); } @@ -140,7 +143,7 @@ int CmdInfo::execute (std::string& output) message << it->id << " " << it->get ("description") << "\n"; row = view.addRow (); - view.set (row, 0, "This task blocked by"); + view.set (row, 0, STRING_CMD_INFO_BLOCKED); view.set (row, 1, message.str ()); } } @@ -157,7 +160,7 @@ int CmdInfo::execute (std::string& output) message << it->id << " " << it->get ("description") << "\n"; row = view.addRow (); - view.set (row, 0, "This task is blocking"); + view.set (row, 0, STRING_CMD_INFO_BLOCKING); view.set (row, 1, message.str ()); } } @@ -166,7 +169,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("recur")) { row = view.addRow (); - view.set (row, 0, "Recurrence"); + view.set (row, 0, STRING_COLUMN_LABEL_RECUR_L); view.set (row, 1, task->get ("recur")); } @@ -174,7 +177,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("until")) { row = view.addRow (); - view.set (row, 0, "Recur until"); + view.set (row, 0, STRING_CMD_INFO_RECUR_UNTIL); Date dt (strtol (task->get ("until").c_str (), NULL, 10)); std::string format = context.config.get ("reportdateformat"); @@ -189,7 +192,7 @@ int CmdInfo::execute (std::string& output) if (task->getStatus () == Task::recurring) { row = view.addRow (); - view.set (row, 0, "Mask"); + view.set (row, 0, STRING_COLUMN_LABEL_MASK); view.set (row, 1, task->get ("mask")); } @@ -197,12 +200,12 @@ int CmdInfo::execute (std::string& output) { // parent row = view.addRow (); - view.set (row, 0, "Parent task"); + view.set (row, 0, STRING_COLUMN_LABEL_PARENT); view.set (row, 1, task->get ("parent")); // imask row = view.addRow (); - view.set (row, 0, "Mask Index"); + view.set (row, 0, STRING_COLUMN_LABEL_MASK_IDX); view.set (row, 1, task->get ("imask")); } @@ -210,7 +213,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("due")) { row = view.addRow (); - view.set (row, 0, "Due"); + view.set (row, 0, STRING_COLUMN_LABEL_DUE); std::string format = context.config.get ("reportdateformat"); if (format == "") @@ -223,7 +226,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("wait")) { row = view.addRow (); - view.set (row, 0, "Waiting until"); + view.set (row, 0, STRING_COLUMN_LABEL_WAITING); Date dt (strtol (task->get ("wait").c_str (), NULL, 10)); view.set (row, 1, dt.toString (context.config.get ("dateformat"))); } @@ -232,7 +235,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("start")) { row = view.addRow (); - view.set (row, 0, "Start"); + view.set (row, 0, STRING_COLUMN_LABEL_START); Date dt (strtol (task->get ("start").c_str (), NULL, 10)); view.set (row, 1, dt.toString (context.config.get ("dateformat"))); } @@ -241,7 +244,7 @@ int CmdInfo::execute (std::string& output) if (task->has ("end")) { row = view.addRow (); - view.set (row, 0, "End"); + view.set (row, 0, STRING_COLUMN_LABEL_END); Date dt (strtol (task->get ("end").c_str (), NULL, 10)); view.set (row, 1, dt.toString (context.config.get ("dateformat"))); } @@ -255,19 +258,19 @@ int CmdInfo::execute (std::string& output) join (allTags, " ", tags); row = view.addRow (); - view.set (row, 0, "Tags"); + view.set (row, 0, STRING_COLUMN_LABEL_TAGS); view.set (row, 1, allTags); } // uuid row = view.addRow (); - view.set (row, 0, "UUID"); + view.set (row, 0, STRING_COLUMN_LABEL_UUID); std::string uuid = task->get ("uuid"); view.set (row, 1, uuid); // entry row = view.addRow (); - view.set (row, 0, "Entered"); + view.set (row, 0, STRING_COLUMN_LABEL_ENTERED); Date dt (strtol (task->get ("entry").c_str (), NULL, 10)); std::string entry = dt.toString (context.config.get ("dateformat")); @@ -281,27 +284,27 @@ int CmdInfo::execute (std::string& output) view.set (row, 1, entry + " (" + age + ")"); - // fg + // fg TODO deprecated std::string color = task->get ("fg"); if (color != "") { row = view.addRow (); - view.set (row, 0, "Foreground color"); + view.set (row, 0, STRING_COLUMN_LABEL_FG); view.set (row, 1, color); } - // bg + // bg TODO deprecated color = task->get ("bg"); if (color != "") { row = view.addRow (); - view.set (row, 0, "Background color"); + view.set (row, 0, STRING_COLUMN_LABEL_BG); view.set (row, 1, color); } // Task::urgency row = view.addRow (); - view.set (row, 0, "Urgency"); + view.set (row, 0, STRING_COLUMN_LABEL_URGENCY); view.set (row, 1, trimLeft (format (task->urgency (), 4, 4))); // Create a second table, containing undo log change details. @@ -316,8 +319,8 @@ int CmdInfo::execute (std::string& output) } journal.width (context.getWidth ()); - journal.add (Column::factory ("string", "Date")); - journal.add (Column::factory ("string", "Modification")); + journal.add (Column::factory ("string", STRING_COLUMN_LABEL_DATE)); + journal.add (Column::factory ("string", STRING_CMD_INFO_MODIFICATION)); if (context.config.getBoolean ("journal.info") && undo.size () > 3) @@ -376,7 +379,7 @@ int CmdInfo::execute (std::string& output) if (total_time > 0) { row = journal.addRow (); - journal.set (row, 0, "Total active time"); + journal.set (row, 0, STRING_CMD_INFO_TOTAL_ACTIVE); journal.set (row, 1, Duration (total_time).format (), (context.color () ? Color ("bold") : Color ())); } @@ -393,7 +396,7 @@ int CmdInfo::execute (std::string& output) if (! filtered.size ()) { - out << "No matches.\n"; + out << STRING_FEEDBACK_NO_MATCH << "\n"; rc = 1; } diff --git a/src/commands/CmdQuery.cpp b/src/commands/CmdQuery.cpp index 16d36e8db..50695c749 100644 --- a/src/commands/CmdQuery.cpp +++ b/src/commands/CmdQuery.cpp @@ -25,8 +25,11 @@ // //////////////////////////////////////////////////////////////////////////////// +#define L10N // Localization complete. + #include #include +#include #include extern Context context; @@ -36,7 +39,7 @@ CmdQuery::CmdQuery () { _keyword = "_query"; _usage = "task _query []"; - _description = "Executes external commands and scripts"; + _description = STRING_CMD_QUERY_USAGE; _read_only = true; _displays_id = true; } @@ -60,7 +63,7 @@ int CmdQuery::execute (std::string& output) if (filtered.size () == 0) { - context.footnote ("No matches."); + context.footnote (STRING_FEEDBACK_NO_MATCH); return 1; } diff --git a/src/commands/CmdReports.cpp b/src/commands/CmdReports.cpp index 7e39c12ad..eab218e87 100644 --- a/src/commands/CmdReports.cpp +++ b/src/commands/CmdReports.cpp @@ -25,11 +25,14 @@ // //////////////////////////////////////////////////////////////////////////////// +#define L10N // Localization complete. + #include #include #include #include #include +#include #include extern Context context; @@ -39,7 +42,7 @@ CmdReports::CmdReports () { _keyword = "reports"; _usage = "task reports"; - _description = "Lists all supported reports."; + _description = STRING_CMD_REPORTS_USAGE; _read_only = true; _displays_id = false; } @@ -84,8 +87,8 @@ int CmdReports::execute (std::string& output) std::stringstream out; ViewText view; view.width (context.getWidth ()); - view.add (Column::factory ("string", "Report")); - view.add (Column::factory ("string", "Description")); + view.add (Column::factory ("string", STRING_CMD_REPORTS_REPORT)); + view.add (Column::factory ("string", STRING_CMD_REPORTS_DESC)); // If an alternating row color is specified, notify the table. if (context.color ()) @@ -106,8 +109,7 @@ int CmdReports::execute (std::string& output) out << optionalBlankLine () << view.render () << optionalBlankLine () - << reports.size () - << " reports" + << format (STRING_CMD_REPORTS_SUMMARY, reports.size ()) << "\n"; output = out.str (); diff --git a/src/commands/CmdStatistics.cpp b/src/commands/CmdStatistics.cpp index 3c26049a0..947e0878c 100644 --- a/src/commands/CmdStatistics.cpp +++ b/src/commands/CmdStatistics.cpp @@ -25,6 +25,8 @@ // //////////////////////////////////////////////////////////////////////////////// +#define L10N // Localization complete. + #include #include #include @@ -34,6 +36,7 @@ #include #include #include +#include #include extern Context context; @@ -43,7 +46,7 @@ CmdStatistics::CmdStatistics () { _keyword = "stats"; _usage = "task stats []"; - _description = "Shows task database statistics."; + _description = STRING_CMD_STATS_USAGE; _read_only = true; _displays_id = false; } @@ -54,6 +57,8 @@ int CmdStatistics::execute (std::string& output) int rc = 0; std::stringstream out; + std::string dateformat = context.config.get ("dateformat"); + // Go get the file sizes. size_t dataSize = 0; @@ -149,57 +154,57 @@ int CmdStatistics::execute (std::string& output) ViewText view; view.width (context.getWidth ()); view.intraPadding (2); - view.add (Column::factory ("string", "Category")); - view.add (Column::factory ("string", "Data")); + view.add (Column::factory ("string", STRING_CMD_STATS_CATEGORY)); + view.add (Column::factory ("string", STRING_CMD_STATS_DATA)); int row = view.addRow (); - view.set (row, 0, "Pending"); + view.set (row, 0, STRING_COLUMN_LABEL_STAT_PE); view.set (row, 1, pendingT); row = view.addRow (); - view.set (row, 0, "Waiting"); + view.set (row, 0, STRING_COLUMN_LABEL_STAT_WA); view.set (row, 1, waitingT); row = view.addRow (); - view.set (row, 0, "Recurring"); + view.set (row, 0, STRING_COLUMN_LABEL_STAT_RE); view.set (row, 1, recurringT); row = view.addRow (); - view.set (row, 0, "Completed"); + view.set (row, 0, STRING_COLUMN_LABEL_STAT_CO); view.set (row, 1, completedT); row = view.addRow (); - view.set (row, 0, "Deleted"); + view.set (row, 0, STRING_COLUMN_LABEL_STAT_DE); view.set (row, 1, deletedT); row = view.addRow (); - view.set (row, 0, "Total"); + view.set (row, 0, STRING_CMD_STATS_TOTAL); view.set (row, 1, totalT); row = view.addRow (); - view.set (row, 0, "Annotations"); + view.set (row, 0, STRING_CMD_STATS_ANNOTATIONS); view.set (row, 1, annotationsT); row = view.addRow (); - view.set (row, 0, "Unique tags"); + view.set (row, 0, STRING_CMD_STATS_UNIQUE_TAGS); view.set (row, 1, (int)allTags.size ()); row = view.addRow (); - view.set (row, 0, "Projects"); + view.set (row, 0, STRING_CMD_STATS_PROJECTS); view.set (row, 1, (int)allProjects.size ()); row = view.addRow (); - view.set (row, 0, "Data size"); + view.set (row, 0, STRING_CMD_STATS_DATA_SIZE); view.set (row, 1, formatBytes (dataSize)); row = view.addRow (); - view.set (row, 0, "Undo transactions"); + view.set (row, 0, STRING_CMD_STATS_UNDO_TXNS); view.set (row, 1, undoCount); if (totalT) { row = view.addRow (); - view.set (row, 0, "Tasks tagged"); + view.set (row, 0, STRING_CMD_STATS_TAGGED); std::stringstream value; value << std::setprecision (3) << (100.0 * taggedT / totalT) << "%"; @@ -210,54 +215,52 @@ int CmdStatistics::execute (std::string& output) { Date e (earliest); row = view.addRow (); - view.set (row, 0, "Oldest task"); - view.set (row, 1, e.toString (context.config.get ("dateformat"))); + view.set (row, 0, STRING_CMD_STATS_OLDEST); + view.set (row, 1, e.toString (dateformat)); Date l (latest); row = view.addRow (); - view.set (row, 0, "Newest task"); - view.set (row, 1, l.toString (context.config.get ("dateformat"))); + view.set (row, 0, STRING_CMD_STATS_NEWEST); + view.set (row, 1, l.toString (dateformat)); row = view.addRow (); - view.set (row, 0, "Task used for"); + view.set (row, 0, STRING_CMD_STATS_USED_FOR); view.set (row, 1, Duration (latest - earliest).format ()); } if (totalT) { row = view.addRow (); - view.set (row, 0, "Task added every"); + view.set (row, 0, STRING_CMD_STATS_ADD_EVERY); view.set (row, 1, Duration (((latest - earliest) / totalT)).format ()); } if (completedT) { row = view.addRow (); - view.set (row, 0, "Task completed every"); + view.set (row, 0, STRING_CMD_STATS_COMP_EVERY); view.set (row, 1, Duration ((latest - earliest) / completedT).format ()); } if (deletedT) { row = view.addRow (); - view.set (row, 0, "Task deleted every"); + view.set (row, 0, STRING_CMD_STATS_DEL_EVERY); view.set (row, 1, Duration ((latest - earliest) / deletedT).format ()); } if (pendingT || completedT) { row = view.addRow (); - view.set (row, 0, "Average time pending"); + view.set (row, 0, STRING_CMD_STATS_AVG_PEND); view.set (row, 1, Duration ((int) ((daysPending / (pendingT + completedT)) * 86400)).format ()); } if (totalT) { row = view.addRow (); - view.set (row, 0, "Average desc length"); - std::stringstream value; - value << (int) (descLength / totalT) << " characters"; - view.set (row, 1, value.str ()); + view.set (row, 0, STRING_CMD_STATS_DESC_LEN); + view.set (row, 1, format (STRING_CMD_STATS_CHARS, (int) (descLength / totalT))); } // If an alternating row color is specified, notify the table. diff --git a/src/commands/CmdTags.cpp b/src/commands/CmdTags.cpp index 876b48266..aa42a3c29 100644 --- a/src/commands/CmdTags.cpp +++ b/src/commands/CmdTags.cpp @@ -25,6 +25,8 @@ // //////////////////////////////////////////////////////////////////////////////// +#define L10N // Localization complete. + #include #include #include @@ -32,6 +34,7 @@ #include #include #include +#include extern Context context; @@ -40,7 +43,7 @@ CmdTags::CmdTags () { _keyword = "tags"; _usage = "task tags"; - _description = "Shows a list of all tags used."; + _description = STRING_CMD_TAGS_USAGE; _read_only = true; _displays_id = false; } @@ -88,8 +91,8 @@ int CmdTags::execute (std::string& output) // Render a list of tags names from the map. ViewText view; view.width (context.getWidth ()); - view.add (Column::factory ("string", "Tag")); - view.add (Column::factory ("string.right", "Count")); + view.add (Column::factory ("string", STRING_COLUMN_LABEL_TAG)); + view.add (Column::factory ("string.right", STRING_COLUMN_LABEL_COUNT)); Color bold ("bold"); bool special = false; @@ -109,14 +112,23 @@ int CmdTags::execute (std::string& output) out << optionalBlankLine () << view.render () - << optionalBlankLine () - << unique.size () - << (unique.size () == 1 ? " tag" : " tags") - << " (" << quantity << (quantity == 1 ? " task" : " tasks") << ")\n"; + << optionalBlankLine (); + + if (unique.size () == 1) + out << STRING_CMD_TAGS_SINGLE; + else + out << format (STRING_CMD_TAGS_PLURAL, unique.size ()); + + if (quantity == 1) + out << " " << STRING_FEEDBACK_TASKS_SINGLE; + else + out << " " << format (STRING_FEEDBACK_TASKS_PLURAL, quantity); + + out << "\n"; } else { - out << "No tags.\n"; + out << STRING_CMD_TAGS_NO_TAGS << "\n"; rc = 1; } @@ -129,7 +141,7 @@ CmdCompletionTags::CmdCompletionTags () { _keyword = "_tags"; _usage = "task _tags"; - _description = "Shows only a list of all tags used, for autocompletion purposes."; + _description = STRING_CMD_COMTAGS_USAGE; _read_only = true; _displays_id = false; } diff --git a/src/commands/CmdUndo.cpp b/src/commands/CmdUndo.cpp index 5faeac23d..ea63795ae 100644 --- a/src/commands/CmdUndo.cpp +++ b/src/commands/CmdUndo.cpp @@ -25,7 +25,10 @@ // //////////////////////////////////////////////////////////////////////////////// +#define L10N // Localization complete. + #include +#include #include extern Context context; @@ -35,7 +38,7 @@ CmdUndo::CmdUndo () { _keyword = "undo"; _usage = "task undo"; - _description = "Reverts the most recent change to a task."; + _description = STRING_CMD_UNDO_USAGE; _read_only = false; _displays_id = false; } diff --git a/src/en-US.h b/src/en-US.h index eaf0f9c62..c8dece2ff 100644 --- a/src/en-US.h +++ b/src/en-US.h @@ -112,6 +112,8 @@ #define STRING_COLUMN_LABEL_DEP_S "Dep" #define STRING_COLUMN_LABEL_DESC "Description" #define STRING_COLUMN_LABEL_DUE "Due" +#define STRING_COLUMN_LABEL_END "End" +#define STRING_COLUMN_LABEL_ENTERED "Entered" #define STRING_COLUMN_LABEL_COUNT "Count" #define STRING_COLUMN_LABEL_COMPLETE "Completed" #define STRING_COLUMN_LABEL_ADDED "Added" @@ -122,7 +124,10 @@ #define STRING_COLUMN_LABEL_PROJECT "Project" #define STRING_COLUMN_LABEL_UNTIL "Until" #define STRING_COLUMN_LABEL_WAIT "Wait" +#define STRING_COLUMN_LABEL_WAITING "Waiting until" #define STRING_COLUMN_LABEL_RECUR "Recur" +#define STRING_COLUMN_LABEL_RECUR_L "Recurrence" +#define STRING_COLUMN_LABEL_START "Start" #define STRING_COLUMN_LABEL_STARTED "Started" #define STRING_COLUMN_LABEL_ACTIVE "A" #define STRING_COLUMN_LABEL_STATUS "Status" @@ -141,6 +146,14 @@ #define STRING_COLUMN_LABEL_TAG "Tag" #define STRING_COLUMN_LABEL_UUID "UUID" #define STRING_COLUMN_LABEL_URGENCY "Urgency" +#define STRING_COLUMN_LABEL_NAME "Name" +#define STRING_COLUMN_LABEL_VALUE "Value" +#define STRING_COLUMN_LABEL_MASK "Mask" +#define STRING_COLUMN_LABEL_MASK_IDX "Mask Index" +#define STRING_COLUMN_LABEL_PARENT "Parent task" +#define STRING_COLUMN_LABEL_FG "Foreground color" +#define STRING_COLUMN_LABEL_BG "Background color" +#define STRING_COLUMN_LABEL_DATE "Date" // commands/Cmd* #define STRING_CMD_CONFLICT "Custom report '{1}' conflicts with built-in task command." @@ -165,6 +178,42 @@ #define STRING_CMD_IDS_USAGE_RANGE "Shows only the IDs of matching tasks, in the form of a range." #define STRING_CMD_IDS_USAGE_LIST "Shows only the IDs of matching tasks, in the form of a list." #define STRING_CMD_IDS_USAGE_ZSH "Shows the IDs and descriptions of matching tasks." +#define STRING_CMD_QUERY_USAGE "Executes external commands and scripts" +#define STRING_CMD_INFO_USAGE "Shows all data and metadata for specified tasks." +#define STRING_CMD_INFO_BLOCKED "This task blocked by" +#define STRING_CMD_INFO_BLOCKING "This task is blocking" +#define STRING_CMD_INFO_RECUR_UNTIL "Recur until" +#define STRING_CMD_INFO_MODIFICATION "Modification" +#define STRING_CMD_INFO_TOTAL_ACTIVE "Total active time" +#define STRING_CMD_UNDO_USAGE "Reverts the most recent change to a task." +#define STRING_CMD_STATS_USAGE "Shows task database statistics." +#define STRING_CMD_STATS_CATEGORY "Category" +#define STRING_CMD_STATS_DATA "Data" +#define STRING_CMD_STATS_TOTAL "Total" +#define STRING_CMD_STATS_ANNOTATIONS "Annotations" +#define STRING_CMD_STATS_UNIQUE_TAGS "Unique tags" +#define STRING_CMD_STATS_PROJECTS "Projects" +#define STRING_CMD_STATS_DATA_SIZE "Data size" +#define STRING_CMD_STATS_UNDO_TXNS "Undo transactions" +#define STRING_CMD_STATS_TAGGED "Tasks tagged" +#define STRING_CMD_STATS_OLDEST "Oldest task" +#define STRING_CMD_STATS_NEWEST "Newest task" +#define STRING_CMD_STATS_USED_FOR "Task used for" +#define STRING_CMD_STATS_ADD_EVERY "Task added every" +#define STRING_CMD_STATS_COMP_EVERY "Task completed every" +#define STRING_CMD_STATS_DEL_EVERY "Task deleted every" +#define STRING_CMD_STATS_AVG_PEND "Average time pending" +#define STRING_CMD_STATS_DESC_LEN "Average desc length" +#define STRING_CMD_STATS_CHARS "{1} characters" +#define STRING_CMD_REPORTS_USAGE "Lists all supported reports." +#define STRING_CMD_REPORTS_REPORT "Report" +#define STRING_CMD_REPORTS_DESC "Description" +#define STRING_CMD_REPORTS_SUMMARY "{1} reports" +#define STRING_CMD_TAGS_USAGE "Shows a list of all tags used." +#define STRING_CMD_COMTAGS_USAGE "Shows only a list of all tags used, for autocompletion purposes." +#define STRING_CMD_TAGS_SINGLE "1 tag" +#define STRING_CMD_TAGS_PLURAL "{1} tags" +#define STRING_CMD_TAGS_NO_TAGS "No tags." // Config #define STRING_CONFIG_OVERNEST "Configuration file nested to more than 10 levels deep - this has to be a mistake." @@ -186,6 +235,11 @@ #define STRING_TRIVIAL_INPUT "You must specify a command, or a task ID to modify." #define STRING_ASSUME_INFO "No command - assuming 'info'" +// Feedback +#define STRING_FEEDBACK_NO_MATCH "No matches." +#define STRING_FEEDBACK_TASKS_SINGLE "(1 task)" +#define STRING_FEEDBACK_TASKS_PLURAL "({1} tasks)" + // File #define STRING_FILE_PERMS "Task does not have the correct permissions for '{1}'."