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()) {
48 m_languageTagsList.push_back(L"");
52 void LanguageTagsProvider::setLanguageTagsFromLocales(const char* locales)
54 LogDebug("Setting new language tags for locales " << locales);
55 this->createTagsFromLocales(locales);
58 void LanguageTagsProvider::resetLanguageTags()
60 this->loadSystemTags();
63 void LanguageTagsProvider::addWidgetDefaultLocales(const DPL::String& defaultLocale){
64 if (defaultLocale.size() > 0 &&
65 std::find(m_languageTagsList.begin(), m_languageTagsList.end(), defaultLocale) == m_languageTagsList.end())
67 if (m_languageTagsList.size() < 2) {
68 m_languageTagsList.push_front(defaultLocale);
70 LanguageTags::iterator placeToInsert = m_languageTagsList.end();
72 if (*placeToInsert != L"")
76 m_languageTagsList.insert(placeToInsert, defaultLocale);
81 DPL::String LanguageTagsProvider::BCP47LanguageTagToLocale(const DPL::String& inLanguageTag)
83 DPL::String languageTag(inLanguageTag);
85 std::replace(languageTag.begin(), languageTag.end(), '-', '_');
89 DPL::String LanguageTagsProvider::LocaleToBCP47LanguageTag(const DPL::String& inLocaleString)
91 /* Cut off codepage information from given string (if any exists)
92 * i.e. change en_US.UTF-8 into en_US */
93 DPL::String localeString = inLocaleString.substr(
94 0, inLocaleString.find_first_of(L"."));
95 /* Replace all '_' with '-' */
96 std::replace(localeString.begin(), localeString.end(), '_', '-');
100 /* ========== private ========== */
101 LanguageTagsProvider::LanguageTagsProvider()
103 LogDebug("Creating LanguageTagsProvider instance");
104 this->loadSystemTags();
107 LanguageTagsProvider::~LanguageTagsProvider()
111 void LanguageTagsProvider::loadSystemTags()
113 char* language = vconf_get_str(VCONFKEY_LANGSET);
115 LogError("Failed to get language from vconf");
118 LogDebug("Language fetched from vconf: " << language);
120 createTagsFromLocales(language);
124 void LanguageTagsProvider::createTagsFromLocales(const char* language)
126 m_languageTagsList.clear();
128 LogDebug("Setting default language tags");
129 /* If NULL language given than set default language tags
131 m_languageTagsList.push_back(L"");
135 LogDebug("Setting tags for language: " << language);
136 DPL::String langdescr = LocaleToBCP47LanguageTag(DPL::FromUTF8String(language));
139 if(langdescr.empty()) {
140 LogError("Empty language description while correct value needed");
143 /* Language tags list should not be cleared before this place to
144 * avoid losing current data when new data are invalid */
146 LogDebug("Processing language description: " << langdescr);
147 m_languageTagsList.push_back(langdescr);
149 position = langdescr.find_last_of(L"-");
150 if (position == DPL::String::npos) {
153 langdescr = langdescr.substr(0, position);
156 /* Add empty tag for non-localized content */
157 m_languageTagsList.push_back(L"");