diff --git a/desktop_version/lang/en/strings.xml b/desktop_version/lang/en/strings.xml
index 4b6ab504..79f47aff 100644
--- a/desktop_version/lang/en/strings.xml
+++ b/desktop_version/lang/en/strings.xml
@@ -445,8 +445,11 @@
-
-
+
+
+
+
+
diff --git a/desktop_version/lang/eo/strings.xml b/desktop_version/lang/eo/strings.xml
index 91573c9a..4f6f4a4a 100644
--- a/desktop_version/lang/eo/strings.xml
+++ b/desktop_version/lang/eo/strings.xml
@@ -445,8 +445,11 @@
-
-
+
+
+
+
+
diff --git a/desktop_version/lang/es/strings.xml b/desktop_version/lang/es/strings.xml
index 039831d9..2018dbad 100644
--- a/desktop_version/lang/es/strings.xml
+++ b/desktop_version/lang/es/strings.xml
@@ -445,8 +445,11 @@
-
-
+
+
+
+
+
diff --git a/desktop_version/lang/nl/strings.xml b/desktop_version/lang/nl/strings.xml
index cc9f0f78..ef22fdd0 100644
--- a/desktop_version/lang/nl/strings.xml
+++ b/desktop_version/lang/nl/strings.xml
@@ -445,8 +445,11 @@
-
-
+
+
+
+
+
diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp
index 2bbab854..8e504b7a 100644
--- a/desktop_version/src/Graphics.cpp
+++ b/desktop_version/src/Graphics.cpp
@@ -966,30 +966,58 @@ void Graphics::printcrewnamedark( int x, int y, int t )
}
}
-void Graphics::printcrewnamestatus( int x, int y, int t )
+void Graphics::printcrewnamestatus( int x, int y, int t, bool rescued )
{
//Print the status of crew member t in the right colour
+ int r, g, b;
+ char gender;
+
switch(t)
{
case 0:
- Print(x, y, loc::gettext("(that's you!)"), 12, 140, 140,false);
+ r=12; g=140, b=140;
+ gender = 3;
break;
case 1:
- Print(x, y, loc::gettext("Rescued!"), 140, 12, 140,false);
+ r=140; g=12; b=140;
+ gender = 2;
break;
case 2:
- Print(x, y, loc::gettext("Rescued!"), 140, 140, 12,false);
+ r=140; g=140; b=12;
+ gender = 1;
break;
case 3:
- Print(x, y, loc::gettext("Rescued!"), 140, 12, 12,false);
+ r=140; g=12; b=12;
+ gender = 1;
break;
case 4:
- Print(x, y, loc::gettext("Rescued!"), 12, 140, 12,false);
+ r=12; g=140; b=12;
+ gender = 1;
break;
case 5:
- Print(x, y, loc::gettext("Rescued!"), 12, 12, 140,false);
+ r=12; g=12; b=140;
+ gender = 2;
break;
+ default:
+ return;
}
+
+ const char* status_text;
+ if (gender == 3 && rescued)
+ {
+ status_text = loc::gettext("(that's you!)");
+ }
+ else if (rescued)
+ {
+ status_text = loc::gettext_case("Rescued!", gender);
+ }
+ else
+ {
+ r=64; g=64; b=64;
+ status_text = loc::gettext_case("Missing...", gender);
+ }
+
+ Print(x, y, status_text, r, g, b, false);
}
void Graphics::drawsprite( int x, int y, int t, int r, int g, int b )
diff --git a/desktop_version/src/Graphics.h b/desktop_version/src/Graphics.h
index e5dd16b1..e6ddec13 100644
--- a/desktop_version/src/Graphics.h
+++ b/desktop_version/src/Graphics.h
@@ -144,11 +144,10 @@ public:
void drawsprite(int x, int y, int t, Uint32 c);
void printcrewname(int x, int y, int t);
-
- void printcrewnamestatus(int x, int y, int t);
-
void printcrewnamedark(int x, int y, int t);
+ void printcrewnamestatus(int x, int y, int t, bool rescued);
+
void map_tab(int opt, const char* text, bool selected = false);
void map_option(int opt, int num_opts, const std::string& text, bool selected = false);
diff --git a/desktop_version/src/Localization.cpp b/desktop_version/src/Localization.cpp
index 298a9c1b..01786d74 100644
--- a/desktop_version/src/Localization.cpp
+++ b/desktop_version/src/Localization.cpp
@@ -50,6 +50,28 @@ const char* gettext(const char* eng)
return map_lookup_text(map_translation, eng, eng);
}
+const char* gettext_case(const char* eng, char textcase)
+{
+ if (lang == "en")
+ {
+ return eng;
+ }
+ if (textcase == 0)
+ {
+ return gettext(eng);
+ }
+
+ char* eng_prefixed = add_disambiguator(textcase, eng, NULL);
+ if (eng_prefixed == NULL)
+ {
+ return eng;
+ }
+
+ const char* tra = map_lookup_text(map_translation, eng_prefixed, eng);
+ SDL_free(eng_prefixed);
+ return tra;
+}
+
static const char* gettext_plural_english(const char* eng_plural, const char* eng_singular, int n)
{
/* Do be consistent with negative number handling for other languages... */
diff --git a/desktop_version/src/Localization.h b/desktop_version/src/Localization.h
index 9be0fbfa..4d05e43e 100644
--- a/desktop_version/src/Localization.h
+++ b/desktop_version/src/Localization.h
@@ -74,6 +74,7 @@ extern int n_untranslated[COUNT_UNTRANSLATED_INDEX];
const LangMeta* get_langmeta(void);
const char* gettext(const char* eng);
+const char* gettext_case(const char* eng, char textcase);
const char* gettext_plural(const char* eng_plural, const char* eng_singular, int count);
void gettext_plural_fill(char* buf, size_t buf_len, const char* eng_plural, const char* eng_singular, const char* args_index, ...);
std::string getnumber(int n);
diff --git a/desktop_version/src/LocalizationMaint.cpp b/desktop_version/src/LocalizationMaint.cpp
index 4048dde8..26f2f9bc 100644
--- a/desktop_version/src/LocalizationMaint.cpp
+++ b/desktop_version/src/LocalizationMaint.cpp
@@ -88,7 +88,31 @@ static void sync_lang_file(const std::string& langcode)
const char* eng = pElem->Attribute("english");
if (eng != NULL)
{
- pElem->SetAttribute("translation", map_lookup_text(map_translation, eng, ""));
+ char textcase = pElem->UnsignedAttribute("case", 0);
+ const char* tra;
+ if (textcase == 0)
+ {
+ tra = map_lookup_text(map_translation, eng, "");
+ }
+ else
+ {
+ char* eng_prefixed = add_disambiguator(textcase, eng, NULL);
+ if (eng_prefixed == NULL)
+ {
+ /* Are we out of memory? Stop, don't blank our language files... */
+ return;
+ }
+ /* Note the fallback: if this string used to not be cased and now it is,
+ * simply fill in the old single variant we already had. */
+ tra = map_lookup_text(
+ map_translation,
+ eng_prefixed,
+ map_lookup_text(map_translation, eng, "")
+ );
+ SDL_free(eng_prefixed);
+ }
+
+ pElem->SetAttribute("translation", tra);
}
}
@@ -125,7 +149,7 @@ static void sync_lang_file(const std::string& langcode)
char* key = add_disambiguator(form_id+1, eng_plural, NULL);
if (key == NULL)
{
- /* Are we out of memory? Stop, don't blank our language files... */
+ /* Out of memory or something, stop */
return;
}
diff --git a/desktop_version/src/LocalizationStorage.cpp b/desktop_version/src/LocalizationStorage.cpp
index 428857d1..de2153bb 100644
--- a/desktop_version/src/LocalizationStorage.cpp
+++ b/desktop_version/src/LocalizationStorage.cpp
@@ -416,12 +416,33 @@ static void loadtext_strings(bool check_max)
const char* eng = pElem->Attribute("english");
const char* tra = pElem->Attribute("translation");
- map_store_translation(
- &textbook_main,
- map_translation,
- eng,
- tra
- );
+ char textcase = pElem->UnsignedAttribute("case", 0);
+
+ if (textcase == 0)
+ {
+ map_store_translation(
+ &textbook_main,
+ map_translation,
+ eng,
+ tra
+ );
+ }
+ else
+ {
+ /* Only prefix with a disambiguator if a specific case number is set */
+ char* eng_prefixed = add_disambiguator(textcase, eng, NULL);
+ if (eng_prefixed == NULL)
+ {
+ continue;
+ }
+ map_store_translation(
+ &textbook_main,
+ map_translation,
+ eng_prefixed,
+ tra
+ );
+ SDL_free(eng_prefixed);
+ }
/* Only tally an untranslated string if English isn't blank */
if (eng != NULL && eng[0] != '\0')
diff --git a/desktop_version/src/Render.cpp b/desktop_version/src/Render.cpp
index d9f9015e..8e514454 100644
--- a/desktop_version/src/Render.cpp
+++ b/desktop_version/src/Render.cpp
@@ -2579,25 +2579,23 @@ void maprender(void)
if (game.crewstats[(2-i)])
{
graphics.printcrewname(44, 32 + (i * 64)+4+10, 2-i);
- graphics.printcrewnamestatus(44, 32 + (i * 64)+4, 2-i);
}
else
{
graphics.printcrewnamedark(44, 32 + (i * 64)+4+10, 2-i);
- graphics.Print(44, 32 + (i * 64) + 4, loc::gettext("Missing..."), 64,64,64);
}
+ graphics.printcrewnamestatus(44, 32 + (i * 64)+4, 2-i, game.crewstats[(2-i)]);
graphics.drawcrewman(16+160, 32 + (i * 64), (2-i)+3, game.crewstats[(2-i)+3]);
if (game.crewstats[(2-i)+3])
{
graphics.printcrewname(44+160, 32 + (i * 64)+4+10, (2-i)+3);
- graphics.printcrewnamestatus(44+160, 32 + (i * 64)+4, (2-i)+3);
}
else
{
graphics.printcrewnamedark(44+160, 32 + (i * 64)+4+10, (2-i)+3);
- graphics.Print(44+160, 32 + (i * 64) + 4, loc::gettext("Missing..."), 64,64,64);
}
+ graphics.printcrewnamestatus(44+160, 32 + (i * 64)+4, (2-i)+3, game.crewstats[(2-i)+3]);
}
}
else
@@ -2608,25 +2606,23 @@ void maprender(void)
if (game.crewstats[i])
{
graphics.printcrewname(44, 32 + (i * 64)+4, i);
- graphics.printcrewnamestatus(44, 32 + (i * 64)+4+10, i);
}
else
{
graphics.printcrewnamedark(44, 32 + (i * 64)+4, i);
- graphics.Print(44, 32 + (i * 64) + 4 + 10, loc::gettext("Missing..."), 64,64,64);
}
+ graphics.printcrewnamestatus(44, 32 + (i * 64)+4+10, i, game.crewstats[i]);
graphics.drawcrewman(16+160, 32 + (i * 64), i+3, game.crewstats[i+3]);
if (game.crewstats[i+3])
{
graphics.printcrewname(44+160, 32 + (i * 64)+4, i+3);
- graphics.printcrewnamestatus(44+160, 32 + (i * 64)+4+10, i+3);
}
else
{
graphics.printcrewnamedark(44+160, 32 + (i * 64)+4, i+3);
- graphics.Print(44+160, 32 + (i * 64) + 4 + 10, loc::gettext("Missing..."), 64,64,64);
}
+ graphics.printcrewnamestatus(44+160, 32 + (i * 64)+4+10, i+3, game.crewstats[i+3]);
}
}
}