1*993b0882SAndroid Build Coastguard Worker /* 2*993b0882SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*993b0882SAndroid Build Coastguard Worker * 4*993b0882SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*993b0882SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*993b0882SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*993b0882SAndroid Build Coastguard Worker * 8*993b0882SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*993b0882SAndroid Build Coastguard Worker * 10*993b0882SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*993b0882SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*993b0882SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*993b0882SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*993b0882SAndroid Build Coastguard Worker * limitations under the License. 15*993b0882SAndroid Build Coastguard Worker */ 16*993b0882SAndroid Build Coastguard Worker 17*993b0882SAndroid Build Coastguard Worker #ifndef LIBTEXTCLASSIFIER_UTILS_I18N_LOCALE_H_ 18*993b0882SAndroid Build Coastguard Worker #define LIBTEXTCLASSIFIER_UTILS_I18N_LOCALE_H_ 19*993b0882SAndroid Build Coastguard Worker 20*993b0882SAndroid Build Coastguard Worker #include <string> 21*993b0882SAndroid Build Coastguard Worker #include <vector> 22*993b0882SAndroid Build Coastguard Worker 23*993b0882SAndroid Build Coastguard Worker #include "utils/base/integral_types.h" 24*993b0882SAndroid Build Coastguard Worker #include "utils/base/logging.h" 25*993b0882SAndroid Build Coastguard Worker #include "utils/i18n/language-tag_generated.h" 26*993b0882SAndroid Build Coastguard Worker #include "utils/strings/stringpiece.h" 27*993b0882SAndroid Build Coastguard Worker 28*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 { 29*993b0882SAndroid Build Coastguard Worker 30*993b0882SAndroid Build Coastguard Worker class Locale { 31*993b0882SAndroid Build Coastguard Worker public: 32*993b0882SAndroid Build Coastguard Worker // Constructs the object from a valid BCP47 tag. If the tag is invalid, 33*993b0882SAndroid Build Coastguard Worker // an object is created that gives false when IsInvalid() is called. 34*993b0882SAndroid Build Coastguard Worker static Locale FromBCP47(const std::string& locale_tag); 35*993b0882SAndroid Build Coastguard Worker 36*993b0882SAndroid Build Coastguard Worker // Constructs the object from a flatbuffer language tag. 37*993b0882SAndroid Build Coastguard Worker static Locale FromLanguageTag(const LanguageTag* language_tag); 38*993b0882SAndroid Build Coastguard Worker 39*993b0882SAndroid Build Coastguard Worker // Creates a prototypical invalid locale object. Invalid()40*993b0882SAndroid Build Coastguard Worker static Locale Invalid() { 41*993b0882SAndroid Build Coastguard Worker Locale locale(/*language=*/"", /*script=*/"", /*region=*/""); 42*993b0882SAndroid Build Coastguard Worker locale.is_valid_ = false; 43*993b0882SAndroid Build Coastguard Worker return locale; 44*993b0882SAndroid Build Coastguard Worker } 45*993b0882SAndroid Build Coastguard Worker Language()46*993b0882SAndroid Build Coastguard Worker std::string Language() const { return language_; } 47*993b0882SAndroid Build Coastguard Worker Script()48*993b0882SAndroid Build Coastguard Worker std::string Script() const { return script_; } 49*993b0882SAndroid Build Coastguard Worker Region()50*993b0882SAndroid Build Coastguard Worker std::string Region() const { return region_; } 51*993b0882SAndroid Build Coastguard Worker IsValid()52*993b0882SAndroid Build Coastguard Worker bool IsValid() const { return is_valid_; } 53*993b0882SAndroid Build Coastguard Worker bool IsUnknown() const; 54*993b0882SAndroid Build Coastguard Worker 55*993b0882SAndroid Build Coastguard Worker // Returns whether any of the given locales is supported by any of the 56*993b0882SAndroid Build Coastguard Worker // supported locales. Returns default value if the given 'locales' list, or 57*993b0882SAndroid Build Coastguard Worker // 'supported_locales' list is empty or an unknown locale is found. 58*993b0882SAndroid Build Coastguard Worker // Locale::FromBCP47("*") means any locale. 59*993b0882SAndroid Build Coastguard Worker static bool IsAnyLocaleSupported(const std::vector<Locale>& locales, 60*993b0882SAndroid Build Coastguard Worker const std::vector<Locale>& supported_locales, 61*993b0882SAndroid Build Coastguard Worker bool default_value); 62*993b0882SAndroid Build Coastguard Worker 63*993b0882SAndroid Build Coastguard Worker bool operator==(const Locale& locale) const; 64*993b0882SAndroid Build Coastguard Worker bool operator!=(const Locale& locale) const; 65*993b0882SAndroid Build Coastguard Worker bool operator<(const Locale& locale) const; 66*993b0882SAndroid Build Coastguard Worker 67*993b0882SAndroid Build Coastguard Worker private: Locale(const std::string & language,const std::string & script,const std::string & region)68*993b0882SAndroid Build Coastguard Worker Locale(const std::string& language, const std::string& script, 69*993b0882SAndroid Build Coastguard Worker const std::string& region) 70*993b0882SAndroid Build Coastguard Worker : language_(language), 71*993b0882SAndroid Build Coastguard Worker script_(script), 72*993b0882SAndroid Build Coastguard Worker region_(region), 73*993b0882SAndroid Build Coastguard Worker is_valid_(true) {} 74*993b0882SAndroid Build Coastguard Worker 75*993b0882SAndroid Build Coastguard Worker static bool IsLocaleSupported(const Locale& locale, 76*993b0882SAndroid Build Coastguard Worker const std::vector<Locale>& supported_locales, 77*993b0882SAndroid Build Coastguard Worker bool default_value); 78*993b0882SAndroid Build Coastguard Worker 79*993b0882SAndroid Build Coastguard Worker std::string language_; 80*993b0882SAndroid Build Coastguard Worker std::string script_; 81*993b0882SAndroid Build Coastguard Worker std::string region_; 82*993b0882SAndroid Build Coastguard Worker bool is_valid_; 83*993b0882SAndroid Build Coastguard Worker }; 84*993b0882SAndroid Build Coastguard Worker 85*993b0882SAndroid Build Coastguard Worker // Pretty-printing function for Locale. 86*993b0882SAndroid Build Coastguard Worker logging::LoggingStringStream& operator<<(logging::LoggingStringStream& stream, 87*993b0882SAndroid Build Coastguard Worker const Locale& locale); 88*993b0882SAndroid Build Coastguard Worker 89*993b0882SAndroid Build Coastguard Worker // Parses a comma-separated list of BCP47 tags. 90*993b0882SAndroid Build Coastguard Worker bool ParseLocales(StringPiece locales_list, std::vector<Locale>* locales); 91*993b0882SAndroid Build Coastguard Worker 92*993b0882SAndroid Build Coastguard Worker } // namespace libtextclassifier3 93*993b0882SAndroid Build Coastguard Worker 94*993b0882SAndroid Build Coastguard Worker #endif // LIBTEXTCLASSIFIER_UTILS_I18N_LOCALE_H_ 95