2019-08-10 11:43:24 +00:00
|
|
|
|
// Hyperbolic Rogue -- language support
|
|
|
|
|
// Copyright (C) 2011-2019 Zeno Rogue, see 'hyper.cpp' for details
|
|
|
|
|
|
|
|
|
|
/** \file language.cpp
|
|
|
|
|
* \brief localization support
|
|
|
|
|
*/
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
|
|
|
|
// #define CHECKTRANS
|
|
|
|
|
|
2019-09-05 07:15:40 +00:00
|
|
|
|
#include "hyper.h"
|
2018-06-10 23:58:31 +00:00
|
|
|
|
namespace hr {
|
|
|
|
|
|
2023-08-21 17:02:25 +00:00
|
|
|
|
EX const string dnameof(eMonster m) { return m >= 0 && m < motypes ? minf[m].name : hr::format("[MONSTER %d]", m); }
|
|
|
|
|
EX const string dnameof(eLand l) { return l >= 0 && l < landtypes ? linf[l].name : hr::format("[LAND %d]", l); }
|
|
|
|
|
EX const string dnameof(eWall w) { return w >= 0 && w < walltypes ? winf[w].name : hr::format("[WALL %d]", w); }
|
|
|
|
|
EX const string dnameof(eItem i) { return i >= 0 && i < ittypes ? iinf[i].name : hr::format("[ITEM %d]", i); }
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
2019-08-09 20:07:03 +00:00
|
|
|
|
#if HDR
|
2024-08-02 02:31:28 +00:00
|
|
|
|
#define NUMLAN 9
|
2019-09-05 07:15:40 +00:00
|
|
|
|
|
2019-08-09 20:07:03 +00:00
|
|
|
|
struct stringpar {
|
|
|
|
|
string v;
|
|
|
|
|
stringpar(string s) : v(s) { }
|
|
|
|
|
stringpar(const char* s) : v(s) { }
|
|
|
|
|
stringpar(eMonster m) { v= minf[m].name; }
|
|
|
|
|
stringpar(eLand l) { v= linf[l].name; }
|
|
|
|
|
stringpar(eWall w) { v= winf[w].name; }
|
|
|
|
|
stringpar(eItem i) { v= iinf[i].name; }
|
|
|
|
|
};
|
|
|
|
|
#endif
|
|
|
|
|
|
2016-08-26 09:58:03 +00:00
|
|
|
|
void rep(string& pattern, string what, string to) {
|
|
|
|
|
while(true) {
|
|
|
|
|
size_t at = pattern.find(what);
|
|
|
|
|
if(at == string::npos) break;
|
|
|
|
|
pattern = pattern.replace(at, what.size(), to);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void reponce(string& pattern, string what, string to) {
|
|
|
|
|
size_t at = pattern.find(what);
|
|
|
|
|
if(at != string::npos)
|
|
|
|
|
pattern = pattern.replace(at, what.size(), to);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef unsigned hashcode;
|
|
|
|
|
|
|
|
|
|
struct sentence {
|
|
|
|
|
hashcode langhash;
|
|
|
|
|
const char* xlat[NUMLAN-1];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct noun {
|
|
|
|
|
int genus;
|
|
|
|
|
const char *nom, *nomp, *acc, *abl;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct fullnoun {
|
|
|
|
|
hashcode langhash;
|
|
|
|
|
int english_grammar_flags;
|
|
|
|
|
noun n[NUMLAN-1];
|
|
|
|
|
};
|
|
|
|
|
|
2017-08-13 18:49:38 +00:00
|
|
|
|
#if !CAP_TRANS
|
2020-10-11 23:28:50 +00:00
|
|
|
|
#if HDR
|
2023-03-28 12:10:13 +00:00
|
|
|
|
#define NUMEXTRA 13
|
2020-10-11 23:28:50 +00:00
|
|
|
|
extern const char* natchars[NUMEXTRA];
|
|
|
|
|
#endif
|
2023-03-28 12:10:13 +00:00
|
|
|
|
const char* natchars[NUMEXTRA] = {"°","é","á", "²", "½", "Θ", "δ", "π", "ϕ", "ᵈ", "∞", "⌫", "√"};
|
2017-03-23 10:53:57 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
2017-07-22 23:33:27 +00:00
|
|
|
|
#if CAP_TRANS
|
2016-08-26 09:58:03 +00:00
|
|
|
|
#include "language-data.cpp"
|
|
|
|
|
|
|
|
|
|
hashcode langhash(const string& s) {
|
|
|
|
|
hashcode r = 0;
|
2018-06-22 12:47:24 +00:00
|
|
|
|
for(int i=0; i<isize(s); i++) r = hashval * r + s[i];
|
2016-08-26 09:58:03 +00:00
|
|
|
|
return r;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class T> const T* findInHashTableS(string s, const T *table, int size) {
|
|
|
|
|
int b = 0, e = size;
|
|
|
|
|
hashcode h = langhash(s);
|
|
|
|
|
while(b!=e) {
|
|
|
|
|
int m = (b+e)>>1;
|
|
|
|
|
// printf("b=%d e=%d m=%d h=%x s=%x\n", b, e, m, table[m].langhash, h);
|
|
|
|
|
if(table[m].langhash >= h) e = m;
|
|
|
|
|
else b = m+1;
|
|
|
|
|
}
|
|
|
|
|
if(e != size && table[e].langhash == h)
|
|
|
|
|
return &table[e];
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define findInHashTable(s,t) findInHashTableS(s, t, sizeof(t) / sizeof(t[0]))
|
2017-03-23 10:53:57 +00:00
|
|
|
|
#endif
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
2022-07-05 00:44:19 +00:00
|
|
|
|
string choose2(int g, string a, string b) {
|
2022-07-05 19:20:21 +00:00
|
|
|
|
g &= GEN_BASE_MASK;
|
|
|
|
|
if(g == GEN_M || g == GEN_O) return a;
|
|
|
|
|
if(g == GEN_F || g == GEN_N) return b;
|
2022-07-05 00:44:19 +00:00
|
|
|
|
return "?" + a;
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-26 09:58:03 +00:00
|
|
|
|
string choose3(int g, string a, string b, string c) {
|
2022-07-05 19:20:21 +00:00
|
|
|
|
g &= GEN_BASE_MASK;
|
|
|
|
|
if(g == GEN_M || g == GEN_O) return a;
|
|
|
|
|
if(g == GEN_F) return b;
|
|
|
|
|
if(g == GEN_N) return c;
|
2022-07-04 23:57:33 +00:00
|
|
|
|
return "?" + a;
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string choose4(int g, string a, string b, string c, string d) {
|
2022-07-05 19:20:21 +00:00
|
|
|
|
g &= GEN_BASE_MASK;
|
|
|
|
|
if(g == GEN_M) return a;
|
|
|
|
|
if(g == GEN_F) return b;
|
|
|
|
|
if(g == GEN_N) return c;
|
|
|
|
|
if(g == GEN_O) return d;
|
2022-07-04 23:57:33 +00:00
|
|
|
|
return "?" + a;
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set<string> warnshown;
|
|
|
|
|
|
2021-06-17 07:55:18 +00:00
|
|
|
|
#if CAP_TRANS
|
2021-05-23 13:47:45 +00:00
|
|
|
|
EX bool translation_exists(const string& x) {
|
|
|
|
|
return findInHashTable(x, all_sentences);
|
|
|
|
|
}
|
2021-06-17 07:55:18 +00:00
|
|
|
|
#endif
|
2021-05-23 13:47:45 +00:00
|
|
|
|
|
2022-07-04 23:57:33 +00:00
|
|
|
|
/** replace gender-based codes in x, based on gender genus; some gender-based codes need to know the word (nom) */
|
2022-07-05 00:44:19 +00:00
|
|
|
|
void genderrep(string& x, const string& w, const noun& N) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
#if CAP_TRANS
|
|
|
|
|
int l = lang();
|
2022-07-05 00:44:19 +00:00
|
|
|
|
auto& genus = N.genus;
|
2022-07-04 23:57:33 +00:00
|
|
|
|
if(l == 1) {
|
|
|
|
|
rep(x, "%łem"+w, choose3(genus, "łem", "łam", "łom"));
|
|
|
|
|
rep(x, "%łeś"+w, choose3(genus, "łeś", "łaś", "łoś"));
|
|
|
|
|
rep(x, "%łeś"+w, choose3(genus, "łeś", "łaś", "łoś"));
|
|
|
|
|
rep(x, "%ął"+w, choose3(genus, "ął", "ęła", "ęło"));
|
|
|
|
|
rep(x, "%ąłeś"+w, choose3(genus, "ąłeś", "ęłaś", "ęłoś"));
|
|
|
|
|
rep(x, "%ógł"+w, choose3(genus, "ógł", "ogła", "ogło"));
|
|
|
|
|
rep(x, "%ł"+w, choose3(genus, "ł", "ła", "ło"));
|
|
|
|
|
rep(x, "%y"+w, choose3(genus, "y", "a", "e"));
|
|
|
|
|
rep(x, "%ya"+w, choose3(genus, "y", "a", "e"));
|
|
|
|
|
rep(x, "%yą"+w, choose4(genus, "ego", "ą", "e", "y"));
|
|
|
|
|
rep(x, "%oa"+w, choose3(genus, "", "a", "o"));
|
|
|
|
|
rep(x, "%ymą"+w, choose3(genus, "ym", "ą", "ym"));
|
|
|
|
|
rep(x, "%go"+w, choose3(genus, "go", "ją", "je"));
|
|
|
|
|
rep(x, "%aka"+w, choose3(genus, "a", "ka", "a"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(l == 3) {
|
|
|
|
|
rep(x, "%l"+w, choose3(genus, "l", "la", "lo"));
|
|
|
|
|
rep(x, "%d"+w, choose3(genus, "", "a", "o"));
|
|
|
|
|
rep(x, "%ý"+w, choose3(genus, "ý", "á", "é"));
|
|
|
|
|
rep(x, "%el"+w, choose3(genus, "el", "la", "lo"));
|
|
|
|
|
rep(x, "%ůj"+w, choose4(genus, "ého", "ou", "é", "ůj"));
|
|
|
|
|
rep(x, "%ým"+w, choose3(genus, "ým", "ou", "ým"));
|
|
|
|
|
rep(x, "%ho"+w, choose3(genus, "ho", "ji", "ho"));
|
|
|
|
|
rep(x, "%ého"+w, choose3(genus, "ého", "ou", "ého"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(l == 4) {
|
|
|
|
|
rep(x, "%E"+w, choose3(genus, "", "а", "о"));
|
|
|
|
|
rep(x, "%A"+w, choose3(genus, "ый", "ая", "ое"));
|
|
|
|
|
rep(x, "%c"+w, choose3(genus, "ся", "ась", ""));
|
|
|
|
|
rep(x, "%y"+w, choose3(genus, "ый", "ая", "ое"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(l == 5) {
|
|
|
|
|
rep(x, "%Der"+w, genus == -1 ? "The" : choose3(genus, "Der", "Die", "Das"));
|
|
|
|
|
rep(x, "%der"+w, genus == -1 ? "the" : choose3(genus, "der", "die", "das"));
|
|
|
|
|
rep(x, "%den"+w, genus == -1 ? "the" : choose3(genus, "den", "die", "das"));
|
|
|
|
|
rep(x, "%dem"+w, genus == -1 ? "the" : choose3(genus, "dem", "der", "dem"));
|
|
|
|
|
}
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
2022-07-04 23:57:33 +00:00
|
|
|
|
if(l == 6) {
|
|
|
|
|
rep(x, "%oa"+w, choose4(genus, "o", "a", "os", "as"));
|
|
|
|
|
rep(x, "%seu"+w, choose4(genus, "seu", "sua", "seus", "suas"));
|
2022-07-05 00:44:19 +00:00
|
|
|
|
rep(x, "%na"+w, choose4(genus, "o", "a", "os", "as") + " " + N.nom);
|
|
|
|
|
rep(x, "%Na"+w, choose4(genus, "O", "A", "Os", "As") + " " + N.nom);
|
|
|
|
|
rep(x, "%g"+w, choose4(genus, "do", "da", "dos", "das")+ " " + N.nom);
|
|
|
|
|
rep(x, "%d"+w, choose4(genus, "ao", "à", "aos", "às")+ " " + N.nom);
|
|
|
|
|
rep(x, "%l"+w, choose4(genus, "no", "na", "nos", "nas")+ " " + N.nom);
|
|
|
|
|
rep(x, "%abl"+w, choose4(genus, "pelo", "pela", "pelos", "pelas")+ " " + N.nom);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(l == 7) {
|
2022-07-05 17:57:02 +00:00
|
|
|
|
if(genus & GENF_PROPER)
|
|
|
|
|
{
|
2022-07-05 19:04:28 +00:00
|
|
|
|
rep(x, "%le"+w, N.nom);
|
|
|
|
|
rep(x, "%Le"+w, N.nom);
|
|
|
|
|
rep(x, "%un"+w, N.nom);
|
|
|
|
|
rep(x, "%Un"+w, N.nom);
|
2022-07-05 00:44:19 +00:00
|
|
|
|
}
|
2022-07-05 17:57:02 +00:00
|
|
|
|
else if(genus & GENF_PLURALONLY)
|
|
|
|
|
{
|
2022-07-05 19:04:28 +00:00
|
|
|
|
rep(x, "%le"+w, s0+"les "+N.nomp);
|
|
|
|
|
rep(x, "%Le"+w, s0+"Les "+N.nomp);
|
|
|
|
|
rep(x, "%un"+w, s0+"des "+N.nomp);
|
|
|
|
|
rep(x, "%Un"+w, s0+"Des "+N.nomp);
|
2022-07-05 00:44:19 +00:00
|
|
|
|
}
|
2022-07-05 17:57:02 +00:00
|
|
|
|
else if(genus & GENF_ELISION)
|
|
|
|
|
{
|
2022-07-05 21:16:56 +00:00
|
|
|
|
rep(x, "%de"+w, s0+"d'"+N.nom);
|
2022-07-05 19:04:28 +00:00
|
|
|
|
rep(x, "%le"+w, s0+"l'"+N.nom);
|
|
|
|
|
rep(x, "%Le"+w, s0+"L'"+N.nom);
|
2022-07-05 17:57:02 +00:00
|
|
|
|
}
|
|
|
|
|
if(genus == 0) {
|
2022-07-05 19:04:28 +00:00
|
|
|
|
rep(x, " de %le"+w, s0+" du "+N.nom);
|
|
|
|
|
rep(x, " à %le"+w, s0+" au "+N.nom);
|
2022-07-05 17:57:02 +00:00
|
|
|
|
}
|
|
|
|
|
rep(x, "%le"+w, choose2(genus, "le ", "la ")+N.nom);
|
|
|
|
|
rep(x, "%Le"+w, choose2(genus, "Le ", "La ")+N.nom);
|
2022-07-05 00:44:19 +00:00
|
|
|
|
rep(x, "%un"+w, choose2(genus, "un ", "une ")+N.nom);
|
|
|
|
|
rep(x, "%Un"+w, choose2(genus, "Un ", "Une ")+N.nom);
|
2022-07-05 21:16:56 +00:00
|
|
|
|
rep(x, "%de"+w, s0+"de "+N.nom);
|
2022-07-05 21:00:10 +00:00
|
|
|
|
|
|
|
|
|
rep(x, "%er"+w, choose2(genus, "er", "ère"));
|
|
|
|
|
rep(x, "%e"+w, choose2(genus, "", "e"));
|
|
|
|
|
rep(x, "%x"+w, choose2(genus, "x", "se"));
|
2022-07-04 23:57:33 +00:00
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void basicrep(string& x) {
|
2017-07-22 23:33:27 +00:00
|
|
|
|
#if CAP_TRANS
|
2017-03-23 10:53:57 +00:00
|
|
|
|
const sentence *s = findInHashTable(x, all_sentences);
|
|
|
|
|
if(!s && !warnshown.count(x)) {
|
|
|
|
|
printf("WARNING: no translations for '%s'\n", x.c_str());
|
|
|
|
|
warnshown.insert(x);
|
|
|
|
|
}
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
|
|
|
|
int l = lang();
|
|
|
|
|
if(l) {
|
|
|
|
|
const sentence *s = findInHashTable(x, all_sentences);
|
|
|
|
|
if(s) x = s->xlat[l-1];
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-05 00:44:19 +00:00
|
|
|
|
noun dummy;
|
|
|
|
|
dummy.genus = playergender();
|
|
|
|
|
dummy.nom = dummy.nomp = dummy.acc = dummy.abl = "player";
|
|
|
|
|
genderrep(x, "0", dummy);
|
2017-03-23 10:53:57 +00:00
|
|
|
|
#endif
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void parrep(string& x, string w, stringpar p) {
|
2017-07-22 23:33:27 +00:00
|
|
|
|
#if CAP_TRANS
|
2016-08-26 09:58:03 +00:00
|
|
|
|
int l = lang();
|
|
|
|
|
const fullnoun *N = findInHashTable(p.v, all_nouns);
|
2022-07-04 23:57:33 +00:00
|
|
|
|
noun dummy;
|
|
|
|
|
auto &data = N ? N->n[l-1] : dummy;
|
|
|
|
|
if(!N) {
|
|
|
|
|
dummy.nom = dummy.nomp = dummy.acc = dummy.abl = p.v.c_str();
|
|
|
|
|
dummy.genus = -1;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-05 00:44:19 +00:00
|
|
|
|
genderrep(x, w, data);
|
2022-07-04 23:57:33 +00:00
|
|
|
|
|
2016-08-26 09:58:03 +00:00
|
|
|
|
if(l == 1) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
rep(x, "%"+w, data.nom);
|
|
|
|
|
rep(x, "%P"+w, data.nomp);
|
|
|
|
|
rep(x, "%a"+w, data.acc);
|
|
|
|
|
rep(x, "%abl"+w, data.abl);
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
if(l == 2) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
rep(x, "%"+w, N->n[1].nom);
|
|
|
|
|
rep(x, "%P"+w, N->n[1].nomp);
|
|
|
|
|
rep(x, "%a"+w, N->n[1].acc);
|
|
|
|
|
rep(x, "%abl"+w, N->n[1].abl);
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
if(l == 3) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
rep(x, "%"+w, data.nom);
|
|
|
|
|
rep(x, "%P"+w, data.nomp);
|
|
|
|
|
rep(x, "%a"+w, data.acc);
|
|
|
|
|
rep(x, "%abl"+w, data.abl);
|
|
|
|
|
if(p.v == "Mirror Image")
|
|
|
|
|
rep(x, "%s"+w, "se");
|
|
|
|
|
if(p.v == "Mirage")
|
|
|
|
|
rep(x, "%s"+w, "s");
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
if(l == 4) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
rep(x, "%"+w, data.nom);
|
|
|
|
|
rep(x, "%P"+w, data.nomp);
|
|
|
|
|
rep(x, "%a"+w, data.acc);
|
|
|
|
|
rep(x, "%abl"+w, data.abl);
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
|
|
|
|
if(l == 5) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
rep(x, "%"+w, data.nom);
|
|
|
|
|
rep(x, "%P"+w, data.nomp);
|
|
|
|
|
rep(x, "%a"+w, data.acc);
|
|
|
|
|
rep(x, "%abl"+w, data.abl);
|
|
|
|
|
rep(x, "%d"+w, data.abl); // Dativ (which equals Ablative in German)
|
2016-08-26 09:58:03 +00:00
|
|
|
|
}
|
2017-08-06 12:50:16 +00:00
|
|
|
|
if(l == 6) {
|
2022-07-04 23:57:33 +00:00
|
|
|
|
rep(x, "%"+w, data.nom);
|
|
|
|
|
rep(x, "%P"+w, data.nomp);
|
2017-08-06 12:50:16 +00:00
|
|
|
|
}
|
2022-07-05 00:44:19 +00:00
|
|
|
|
if(l == 7) {
|
|
|
|
|
rep(x, "%"+w, data.nom);
|
|
|
|
|
rep(x, "%P"+w, data.nomp);
|
|
|
|
|
rep(x, "%a"+w, data.acc);
|
|
|
|
|
rep(x, "%abl"+w, data.abl);
|
|
|
|
|
rep(x, "%d"+w, data.abl); // Dativ (which equals Ablative in German)
|
|
|
|
|
}
|
2024-08-02 02:31:28 +00:00
|
|
|
|
if(l == 8) {
|
|
|
|
|
rep(x, "%"+w, data.nom);
|
2024-08-05 03:48:14 +00:00
|
|
|
|
rep(x, "%m"+w, data.abl); // Measure word in Chinese
|
2024-08-02 02:31:28 +00:00
|
|
|
|
}
|
2017-03-23 10:53:57 +00:00
|
|
|
|
#endif
|
2016-08-26 09:58:03 +00:00
|
|
|
|
if(true) {
|
|
|
|
|
// proper names (R'Lyeh)
|
|
|
|
|
rep(x,"%"+w,p.v);
|
2017-08-13 18:49:38 +00:00
|
|
|
|
#if !CAP_TRANS
|
2017-03-23 10:53:57 +00:00
|
|
|
|
int flags = 0;
|
|
|
|
|
if(p.v == "R'Lyeh" || p.v == "Camelot") flags = 1;
|
|
|
|
|
if(p.v == "Crossroads" || p.v == "Crossroads II" ||
|
|
|
|
|
p.v == "Crossroads III" || p.v == "Crossroads IV" ||
|
|
|
|
|
p.v == "Kraken Depths" || p.v == "Elemental Planes")
|
|
|
|
|
flags = 2;
|
|
|
|
|
#else
|
|
|
|
|
int flags = N ? N->english_grammar_flags : 0;
|
|
|
|
|
#endif
|
|
|
|
|
if(flags & 1) {
|
2016-08-26 09:58:03 +00:00
|
|
|
|
rep(x,"%the"+w, p.v);
|
|
|
|
|
rep(x,"%The"+w, p.v);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
rep(x,"%the"+w, "the " + p.v);
|
|
|
|
|
rep(x,"%The"+w, "The " + p.v);
|
|
|
|
|
rep(x,"%him"+w, princessgender() ? "her" : "him");
|
|
|
|
|
rep(x,"%his"+w, princessgender() ? "her" : "his");
|
|
|
|
|
}
|
|
|
|
|
// plural names (Crossroads)
|
2017-03-23 10:53:57 +00:00
|
|
|
|
if(flags & 2)
|
2016-08-26 09:58:03 +00:00
|
|
|
|
rep(x,"%s"+w, "");
|
|
|
|
|
else
|
|
|
|
|
rep(x,"%s"+w, "s");
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void postrep(string& s) {
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-10 11:43:24 +00:00
|
|
|
|
/** translate the string @x */
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT(string x) {
|
2016-08-26 09:58:03 +00:00
|
|
|
|
basicrep(x);
|
|
|
|
|
postrep(x);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT(string x, stringpar p1) {
|
2016-08-26 09:58:03 +00:00
|
|
|
|
basicrep(x);
|
|
|
|
|
parrep(x,"1",p1.v);
|
|
|
|
|
postrep(x);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT(string x, stringpar p1, stringpar p2) {
|
2016-08-26 09:58:03 +00:00
|
|
|
|
basicrep(x);
|
|
|
|
|
parrep(x,"1",p1.v);
|
|
|
|
|
parrep(x,"2",p2.v);
|
|
|
|
|
postrep(x);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT(string x, stringpar p1, stringpar p2, stringpar p3) {
|
2016-08-26 09:58:03 +00:00
|
|
|
|
basicrep(x);
|
|
|
|
|
parrep(x,"1",p1.v);
|
|
|
|
|
parrep(x,"2",p2.v);
|
|
|
|
|
parrep(x,"3",p3.v);
|
|
|
|
|
postrep(x);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT(string x, stringpar p1, stringpar p2, stringpar p3, stringpar p4) {
|
2016-08-26 09:58:03 +00:00
|
|
|
|
basicrep(x);
|
|
|
|
|
parrep(x,"1",p1.v);
|
|
|
|
|
parrep(x,"2",p2.v);
|
|
|
|
|
parrep(x,"3",p3.v);
|
|
|
|
|
parrep(x,"4",p4.v);
|
|
|
|
|
postrep(x);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT(string x, stringpar p1, stringpar p2, stringpar p3, stringpar p4, stringpar p5) {
|
2017-03-23 10:53:57 +00:00
|
|
|
|
basicrep(x);
|
|
|
|
|
parrep(x,"1",p1.v);
|
|
|
|
|
parrep(x,"2",p2.v);
|
|
|
|
|
parrep(x,"3",p3.v);
|
|
|
|
|
parrep(x,"4",p4.v);
|
|
|
|
|
parrep(x,"5",p5.v);
|
|
|
|
|
postrep(x);
|
|
|
|
|
return x;
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLATN(string x) {
|
2017-07-22 23:33:27 +00:00
|
|
|
|
#if CAP_TRANS
|
2016-08-26 09:58:03 +00:00
|
|
|
|
if(lang()) {
|
|
|
|
|
const fullnoun *N = findInHashTable(x, all_nouns);
|
|
|
|
|
if(N) return N->n[lang()-1].nomp;
|
|
|
|
|
}
|
2017-03-23 10:53:57 +00:00
|
|
|
|
#endif
|
2016-08-26 09:58:03 +00:00
|
|
|
|
return x;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLAT1(string x) {
|
2017-07-22 23:33:27 +00:00
|
|
|
|
#if CAP_TRANS
|
2016-08-26 09:58:03 +00:00
|
|
|
|
if(lang()) {
|
|
|
|
|
const fullnoun *N = findInHashTable(x, all_nouns);
|
|
|
|
|
if(N) return N->n[lang()-1].nom;
|
|
|
|
|
}
|
2017-03-23 10:53:57 +00:00
|
|
|
|
#endif
|
2016-08-26 09:58:03 +00:00
|
|
|
|
return x;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-09 19:00:52 +00:00
|
|
|
|
EX string XLATT1(stringpar p) { return XLAT1(p.v); }
|
2016-08-26 09:58:03 +00:00
|
|
|
|
|
2019-11-17 12:47:13 +00:00
|
|
|
|
EX bool shapename_available(int id) { return id >= 3 && id < 9; }
|
|
|
|
|
|
|
|
|
|
EX string shapename(int id) {
|
|
|
|
|
if(!shapename_available(id)) return "";
|
|
|
|
|
string english[9] = {"", "", "digon", "triangle", "square", "pentagon", "hexagon", "heptagon", "octagon"};
|
|
|
|
|
return english[id];
|
|
|
|
|
}
|
|
|
|
|
|
2018-06-10 23:58:31 +00:00
|
|
|
|
}
|