Initialize Tizen 2.3
[framework/web/wrt-commons.git] / modules_mobile / localization / src / LanguageTagsProvider.cpp
1 /*
2  * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 /*
17  * @file    LanguageTagsProvider.cpp
18  * @author  Marcin Kaminski (marcin.ka@samsung.com)
19  * @version 1.0
20  */
21 #include <stddef.h>
22 #include "LanguageTagsProvider.h"
23
24 #include <dpl/log/log.h>
25 #include <vconf.h>
26 #include <algorithm>
27 #include <iostream>
28 #include <cassert>
29 #include <dpl/singleton_impl.h>
30 IMPLEMENT_SINGLETON(LanguageTagsProvider)
31
32 /* ========== public ========== */
33 const LanguageTags LanguageTagsProvider::getLanguageTags() const
34 {
35     return m_languageTagsList;
36 }
37
38 void LanguageTagsProvider::setLanguageTags(const LanguageTags& taglist)
39 {
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     {
49         m_languageTagsList.push_back(L"");
50     }
51 }
52
53 void LanguageTagsProvider::setLanguageTagsFromLocales(const char* locales)
54 {
55     LogDebug("Setting new language tags for locales " << locales);
56     this->createTagsFromLocales(locales);
57 }
58
59 void LanguageTagsProvider::resetLanguageTags()
60 {
61     this->loadSystemTags();
62 }
63
64 void LanguageTagsProvider::addWidgetDefaultLocales(
65     const DPL::String& defaultLocale)
66 {
67     if (defaultLocale.size() > 0 &&
68         std::find(m_languageTagsList.begin(), m_languageTagsList.end(),
69                   defaultLocale) == m_languageTagsList.end())
70     {
71         if (m_languageTagsList.size() < 2) {
72             m_languageTagsList.push_front(defaultLocale);
73         } else {
74             LanguageTags::iterator placeToInsert = m_languageTagsList.end();
75             --placeToInsert;
76             if (*placeToInsert != L"") {
77                 ++placeToInsert;
78             }
79             m_languageTagsList.insert(placeToInsert, defaultLocale);
80         }
81     }
82 }
83
84 DPL::String LanguageTagsProvider::BCP47LanguageTagToLocale(
85     const DPL::String& inLanguageTag)
86 {
87     DPL::String languageTag(inLanguageTag);
88     /* Replace all */
89     std::replace(languageTag.begin(), languageTag.end(), '-', '_');
90     return languageTag;
91 }
92
93 DPL::String LanguageTagsProvider::LocaleToBCP47LanguageTag(
94     const DPL::String& inLocaleString)
95 {
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(), '_', '-');
102     return localeString;
103 }
104
105 /* ========== private ========== */
106 LanguageTagsProvider::LanguageTagsProvider()
107 {
108     LogDebug("Creating LanguageTagsProvider instance");
109     this->loadSystemTags();
110 }
111
112 LanguageTagsProvider::~LanguageTagsProvider()
113 {}
114
115 void LanguageTagsProvider::loadSystemTags()
116 {
117     char* language = vconf_get_str(VCONFKEY_LANGSET);
118     if (!language) {
119         LogError("Failed to get language from vconf");
120     } else {
121         LogDebug("Language fetched from vconf: " << language);
122     }
123     createTagsFromLocales(language);
124     free(language);
125 }
126
127 void LanguageTagsProvider::createTagsFromLocales(const char* language)
128 {
129     m_languageTagsList.clear();
130     if (!language) {
131         LogDebug("Setting default language tags");
132         /* If NULL language given than set default language tags
133          * and return. */
134         m_languageTagsList.push_back(L"");
135         return;
136     }
137
138     LogDebug("Setting tags for language: " << language);
139     DPL::String langdescr =
140         LocaleToBCP47LanguageTag(DPL::FromUTF8String(language));
141
142     if (langdescr.empty()) {
143         LogError("Empty language description while correct value needed");
144     } else {
145         /* Language tags list should not be cleared before this place to
146          * avoid losing current data when new data are invalid */
147         size_t position;
148         while (true) {
149             LogDebug("Processing language description: " << langdescr);
150             m_languageTagsList.push_back(langdescr);
151
152             position = langdescr.find_last_of(L"-");
153             if (position == DPL::String::npos) {
154                 break;
155             }
156             langdescr = langdescr.substr(0, position);
157         }
158     }
159     /* Add empty tag for non-localized content */
160     m_languageTagsList.push_back(L"");
161 }