2 * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * @file LanguageTagsProvider.cpp
18 * @author Marcin Kaminski (marcin.ka@samsung.com)
22 #include "LanguageTagsProvider.h"
31 #include <dpl/log/log.h>
32 #include <dpl/singleton_impl.h>
35 IMPLEMENT_SINGLETON(LanguageTagsProvider)
37 /* ========== public ========== */
38 const LanguageTags LanguageTagsProvider::getLanguageTags() const
40 return m_languageTagsList;
43 void LanguageTagsProvider::setLanguageTags(const LanguageTags& taglist)
45 m_languageTagsList = taglist;
46 /* If given list does not contain default value (empty string)
47 * than append it to the list.
48 * In case of empty list given as parameter only default value
49 * will exist on m_languageTagsList. */
50 DPL::String tofind = L"";
51 if (std::find(m_languageTagsList.begin(), m_languageTagsList.end(),
52 tofind) == m_languageTagsList.end())
54 m_languageTagsList.push_back(L"");
58 void LanguageTagsProvider::setLanguageTagsFromLocales(const char* locales)
60 LogDebug("Setting new language tags for locales " << locales);
61 this->createTagsFromLocales(locales);
64 void LanguageTagsProvider::resetLanguageTags()
66 this->loadSystemTags();
69 void LanguageTagsProvider::addWidgetDefaultLocales(
70 const DPL::String& defaultLocale)
72 if (defaultLocale.size() > 0 &&
73 std::find(m_languageTagsList.begin(), m_languageTagsList.end(),
74 defaultLocale) == m_languageTagsList.end())
76 if (m_languageTagsList.size() < 2) {
77 m_languageTagsList.push_front(defaultLocale);
79 LanguageTags::iterator placeToInsert = m_languageTagsList.end();
81 if (*placeToInsert != L"") {
84 m_languageTagsList.insert(placeToInsert, defaultLocale);
89 DPL::String LanguageTagsProvider::BCP47LanguageTagToLocale(
90 const DPL::String& inLanguageTag)
92 DPL::String languageTag(inLanguageTag);
94 std::replace(languageTag.begin(), languageTag.end(), '-', '_');
98 DPL::String LanguageTagsProvider::LocaleToBCP47LanguageTag(
99 const DPL::String& inLocaleString)
101 /* Cut off codepage information from given string (if any exists)
102 * i.e. change en_US.UTF-8 into en_US */
103 DPL::String localeString = inLocaleString.substr(
104 0, inLocaleString.find_first_of(L"."));
105 /* Replace all '_' with '-' */
106 std::replace(localeString.begin(), localeString.end(), '_', '-');
110 /* ========== private ========== */
111 LanguageTagsProvider::LanguageTagsProvider()
113 LogDebug("Creating LanguageTagsProvider instance");
114 this->loadSystemTags();
117 LanguageTagsProvider::~LanguageTagsProvider()
120 void LanguageTagsProvider::loadSystemTags()
122 char* language = vconf_get_str(VCONFKEY_LANGSET);
124 LogError("Failed to get language from vconf");
126 LogDebug("Language fetched from vconf: " << language);
128 createTagsFromLocales(language);
132 void LanguageTagsProvider::createTagsFromLocales(const char* language)
134 m_languageTagsList.clear();
136 LogDebug("Setting default language tags");
137 /* If NULL language given than set default language tags
139 m_languageTagsList.push_back(L"");
143 LogDebug("Setting tags for language: " << language);
144 DPL::String langdescr =
145 LocaleToBCP47LanguageTag(DPL::FromUTF8String(language));
147 if (langdescr.empty()) {
148 LogError("Empty language description while correct value needed");
150 /* Language tags list should not be cleared before this place to
151 * avoid losing current data when new data are invalid */
154 LogDebug("Processing language description: " << langdescr);
155 m_languageTagsList.push_back(langdescr);
157 // compatibility with lower language Tag by SDK
158 std::string langtag = DPL::ToUTF8String(langdescr);
159 std::transform(langtag.begin(), langtag.end(), langtag.begin(), ::tolower);
160 if (langtag != DPL::ToUTF8String(langdescr)) {
161 m_languageTagsList.push_back(DPL::FromUTF8String(langtag));
164 position = langdescr.find_last_of(L"-");
165 if (position == DPL::String::npos) {
168 langdescr = langdescr.substr(0, position);
171 /* Add empty tag for non-localized content */
172 m_languageTagsList.push_back(L"");