mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00
I18N
- Localization of CmdEdit.cpp, which means L10N is complete.
This commit is contained in:
parent
c25bb6404f
commit
1d9a11f8ea
2 changed files with 132 additions and 62 deletions
|
@ -25,6 +25,7 @@
|
|||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define L10N // Localization complete.
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
@ -34,6 +35,7 @@
|
|||
#include <i18n.h>
|
||||
#include <text.h>
|
||||
#include <util.h>
|
||||
#include <i18n.h>
|
||||
#include <main.h>
|
||||
#include <CmdEdit.h>
|
||||
|
||||
|
@ -143,24 +145,24 @@ std::string CmdEdit::formatTask (Task task)
|
|||
context.config.getBoolean ("edit.verbose"); // Deprecated 2.0
|
||||
|
||||
if (verbose)
|
||||
before << "# The 'task edit <id>' command allows you to modify all aspects of a task\n"
|
||||
<< "# using a text editor. Below is a representation of all the task details.\n"
|
||||
<< "# Modify what you wish, and when you save and quit your editor,\n"
|
||||
<< "# taskwarrior will read this file, determine what changed, and apply\n"
|
||||
<< "# those changes. If you exit your editor without saving or making\n"
|
||||
<< "# modifications, taskwarrior will do nothing.\n"
|
||||
before << "# " << STRING_EDIT_HEADER_1 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_2 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_3 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_4 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_5 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_6 << "\n"
|
||||
<< "#\n"
|
||||
<< "# Lines that begin with # represent data you cannot change, like ID.\n"
|
||||
<< "# If you get too creative with your editing, taskwarrior will send you\n"
|
||||
<< "# back to the editor to try again.\n"
|
||||
<< "# " << STRING_EDIT_HEADER_7 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_8 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_9 << "\n"
|
||||
<< "#\n"
|
||||
<< "# Should you find yourself in an endless loop, re-editing the same file,\n"
|
||||
<< "# just quit the editor without making any changes. Taskwarrior will \n"
|
||||
<< "# notice this and stop the editing.\n"
|
||||
<< "# " << STRING_EDIT_HEADER_10 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_11 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_12 << "\n"
|
||||
<< "#\n";
|
||||
|
||||
before << "# Name Editable details\n"
|
||||
<< "# ----------------- ----------------------------------------------------\n"
|
||||
before << "# " << STRING_EDIT_TABLE_HEADER_1 << "\n"
|
||||
<< "# " << STRING_EDIT_TABLE_HEADER_2 << "\n"
|
||||
<< "# ID: " << task.id << "\n"
|
||||
<< "# UUID: " << task.get ("uuid") << "\n"
|
||||
<< "# Status: " << ucFirst (Task::statusToText (task.getStatus ())) << "\n"
|
||||
|
@ -175,7 +177,7 @@ std::string CmdEdit::formatTask (Task task)
|
|||
join (allTags, " ", tags);
|
||||
|
||||
if (verbose)
|
||||
before << "# Separate the tags with spaces, like this: tag1 tag2\n";
|
||||
before << "# " << STRING_EDIT_TAG_SEP << "\n";
|
||||
|
||||
before << " Tags: " << allTags << "\n"
|
||||
<< " Description: " << task.get ("description") << "\n"
|
||||
|
@ -191,9 +193,9 @@ std::string CmdEdit::formatTask (Task task)
|
|||
<< " Background color: " << task.get ("bg") << "\n";
|
||||
|
||||
if (verbose)
|
||||
before << "# Annotations look like this: <date> -- <text> and there can be any number of them.\n"
|
||||
<< "# The ' -- ' separator between the date and text field should not be removed.\n"
|
||||
<< "# A \"blank slot\" for adding an annotation follows for your convenience.\n";
|
||||
before << "# " << STRING_EDIT_HEADER_13 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_14 << "\n"
|
||||
<< "# " << STRING_EDIT_HEADER_15 << "\n";
|
||||
|
||||
std::map <std::string, std::string> annotations;
|
||||
task.getAnnotations (annotations);
|
||||
|
@ -215,11 +217,11 @@ std::string CmdEdit::formatTask (Task task)
|
|||
join (allDeps, ",", dependencies);
|
||||
|
||||
if (verbose)
|
||||
before << "# Dependencies should be a comma-separated list of task IDs, with no spaces.\n";
|
||||
before << "# " << STRING_EDIT_DEP_SEP << "\n";
|
||||
|
||||
before << " Dependencies: " << allDeps << "\n";
|
||||
|
||||
before << "# End\n";
|
||||
before << "# " << STRING_EDIT_END << "\n";
|
||||
return before.str ();
|
||||
}
|
||||
|
||||
|
@ -232,12 +234,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (value != "")
|
||||
{
|
||||
context.footnote ("Project modified.");
|
||||
context.footnote (STRING_EDIT_PROJECT_MOD);
|
||||
task.set ("project", value);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Project deleted.");
|
||||
context.footnote (STRING_EDIT_PROJECT_DEL);
|
||||
task.remove ("project");
|
||||
}
|
||||
}
|
||||
|
@ -250,13 +252,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (context.columns["priority"]->validate (value))
|
||||
{
|
||||
context.footnote ("Priority modified.");
|
||||
context.footnote (STRING_EDIT_PRIORITY_MOD);
|
||||
task.set ("priority", value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Priority deleted.");
|
||||
context.footnote (STRING_EDIT_PRIORITY_DEL);
|
||||
task.remove ("priority");
|
||||
}
|
||||
}
|
||||
|
@ -274,11 +276,11 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (value != "")
|
||||
{
|
||||
context.footnote ("Description modified.");
|
||||
context.footnote (STRING_EDIT_DESC_MOD);
|
||||
task.set ("description", value);
|
||||
}
|
||||
else
|
||||
throw std::string ("Cannot remove description.");
|
||||
throw std::string (STRING_EDIT_DESC_REMOVE_ERR);
|
||||
}
|
||||
|
||||
// entry
|
||||
|
@ -290,12 +292,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Date original (task.get_date ("entry"));
|
||||
if (!original.sameDay (edited))
|
||||
{
|
||||
context.footnote ("Creation date modified.");
|
||||
context.footnote (STRING_EDIT_ENTRY_MOD);
|
||||
task.set ("entry", value);
|
||||
}
|
||||
}
|
||||
else
|
||||
throw std::string ("Cannot remove creation date.");
|
||||
throw std::string (STRING_EDIT_ENTRY_REMOVE_ERR);
|
||||
|
||||
// start
|
||||
value = findDate (after, "\n Started:");
|
||||
|
@ -308,13 +310,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Date original (task.get_date ("start"));
|
||||
if (!original.sameDay (edited))
|
||||
{
|
||||
context.footnote ("Start date modified.");
|
||||
context.footnote (STRING_EDIT_START_MOD);
|
||||
task.set ("start", value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Start date modified.");
|
||||
context.footnote (STRING_EDIT_START_MOD);
|
||||
task.set ("start", value);
|
||||
}
|
||||
}
|
||||
|
@ -322,7 +324,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (task.get ("start") != "")
|
||||
{
|
||||
context.footnote ("Start date removed.");
|
||||
context.footnote (STRING_EDIT_START_DEL);
|
||||
task.remove ("start");
|
||||
}
|
||||
}
|
||||
|
@ -338,18 +340,18 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Date original (task.get_date ("end"));
|
||||
if (!original.sameDay (edited))
|
||||
{
|
||||
context.footnote ("Done date modified.");
|
||||
context.footnote (STRING_EDIT_END_MOD);
|
||||
task.set ("end", value);
|
||||
}
|
||||
}
|
||||
else if (task.getStatus () != Task::deleted)
|
||||
throw std::string ("Cannot set a done date on a pending task.");
|
||||
throw std::string (STRING_EDIT_END_SET_ERR);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (task.get ("end") != "")
|
||||
{
|
||||
context.footnote ("Done date removed.");
|
||||
context.footnote (STRING_EDIT_END_DEL);
|
||||
task.setStatus (Task::pending);
|
||||
task.remove ("end");
|
||||
}
|
||||
|
@ -366,13 +368,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Date original (task.get_date ("due"));
|
||||
if (!original.sameDay (edited))
|
||||
{
|
||||
context.footnote ("Due date modified.");
|
||||
context.footnote (STRING_EDIT_DUE_MOD);
|
||||
task.set ("due", value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Due date modified.");
|
||||
context.footnote (STRING_EDIT_DUE_MOD);
|
||||
task.set ("due", value);
|
||||
}
|
||||
}
|
||||
|
@ -383,11 +385,11 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
if (task.getStatus () == Task::recurring ||
|
||||
task.get ("parent") != "")
|
||||
{
|
||||
context.footnote ("Cannot remove a due date from a recurring task.");
|
||||
context.footnote (STRING_EDIT_DUE_DEL_ERR);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Due date removed.");
|
||||
context.footnote (STRING_EDIT_DUE_DEL);
|
||||
task.remove ("due");
|
||||
}
|
||||
}
|
||||
|
@ -404,13 +406,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Date original (task.get_date ("until"));
|
||||
if (!original.sameDay (edited))
|
||||
{
|
||||
context.footnote ("Until date modified.");
|
||||
context.footnote (STRING_EDIT_UNTIL_MOD);
|
||||
task.set ("until", value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Until date modified.");
|
||||
context.footnote (STRING_EDIT_UNTIL_MOD);
|
||||
task.set ("until", value);
|
||||
}
|
||||
}
|
||||
|
@ -418,7 +420,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (task.get ("until") != "")
|
||||
{
|
||||
context.footnote ("Until date removed.");
|
||||
context.footnote (STRING_EDIT_UNTIL_DEL);
|
||||
task.remove ("until");
|
||||
}
|
||||
}
|
||||
|
@ -432,21 +434,21 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Duration d;
|
||||
if (d.valid (value))
|
||||
{
|
||||
context.footnote ("Recurrence modified.");
|
||||
context.footnote (STRING_EDIT_RECUR_MOD);
|
||||
if (task.get ("due") != "")
|
||||
{
|
||||
task.set ("recur", value);
|
||||
task.setStatus (Task::recurring);
|
||||
}
|
||||
else
|
||||
throw std::string ("A recurring task must have a due date.");
|
||||
throw std::string (STRING_EDIT_RECUR_DUE_ERR);
|
||||
}
|
||||
else
|
||||
throw std::string ("Not a valid recurrence duration.");
|
||||
throw std::string (STRING_EDIT_RECUR_ERR);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Recurrence removed.");
|
||||
context.footnote (STRING_EDIT_RECUR_DEL);
|
||||
task.setStatus (Task::pending);
|
||||
task.remove ("recur");
|
||||
task.remove ("until");
|
||||
|
@ -466,14 +468,14 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
Date original (task.get_date ("wait"));
|
||||
if (!original.sameDay (edited))
|
||||
{
|
||||
context.footnote ("Wait date modified.");
|
||||
context.footnote (STRING_EDIT_WAIT_MOD);
|
||||
task.set ("wait", value);
|
||||
task.setStatus (Task::waiting);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Wait date modified.");
|
||||
context.footnote (STRING_EDIT_WAIT_MOD);
|
||||
task.set ("wait", value);
|
||||
task.setStatus (Task::waiting);
|
||||
}
|
||||
|
@ -482,7 +484,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (task.get ("wait") != "")
|
||||
{
|
||||
context.footnote ("Wait date removed.");
|
||||
context.footnote (STRING_EDIT_WAIT_DEL);
|
||||
task.remove ("wait");
|
||||
task.setStatus (Task::pending);
|
||||
}
|
||||
|
@ -494,12 +496,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (value != "")
|
||||
{
|
||||
context.footnote ("Parent UUID modified.");
|
||||
context.footnote (STRING_EDIT_PARENT_MOD);
|
||||
task.set ("parent", value);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Parent UUID removed.");
|
||||
context.footnote (STRING_EDIT_PARENT_DEL);
|
||||
task.remove ("parent");
|
||||
}
|
||||
}
|
||||
|
@ -510,12 +512,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (value != "")
|
||||
{
|
||||
context.footnote ("Foreground color modified.");
|
||||
context.footnote (STRING_EDIT_FG_MOD);
|
||||
task.set ("fg", value);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Foreground color removed.");
|
||||
context.footnote (STRING_EDIT_FG_DEL);
|
||||
task.remove ("fg");
|
||||
}
|
||||
}
|
||||
|
@ -526,12 +528,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after)
|
|||
{
|
||||
if (value != "")
|
||||
{
|
||||
context.footnote ("Background color modified.");
|
||||
context.footnote (STRING_EDIT_BG_MOD);
|
||||
task.set ("bg", value);
|
||||
}
|
||||
else
|
||||
{
|
||||
context.footnote ("Background color removed.");
|
||||
context.footnote (STRING_EDIT_BG_DEL);
|
||||
task.remove ("bg");
|
||||
}
|
||||
}
|
||||
|
@ -591,7 +593,7 @@ bool CmdEdit::editFile (Task& task)
|
|||
// Check for file permissions.
|
||||
Directory location (context.config.get ("data.location"));
|
||||
if (! location.writable ())
|
||||
throw std::string ("Your data.location directory is not writable.");
|
||||
throw std::string (STRING_EDIT_UNWRITABLE);
|
||||
|
||||
// Create a temp file name in data.location.
|
||||
std::stringstream file;
|
||||
|
@ -620,11 +622,11 @@ ARE_THESE_REALLY_HARMFUL:
|
|||
bool changes = false; // No changes made.
|
||||
|
||||
// Launch the editor.
|
||||
std::cout << "Launching '" << editor << "' now...\n";
|
||||
std::cout << format (STRING_EDIT_LAUNCHING, editor) << "\n";
|
||||
if (-1 == system (editor.c_str ()))
|
||||
std::cout << "No editing performed.\n";
|
||||
std::cout << STRING_EDIT_NO_EDITS << "\n";
|
||||
else
|
||||
std::cout << "Editing complete.\n";
|
||||
std::cout << STRING_EDIT_COMPLETE << "\n";
|
||||
|
||||
// Slurp file.
|
||||
std::string after;
|
||||
|
@ -634,7 +636,7 @@ ARE_THESE_REALLY_HARMFUL:
|
|||
// if changes were made.
|
||||
if (before != after)
|
||||
{
|
||||
std::cout << "Edits were detected.\n";
|
||||
std::cout << STRING_EDIT_CHANGES << "\n";
|
||||
std::string problem = "";
|
||||
bool oops = false;
|
||||
|
||||
|
@ -651,13 +653,13 @@ ARE_THESE_REALLY_HARMFUL:
|
|||
|
||||
if (oops)
|
||||
{
|
||||
std::cout << "Error: " << problem << "\n";
|
||||
std::cout << STRING_ERROR_PREFIX << problem << "\n";
|
||||
|
||||
// Preserve the edits.
|
||||
before = after;
|
||||
File::write (file.str (), before);
|
||||
|
||||
if (confirm ("Taskwarrior couldn't handle your edits. Would you like to try again?"))
|
||||
if (confirm (STRING_EDIT_UNPARSEABLE))
|
||||
goto ARE_THESE_REALLY_HARMFUL;
|
||||
}
|
||||
else
|
||||
|
@ -665,7 +667,7 @@ ARE_THESE_REALLY_HARMFUL:
|
|||
}
|
||||
else
|
||||
{
|
||||
std::cout << "No edits were detected.\n";
|
||||
std::cout << STRING_EDIT_NO_CHANGES << "\n";
|
||||
changes = false;
|
||||
}
|
||||
|
||||
|
|
68
src/en-US.h
68
src/en-US.h
|
@ -582,8 +582,76 @@
|
|||
#define STRING_E9_INSUFFICIENT_OP "There are not enough operands for the '{1}' operator."
|
||||
#define STRING_E9_MORE_OP "Found extra operands."
|
||||
|
||||
// edit
|
||||
#define STRING_EDIT_NO_CHANGES "No edits were detected."
|
||||
#define STRING_EDIT_NO_EDITS "No editing performed."
|
||||
#define STRING_EDIT_COMPLETE "Editing complete."
|
||||
#define STRING_EDIT_LAUNCHING "Launching '{1}' now..."
|
||||
#define STRING_EDIT_CHANGES "Edits were detected."
|
||||
#define STRING_EDIT_UNPARSEABLE "Taskwarrior couldn't handle your edits. Would you like to try again?"
|
||||
#define STRING_EDIT_UNWRITABLE "Your data.location directory is not writable."
|
||||
#define STRING_EDIT_TAG_SEP "Separate the tags with spaces, like this: tag1 tag2"
|
||||
#define STRING_EDIT_DEP_SEP "Dependencies should be a comma-separated list of task IDs, with no spaces."
|
||||
#define STRING_EDIT_END "End"
|
||||
|
||||
#define STRING_EDIT_PROJECT_MOD "Project modified."
|
||||
#define STRING_EDIT_PROJECT_DEL "Project deleted."
|
||||
#define STRING_EDIT_PRIORITY_MOD "Priority modified."
|
||||
#define STRING_EDIT_PRIORITY_DEL "Priority deleted."
|
||||
#define STRING_EDIT_DESC_MOD "Description modified."
|
||||
#define STRING_EDIT_DESC_REMOVE_ERR "Cannot remove description."
|
||||
#define STRING_EDIT_ENTRY_REMOVE_ERR "Cannot remove creation date."
|
||||
#define STRING_EDIT_ENTRY_MOD "Creation date modified."
|
||||
#define STRING_EDIT_START_MOD "Start date modified."
|
||||
#define STRING_EDIT_START_DEL "Start date removed."
|
||||
#define STRING_EDIT_END_MOD "End date modified."
|
||||
#define STRING_EDIT_END_DEL "End date removed."
|
||||
#define STRING_EDIT_END_SET_ERR "Cannot set a done date on a pending task."
|
||||
#define STRING_EDIT_DUE_MOD "Due date modified."
|
||||
#define STRING_EDIT_DUE_DEL "Due date removed."
|
||||
#define STRING_EDIT_DUE_DEL_ERR "Cannot remove a due date from a recurring task."
|
||||
#define STRING_EDIT_UNTIL_MOD "Until date modified."
|
||||
#define STRING_EDIT_UNTIL_DEL "Until date removed."
|
||||
#define STRING_EDIT_RECUR_MOD "Recurrence modified."
|
||||
#define STRING_EDIT_RECUR_DEL "Recurrence removed."
|
||||
#define STRING_EDIT_RECUR_DUE_ERR "A recurring task must have a due date."
|
||||
#define STRING_EDIT_RECUR_ERR "Not a valid recurrence duration."
|
||||
#define STRING_EDIT_WAIT_MOD "Wait date modified."
|
||||
#define STRING_EDIT_WAIT_DEL "Wait date removed."
|
||||
#define STRING_EDIT_PARENT_MOD "Parent UUID modified."
|
||||
#define STRING_EDIT_PARENT_DEL "Parent UUID removed."
|
||||
#define STRING_EDIT_FG_MOD "Foreground color modified."
|
||||
#define STRING_EDIT_FG_DEL "Foreground color removed."
|
||||
#define STRING_EDIT_BG_MOD "Background color modified."
|
||||
#define STRING_EDIT_BG_DEL "Background color removed."
|
||||
|
||||
// These four blocks can be replaced, but the number of lines must not change.
|
||||
#define STRING_EDIT_HEADER_1 "The 'task edit <id>' command allows you to modify all aspects of a task"
|
||||
#define STRING_EDIT_HEADER_2 "using a text editor. Below is a representation of all the task details."
|
||||
#define STRING_EDIT_HEADER_3 "Modify what you wish, and when you save and quit your editor,"
|
||||
#define STRING_EDIT_HEADER_4 "taskwarrior will read this file, determine what changed, and apply"
|
||||
#define STRING_EDIT_HEADER_5 "those changes. If you exit your editor without saving or making"
|
||||
#define STRING_EDIT_HEADER_6 "modifications, taskwarrior will do nothing."
|
||||
|
||||
#define STRING_EDIT_HEADER_7 "Lines that begin with # represent data you cannot change, like ID."
|
||||
#define STRING_EDIT_HEADER_8 "If you get too creative with your editing, taskwarrior will send you"
|
||||
#define STRING_EDIT_HEADER_9 "back to the editor to try again."
|
||||
|
||||
#define STRING_EDIT_HEADER_10 "Should you find yourself in an endless loop, re-editing the same file,"
|
||||
#define STRING_EDIT_HEADER_11 "just quit the editor without making any changes. Taskwarrior will"
|
||||
#define STRING_EDIT_HEADER_12 "notice this and stop the editing."
|
||||
|
||||
#define STRING_EDIT_HEADER_13 "Annotations look like this: <date> -- <text> and there can be any number of them."
|
||||
#define STRING_EDIT_HEADER_14 "The ' -- ' separator between the date and text field should not be removed."
|
||||
#define STRING_EDIT_HEADER_15 "A \"blank slot\" for adding an annotation follows for your convenience."
|
||||
|
||||
// Maintain the same spacing.
|
||||
#define STRING_EDIT_TABLE_HEADER_1 "Name Editable details"
|
||||
#define STRING_EDIT_TABLE_HEADER_2 "----------------- ----------------------------------------------------"
|
||||
|
||||
// Errors
|
||||
// TODO Move each of these to appropriate section.
|
||||
#define STRING_ERROR_PREFIX "Error: "
|
||||
#define STRING_UNKNOWN_ERROR "Unknown error."
|
||||
#define STRING_NO_HOME "Could not read home directory from the passwd file."
|
||||
#define STRING_TRIVIAL_INPUT "You must specify a command or a task to modify."
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue