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"
24 #include <dpl/log/log.h>
29 #include <dpl/singleton_impl.h>
30 IMPLEMENT_SINGLETON(LanguageTagsProvider)
32 /* ========== public ========== */
33 const LanguageTags LanguageTagsProvider::getLanguageTags() const
35 return m_languageTagsList;
38 void LanguageTagsProvider::setLanguageTags(const LanguageTags& taglist)
40 m_languageTagsList = taglist;
41 /* If given list does not contain default value (empty string)
42 * than append it to the list.
43 * In case of empty list given as parameter only default value
44 * will exist on m_languageTagsList. */
45 DPL::String tofind = L"";
46 if (std::find(m_languageTagsList.begin(), m_languageTagsList.end(),
47 tofind) == m_languageTagsList.end())
49 m_languageTagsList.push_back(L"");
53 void LanguageTagsProvider::setLanguageTagsFromLocales(const char* locales)
55 LogDebug("Setting new language tags for locales " << locales);
56 this->createTagsFromLocales(locales);
59 void LanguageTagsProvider::resetLanguageTags()
61 this->loadSystemTags();
64 void LanguageTagsProvider::addWidgetDefaultLocales(
65 const DPL::String& defaultLocale)
67 if (defaultLocale.size() > 0 &&
68 std::find(m_languageTagsList.begin(), m_languageTagsList.end(),
69 defaultLocale) == m_languageTagsList.end())
71 if (m_languageTagsList.size() < 2) {
72 m_languageTagsList.push_front(defaultLocale);
74 LanguageTags::iterator placeToInsert = m_languageTagsList.end();
76 if (*placeToInsert != L"") {
79 m_languageTagsList.insert(placeToInsert, defaultLocale);
84 DPL::String LanguageTagsProvider::BCP47LanguageTagToLocale(
85 const DPL::String& inLanguageTag)
87 DPL::String languageTag(inLanguageTag);
89 std::replace(languageTag.begin(), languageTag.end(), '-', '_');
93 DPL::String LanguageTagsProvider::LocaleToBCP47LanguageTag(
94 const DPL::String& inLocaleString)
96 /* Cut off codepage information from given string (if any exists)
97 * i.e. change en_US.UTF-8 into en_US */
98 DPL::String localeString = inLocaleString.substr(
99 0, inLocaleString.find_first_of(L"."));
100 /* Replace all '_' with '-' */
101 std::replace(localeString.begin(), localeString.end(), '_', '-');
105 /* ========== private ========== */
106 LanguageTagsProvider::LanguageTagsProvider()
108 LogDebug("Creating LanguageTagsProvider instance");
109 this->loadSystemTags();
112 LanguageTagsProvider::~LanguageTagsProvider()
115 void LanguageTagsProvider::loadSystemTags()
117 char* language = vconf_get_str(VCONFKEY_LANGSET);
119 LogError("Failed to get language from vconf");
121 LogDebug("Language fetched from vconf: " << language);
123 createTagsFromLocales(language);
127 void LanguageTagsProvider::createTagsFromLocales(const char* language)
129 m_languageTagsList.clear();
131 LogDebug("Setting default language tags");
132 /* If NULL language given than set default language tags
134 m_languageTagsList.push_back(L"");
138 LogDebug("Setting tags for language: " << language);
139 DPL::String langdescr =
140 LocaleToBCP47LanguageTag(DPL::FromUTF8String(language));
142 if (langdescr.empty()) {
143 LogError("Empty language description while correct value needed");
145 /* Language tags list should not be cleared before this place to
146 * avoid losing current data when new data are invalid */
149 LogDebug("Processing language description: " << langdescr);
150 m_languageTagsList.push_back(langdescr);
152 position = langdescr.find_last_of(L"-");
153 if (position == DPL::String::npos) {
156 langdescr = langdescr.substr(0, position);
159 /* Add empty tag for non-localized content */
160 m_languageTagsList.push_back(L"");