- Extended localization to all DSO and star names.

ver1_6_1
Vincent Giangiulio 2008-10-13 21:10:09 +00:00
parent 8e42c67af8
commit d7b12d4110
6 changed files with 51 additions and 25 deletions

View File

@ -128,7 +128,7 @@ vector<string> DSODatabase::getCompletion(const string& name) const
}
string DSODatabase::getDSOName(const DeepSkyObject* const & dso) const
string DSODatabase::getDSOName(const DeepSkyObject* const & dso, bool i18n) const
{
uint32 catalogNumber = dso->getCatalogNumber();
@ -137,7 +137,10 @@ string DSODatabase::getDSOName(const DeepSkyObject* const & dso) const
DSONameDatabase::NumberIndex::const_iterator iter = namesDB->getFirstNameIter(catalogNumber);
if (iter != namesDB->getFinalNameIter() && iter->first == catalogNumber)
{
return iter->second;
if (i18n && iter->second != _(iter->second.c_str()))
return _(iter->second.c_str());
else
return iter->second;
}
}
@ -341,9 +344,10 @@ bool DSODatabase::load(istream& in, const string& resourcePath)
length = next - startPos;
++next;
}
namesDB->add(objCatalogNumber, objName.substr(startPos, length));
if (objName.substr(startPos, length) == "Milky Way" && string("Milky Way") != _("Milky Way"))
namesDB->add(objCatalogNumber, _("Milky Way"));
string DSOName = objName.substr(startPos, length);
namesDB->add(objCatalogNumber, DSOName);
if (DSOName != _(DSOName.c_str()))
namesDB->add(objCatalogNumber, _(DSOName.c_str()));
startPos = next;
}
}

View File

@ -52,7 +52,7 @@ class DSODatabase
const Point3d& obsPosition,
float radius) const;
std::string getDSOName (const DeepSkyObject* const &) const;
std::string getDSOName (const DeepSkyObject* const &, bool i18n = false) const;
std::string getDSONameList(const DeepSkyObject* const &, const unsigned int maxNames = MAX_DSO_NAMES) const;
DSONameDatabase* getNameDatabase() const;

View File

@ -9242,7 +9242,7 @@ void StarRenderer::process(const Star& star, float distance, float appMag)
if (dot(starDir, viewNormal) > cosFOV)
{
char nameBuffer[Renderer::MaxLabelLength];
starDB->getStarName(star, nameBuffer, sizeof(nameBuffer));
starDB->getStarName(star, nameBuffer, sizeof(nameBuffer), true);
float distr = 3.5f * (labelThresholdMag - appMag)/labelThresholdMag;
if (distr > 1.0f)
distr = 1.0f;
@ -9499,7 +9499,7 @@ void PointStarRenderer::process(const Star& star, float distance, float appMag)
if (dot(starDir, viewNormal) > cosFOV)
{
char nameBuffer[Renderer::MaxLabelLength];
starDB->getStarName(star, nameBuffer, sizeof(nameBuffer));
starDB->getStarName(star, nameBuffer, sizeof(nameBuffer), true);
float distr = 3.5f * (labelThresholdMag - appMag)/labelThresholdMag;
if (distr > 1.0f)
distr = 1.0f;
@ -10005,7 +10005,7 @@ void DSORenderer::process(DeepSkyObject* const & dso,
distr = 1.0f;
renderer->addBackgroundAnnotation(rep,
dsoDB->getDSOName(dso),
dsoDB->getDSOName(dso, true),
Color(labelColor, distr * labelColor.alpha()),
Point3f(relPos.x, relPos.y, relPos.z),
Renderer::AlignLeft, Renderer::VerticalAlignCenter, symbolSize);

View File

@ -377,7 +377,7 @@ static void catalogNumberToString(uint32 catalogNumber, char* buf, unsigned int
// mind that calling this method could possibly incur the overhead
// of a memory allocation (though no explcit deallocation is
// required as it's all wrapped in the string class.)
string StarDatabase::getStarName(const Star& star) const
string StarDatabase::getStarName(const Star& star, bool i18n) const
{
uint32 catalogNumber = star.getCatalogNumber();
@ -386,7 +386,10 @@ string StarDatabase::getStarName(const Star& star) const
StarNameDatabase::NumberIndex::const_iterator iter = namesDB->getFirstNameIter(catalogNumber);
if (iter != namesDB->getFinalNameIter() && iter->first == catalogNumber)
{
return iter->second;
if (i18n && iter->second != _(iter->second.c_str()))
return _(iter->second.c_str());
else
return iter->second;
}
}
@ -405,7 +408,7 @@ string StarDatabase::getStarName(const Star& star) const
// A less convenient version of getStarName that writes to a char
// array instead of a string. The advantage is that no memory allocation
// will every occur.
void StarDatabase::getStarName(const Star& star, char* nameBuffer, unsigned int bufferSize) const
void StarDatabase::getStarName(const Star& star, char* nameBuffer, unsigned int bufferSize, bool i18n) const
{
assert(bufferSize != 0);
@ -416,7 +419,11 @@ void StarDatabase::getStarName(const Star& star, char* nameBuffer, unsigned int
StarNameDatabase::NumberIndex::const_iterator iter = namesDB->getFirstNameIter(catalogNumber);
if (iter != namesDB->getFinalNameIter() && iter->first == catalogNumber)
{
strncpy(nameBuffer, iter->second.c_str(), bufferSize);
if (i18n && iter->second != _(iter->second.c_str()))
strncpy(nameBuffer, _(iter->second.c_str()), bufferSize);
else
strncpy(nameBuffer, iter->second.c_str(), bufferSize);
nameBuffer[bufferSize - 1] = '\0';
return;
}
@ -1311,9 +1318,10 @@ bool StarDatabase::load(istream& in, const string& resourcePath)
length = next - startPos;
++next;
}
if (catalogNumber == 0 && objName.substr(startPos, length) == "Sun" && string("Sun") != _("Sun"))
namesDB->add(0, _("Sun"));
namesDB->add(catalogNumber, objName.substr(startPos, length));
string starName = objName.substr(startPos, length);
namesDB->add(catalogNumber, starName);
if (starName != _(starName.c_str()))
namesDB->add(catalogNumber, _(starName.c_str()));
startPos = next;
}
}

View File

@ -126,8 +126,8 @@ class StarDatabase
const Point3f& obsPosition,
float radius) const;
std::string getStarName (const Star&) const;
void getStarName(const Star& star, char* nameBuffer, unsigned int bufferSize) const;
std::string getStarName (const Star&, bool i18n = false) const;
void getStarName(const Star& star, char* nameBuffer, unsigned int bufferSize, bool i18n = false) const;
std::string getStarNameList(const Star&, const unsigned int maxNames = MAX_STAR_NAMES) const;
StarNameDatabase* getNameDatabase() const;

View File

@ -3670,6 +3670,21 @@ void CelestiaCore::renderOverlay()
selectionNames = sim->getUniverse()->getStarCatalog()->getStarNameList(*sel.star());
}
// Skip displaying the English name if a localized version is present.
string starName = sim->getUniverse()->getStarCatalog()->getStarName(*sel.star());
string locStarName = sim->getUniverse()->getStarCatalog()->getStarName(*sel.star(), true);
if (selectionNames.find("Sun") != string::npos && "Sun" != _("Sun"))
{
string::size_type startPos = selectionNames.find("Sun");
string::size_type endPos = selectionNames.find(_("Sun"));
selectionNames = selectionNames.erase(startPos, endPos - startPos);
}
else if (selectionNames.find(starName) != string::npos && starName != locStarName)
{
string::size_type startPos = selectionNames.find(locStarName);
selectionNames = selectionNames.substr(startPos);
}
overlay->setFont(titleFont);
*overlay << selectionNames;
overlay->setFont(font);
@ -3690,14 +3705,13 @@ void CelestiaCore::renderOverlay()
selectionNames = sim->getUniverse()->getDSOCatalog()->getDSONameList(sel.deepsky());
}
// Skip displaying 'Milky Way' if there's a localized version of this name.
// 'Milky Way' is the only DSO name which is localized so far.
const char* locDSO = "Milky Way";
if (selectionNames.find(locDSO) != string::npos && string(locDSO) != _(locDSO))
// Skip displaying the English name if a localized version is present.
string DSOName = sim->getUniverse()->getDSOCatalog()->getDSOName(sel.deepsky());
string locDSOName = sim->getUniverse()->getDSOCatalog()->getDSOName(sel.deepsky(), true);
if (selectionNames.find(DSOName) != string::npos && DSOName != locDSOName)
{
string::size_type startPos = selectionNames.find(locDSO);
string::size_type endPos = selectionNames.find(_(locDSO));
selectionNames = selectionNames.erase(startPos, endPos - startPos);
string::size_type startPos = selectionNames.find(locDSOName);
selectionNames = selectionNames.substr(startPos);
}
overlay->setFont(titleFont);