diff --git a/stepmania/Translation.dat b/stepmania/Translation.dat index 4396e927a9..6a0b608c44 100644 --- a/stepmania/Translation.dat +++ b/stepmania/Translation.dat @@ -22,6 +22,7 @@ # first loaded. Delete the files in the "Cache" directory after making # changes. +[Songs] TitleFrom: Candy ArtistFrom: Luv.* TitleTo: CANDY☆ @@ -307,7 +308,7 @@ ArtistTo: 堀江由衣 ArtistFrom: (Nobuo Uematsu)|(Uematsu Nobuo) ArtistTo: 植松伸夫 -# Courses: +[Courses] TitleFrom: Kidou TitleTo: 鬼道 * diff --git a/stepmania/src/Course.cpp b/stepmania/src/Course.cpp index 1985b66bfb..942c80ac9b 100644 --- a/stepmania/src/Course.cpp +++ b/stepmania/src/Course.cpp @@ -231,7 +231,7 @@ void Course::LoadFromCRSFile( CString sPath ) else LOG->Trace( "Unexpected value named '%s'", sValueName.GetString() ); } - static TitleSubst tsub; + static TitleSubst tsub("courses"); CString ignore; tsub.Subst(m_sName, ignore, ignore, diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index 165a7d1ca5..ff07791995 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -583,7 +583,7 @@ void Song::TidyUpData() void Song::TranslateTitles() { - static TitleSubst tsub; + static TitleSubst tsub("songs"); tsub.Subst(m_sMainTitle, m_sSubTitle, m_sArtist, m_sMainTitleTranslit, m_sSubTitleTranslit, m_sArtistTranslit); diff --git a/stepmania/src/TitleSubstitution.cpp b/stepmania/src/TitleSubstitution.cpp index 7c1e86a155..e52c766faa 100644 --- a/stepmania/src/TitleSubstitution.cpp +++ b/stepmania/src/TitleSubstitution.cpp @@ -15,8 +15,7 @@ struct TitleTrans TitleTrans(CString tf, CString sf, CString af, CString tt, CString st, CString at, bool translit_): TitleFrom(tf), SubFrom(sf), ArtistFrom(af), - TitleTo(tt), SubTo(st), ArtistTo(at), - translit(translit_) { } + TitleTo(tt), SubTo(st), ArtistTo(at), translit(translit_) { } bool Matches(CString title, CString sub, CString artist); }; @@ -33,7 +32,8 @@ bool TitleTrans::Matches(CString title, CString sub, CString artist) } void TitleSubst::AddTrans(const CString &tf, const CString &sf, const CString &af, - const CString &tt, const CString &st, const CString &at, bool translit) + const CString &tt, const CString &st, const CString &at, + bool translit) { ttab.push_back(new TitleTrans(tf, sf, af, tt, st, at, translit)); } @@ -70,51 +70,50 @@ void TitleSubst::Subst(CString &title, CString &subtitle, CString &artist, } -TitleSubst::TitleSubst() +TitleSubst::TitleSubst(const CString §ion) { - Load("Translation.dat"); + Load("Translation.dat", section); } -void TitleSubst::Load(const CString &filename) +void TitleSubst::Load(const CString &filename, const CString §ion) { ifstream f; f.open(filename); if(!f.good()) return; + CString TitleFrom, ArtistFrom, SubtitleFrom, TitleTo, ArtistTo, SubtitleTo; + bool translit = true; + CString CurrentSection; + while(!f.eof()) { - CString TitleFrom, ArtistFrom, SubtitleFrom, TitleTo, ArtistTo, SubtitleTo; - bool translit = true; - while(!f.eof()) + CString line; + if(!getline(f, line)) continue; + + if(line.size() > 0 && utf8_get_char(line.c_str()) == 0xFEFF) { - CString line; - if(!getline(f, line)) continue; + /* Annoying header that Windows puts on UTF-8 plaintext + * files; remove it. */ + line.erase(0, utf8_get_char_len(line.c_str())); + } - if(line.size() > 0 && utf8_get_char(line.c_str()) == 0xFEFF) - { - /* Annoying header that Windows puts on UTF-8 plaintext - * files; remove it. */ - line.erase(0, utf8_get_char_len(line.c_str())); - } + TrimLeft(line); + TrimRight(line); - TrimLeft(line); - TrimRight(line); + if(line.size() == 0) continue; /* blank */ + if(line[0] == '#') continue; /* comment */ - if(!line.CompareNoCase("DontTransliterate")) - { - translit = false; - continue; - } - if(line.size() == 0) continue; /* blank */ - if(line[0] == '#') continue; /* comment */ - - if(line[0] == '*') break; + if(!line.CompareNoCase("DontTransliterate")) + { + translit = false; + continue; + } + unsigned pos = line.find_first_of(':'); + if(pos != string::npos) + { /* x: y */ - - unsigned pos = line.find_first_of(':'); - if(pos == string::npos) continue; CString id = line.substr(0, pos); CString txt = line.substr(pos+1); TrimLeft(txt); @@ -127,13 +126,29 @@ void TitleSubst::Load(const CString &filename) else if(!id.CompareNoCase("SubtitleTo")) SubtitleTo = txt; } - /* Surround each regex with ^(...)$, to force all comparisons to default - * to being a full-line match. (Add ".*" manually if htis isn't wanted.) */ - if(TitleFrom.size()) TitleFrom = "^(" + TitleFrom + ")$"; - if(ArtistFrom.size()) ArtistFrom = "^(" + ArtistFrom + ")$"; - if(SubtitleFrom.size()) SubtitleFrom = "^(" + SubtitleFrom + ")$"; + /* Add the translation if this is a terminator (*) or section + * marker ([xxx]). */ + if(line[0] == '*' || line[0] == '[') + { + /* Surround each regex with ^(...)$, to force all comparisons to default + * to being a full-line match. (Add ".*" manually if htis isn't wanted.) */ + if(TitleFrom.size()) TitleFrom = "^(" + TitleFrom + ")$"; + if(ArtistFrom.size()) ArtistFrom = "^(" + ArtistFrom + ")$"; + if(SubtitleFrom.size()) SubtitleFrom = "^(" + SubtitleFrom + ")$"; - AddTrans(TitleFrom, SubtitleFrom, ArtistFrom, TitleTo, SubtitleTo, ArtistTo, translit); + if(!CurrentSection.CompareNoCase(section) && + (TitleFrom.size() || SubtitleFrom.size() || ArtistFrom.size())) + AddTrans(TitleFrom, SubtitleFrom, ArtistFrom, TitleTo, SubtitleTo, ArtistTo, translit); + + /* Reset. */ + TitleFrom = ArtistFrom = SubtitleFrom = TitleTo = ArtistTo = SubtitleTo = ""; + translit = true; + } + + if(line[0] == '[' && line[line.size()-1] == ']') + { + CurrentSection = line.substr(1, line.size()-2); + } } } diff --git a/stepmania/src/TitleSubstitution.h b/stepmania/src/TitleSubstitution.h index 0dff77a9c5..ef5f3c740f 100644 --- a/stepmania/src/TitleSubstitution.h +++ b/stepmania/src/TitleSubstitution.h @@ -10,10 +10,10 @@ class TitleSubst void AddTrans(const CString &tf, const CString &sf, const CString &af, const CString &tt, const CString &st, const CString &at, bool translit); public: - TitleSubst(); + TitleSubst(const CString §ion); ~TitleSubst(); - void Load(const CString &filename); + void Load(const CString &filename, const CString §ion); void Subst(CString &title, CString &sub, CString &artist, CString &ttitle, CString &tsub, CString &tartist);