summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-08-07 15:27:51 +0100
committerCaolán McNamara <caolanm@redhat.com>2012-09-28 08:48:34 +0100
commit894c951e92f5f44b3de34664e11c57b8f0e62d4b (patch)
treeb05a51b78933f23c19ea934abd84e1e3294a7331 /vcl
parente190f0ab0dd466b6faa9c82597c628838f6af0f1 (diff)
handle translations
Change-Id: Idb88fe3a32349f6a3cf343db884e9cc38d699660
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/vcl/builder.hxx10
-rw-r--r--vcl/source/window/builder.cxx163
2 files changed, 154 insertions, 19 deletions
diff --git a/vcl/inc/vcl/builder.hxx b/vcl/inc/vcl/builder.hxx
index 7a21a99cf6a7..c9d0ee063279 100644
--- a/vcl/inc/vcl/builder.hxx
+++ b/vcl/inc/vcl/builder.hxx
@@ -113,6 +113,12 @@ private:
Adjustment *get_adjustment_by_name(rtl::OString sID);
static void mungeadjustment(MetricField &rTarget, Adjustment &rAdjustment);
+ typedef std::map<rtl::OString, rtl::OString> WidgetTranslations;
+ typedef std::map<rtl::OString, WidgetTranslations> Translations;
+ Translations m_aTranslations;
+
+ rtl::OString getTranslation(const rtl::OString &rId, const rtl::OString &rProperty) const;
+
rtl::OString m_sID;
Window *m_pParent;
public:
@@ -133,11 +139,13 @@ private:
bool extractModel(const rtl::OString &id, stringmap &rVec);
bool extractAdjustment(const rtl::OString &id, stringmap &rVec);
+ void handleTranslations(xmlreader::XmlReader &reader);
+
void handleChild(Window *pParent, xmlreader::XmlReader &reader);
Window* handleObject(Window *pParent, xmlreader::XmlReader &reader);
void handlePacking(Window *pCurrent, xmlreader::XmlReader &reader);
void applyPackingProperty(Window *pCurrent, xmlreader::XmlReader &reader);
- void collectProperty(xmlreader::XmlReader &reader, stringmap &rVec);
+ void collectProperty(xmlreader::XmlReader &reader, const rtl::OString &rID, stringmap &rVec);
void handleListStore(xmlreader::XmlReader &reader, const rtl::OString &rID);
void handleAdjustment(const rtl::OString &rID, stringmap &rProperties);
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 5073ac011651..465a80685180 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -34,6 +34,7 @@
#include <vcl/fixed.hxx>
#include <vcl/layout.hxx>
#include <vcl/lstbox.hxx>
+#include <vcl/svapp.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/tabpage.hxx>
#include <window.h>
@@ -42,6 +43,33 @@ VclBuilder::VclBuilder(Window *pParent, rtl::OUString sUri, rtl::OString sID)
: m_sID(sID)
, m_pParent(pParent)
{
+ ::com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale();
+ for (int i = aLocale.Country.isEmpty() ? 1 : 0; i < 2; ++i)
+ {
+ rtl::OUStringBuffer aTransBuf;
+ sal_Int32 nLastSlash = sUri.lastIndexOf('/');
+ aTransBuf.append(sUri.copy(0, nLastSlash)).append("/res/").append(aLocale.Language);
+ switch (i)
+ {
+ case 0:
+ aTransBuf.append('-').append(aLocale.Country);
+ break;
+ default:
+ break;
+ }
+ aTransBuf.append(sUri.copy(nLastSlash));
+
+ rtl::OUString sTransUri = aTransBuf.makeStringAndClear();
+ try
+ {
+ xmlreader::XmlReader reader(sTransUri);
+ handleTranslations(reader);
+ }
+ catch (const ::com::sun::star::uno::Exception &)
+ {
+ }
+ }
+
xmlreader::XmlReader reader(sUri);
handleChild(pParent, reader);
@@ -92,6 +120,9 @@ VclBuilder::VclBuilder(Window *pParent, rtl::OUString sUri, rtl::OString sID)
std::vector<SpinButtonAdjustmentMap>().swap(m_aAdjustmentMaps);
std::vector<AdjustmentAndId>().swap(m_aAdjustments);
+ //drop maps now
+ Translations().swap(m_aTranslations);
+
//auto-show (really necessary ?, maybe drop it when complete)
for (std::vector<WinAndId>::iterator aI = m_aChildren.begin(),
aEnd = m_aChildren.end(); aI != aEnd; ++aI)
@@ -114,6 +145,53 @@ VclBuilder::~VclBuilder()
}
}
+void VclBuilder::handleTranslations(xmlreader::XmlReader &reader)
+{
+ xmlreader::Span name;
+ int nsId;
+ rtl::OString sType;
+
+ rtl::OString sID, sProperty;
+
+ while(1)
+ {
+ xmlreader::XmlReader::Result res = reader.nextItem(
+ xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
+
+ if (res == xmlreader::XmlReader::RESULT_BEGIN)
+ {
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("e")))
+ {
+ while (reader.nextAttribute(&nsId, &name))
+ {
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("g")))
+ {
+ name = reader.getAttributeValue(false);
+ sID = rtl::OString(name.begin, name.length);
+ }
+ else if (name.equals(RTL_CONSTASCII_STRINGPARAM("i")))
+ {
+ name = reader.getAttributeValue(false);
+ sProperty = rtl::OString(name.begin, name.length);
+ }
+ }
+ }
+ }
+
+ if (res == xmlreader::XmlReader::RESULT_TEXT && !sID.isEmpty())
+ {
+ rtl::OString sTranslation(name.begin, name.length);
+ m_aTranslations[sID][sProperty] = sTranslation;
+ }
+
+ if (res == xmlreader::XmlReader::RESULT_END)
+ sID = rtl::OString();
+
+ if (res == xmlreader::XmlReader::RESULT_DONE)
+ break;
+ }
+}
+
namespace
{
bool extractOrientation(VclBuilder::stringmap &rMap)
@@ -407,9 +485,7 @@ void VclBuilder::handleTabChild(Window *pParent, xmlreader::XmlReader &reader)
if (res == xmlreader::XmlReader::RESULT_BEGIN)
{
++nLevel;
- if (name.equals(RTL_CONSTASCII_STRINGPARAM("property")))
- collectProperty(reader, aProperties);
- else if (name.equals(RTL_CONSTASCII_STRINGPARAM("object")))
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("object")))
{
while (reader.nextAttribute(&nsId, &name))
{
@@ -420,6 +496,8 @@ void VclBuilder::handleTabChild(Window *pParent, xmlreader::XmlReader &reader)
}
}
}
+ else if (name.equals(RTL_CONSTASCII_STRINGPARAM("property")))
+ collectProperty(reader, sID, aProperties);
}
if (res == xmlreader::XmlReader::RESULT_END)
@@ -588,9 +666,29 @@ void VclBuilder::handleListStore(xmlreader::XmlReader &reader, const rtl::OStrin
++nLevel;
if (name.equals(RTL_CONSTASCII_STRINGPARAM("col")))
{
+ bool bTranslated = false;
+ rtl::OString sProperty, sValue;
+
+ while (reader.nextAttribute(&nsId, &name))
+ {
+ if (name.equals(RTL_CONSTASCII_STRINGPARAM("id")))
+ {
+ name = reader.getAttributeValue(false);
+ sProperty = rtl::OString(name.begin, name.length);
+ }
+ else if (name.equals(RTL_CONSTASCII_STRINGPARAM("translatable")) && reader.getAttributeValue(false).equals(RTL_CONSTASCII_STRINGPARAM("yes")))
+ {
+ sValue = getTranslation(rID, sProperty);
+ bTranslated = !sValue.isEmpty();
+ }
+ }
+
reader.nextItem(
xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
- rtl::OString sValue(name.begin, name.length);
+
+ if (!bTranslated)
+ sValue = rtl::OString(name.begin, name.length);
+
m_aModels.back().m_pModel->m_aEntries.push_back(sValue);
}
}
@@ -659,7 +757,7 @@ Window* VclBuilder::handleObject(Window *pParent, xmlreader::XmlReader &reader)
{
++nLevel;
if (name.equals(RTL_CONSTASCII_STRINGPARAM("property")))
- collectProperty(reader, aProperties);
+ collectProperty(reader, sID, aProperties);
}
}
@@ -766,29 +864,58 @@ void VclBuilder::applyPackingProperty(Window *pCurrent,
}
}
-void VclBuilder::collectProperty(xmlreader::XmlReader &reader, stringmap &rMap)
+rtl::OString VclBuilder::getTranslation(const rtl::OString &rID, const rtl::OString &rProperty) const
+{
+ Translations::const_iterator aWidgetFind = m_aTranslations.find(rID);
+ if (aWidgetFind != m_aTranslations.end())
+ {
+ const WidgetTranslations &rWidgetTranslations = aWidgetFind->second;
+ WidgetTranslations::const_iterator aPropertyFind = rWidgetTranslations.find(rProperty);
+ if (aPropertyFind != rWidgetTranslations.end())
+ return aPropertyFind->second;
+ }
+ return rtl::OString();
+}
+
+void VclBuilder::collectProperty(xmlreader::XmlReader &reader, const rtl::OString &rID, stringmap &rMap)
{
xmlreader::Span name;
int nsId;
+ rtl::OString sProperty;
+ rtl::OString sValue;
+
+ bool bTranslated = false;
+
while (reader.nextAttribute(&nsId, &name))
{
if (name.equals(RTL_CONSTASCII_STRINGPARAM("name")))
{
name = reader.getAttributeValue(false);
- rtl::OString sProperty(name.begin, name.length);
- sProperty = sProperty.replace('_', '-');
- reader.nextItem(
- xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
- rtl::OString sValue(name.begin, name.length);
- //replace '_' with '-' except for property values that
- //refer to widget ids themselves. TO-DO, drop conversion
- //and just use foo_bar properties throughout
- if (sProperty.equalsL(RTL_CONSTASCII_STRINGPARAM("group")))
- rMap[sProperty] = sValue;
- else
- rMap[sProperty] = sValue.replace('_', '-');
+ sProperty = rtl::OString(name.begin, name.length);
}
+ else if (name.equals(RTL_CONSTASCII_STRINGPARAM("translatable")) && reader.getAttributeValue(false).equals(RTL_CONSTASCII_STRINGPARAM("yes")))
+ {
+ sValue = getTranslation(rID, sProperty);
+ bTranslated = !sValue.isEmpty();
+ }
+
+ }
+
+ reader.nextItem(xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId);
+ if (!bTranslated)
+ sValue = rtl::OString(name.begin, name.length);
+
+ if (!sProperty.isEmpty())
+ {
+ sProperty = sProperty.replace('_', '-');
+ //replace '_' with '-' except for property values that
+ //refer to widget ids themselves. TO-DO, drop conversion
+ //and just use foo_bar properties throughout
+ if (sProperty.equalsL(RTL_CONSTASCII_STRINGPARAM("group")))
+ rMap[sProperty] = sValue;
+ else
+ rMap[sProperty] = sValue.replace('_', '-');
}
}