15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2009 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LANGUAGES_PUBLIC_LANGUAGES_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LANGUAGES_PUBLIC_LANGUAGES_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This interface defines the Language enum and functions that depend
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// only on Language values.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A hash-function for Language, hash<Language>, is defined in
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// i18n/languages/public/languages-hash.h
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SWIG
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Language enum defined in languages.proto
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also description on how to add languages.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "languages/proto/languages.pb.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We need this for compatibility:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The Language enum in the default namespace.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMMENTED OUT TO REDUCE DEPENDENCIES ON GOOGLE3 CODE
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//using namespace i18n::languages;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// And we must have a swig-compatible enum.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This one is a simple cleaned up version of language.proto, making the enum
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatible with C++.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "i18n/languages/internal/languages_proto_wrapper.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMMENTED OUT TO REDUCE DEPENDENCIES ON GOOGLE3 CODE
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//#include "util/utf8/proptables/script_enum.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kNumLanguages = NUM_LANGUAGES;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the default language (ENGLISH).
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Language default_language();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *******************************************
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Language predicates
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsValidLanguage()
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IS_LANGUAGE_UNKNOWN()
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsCJKLanguage()
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsChineseLanguage()
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsNorwegianLanguage()
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsPortugueseLanguage()
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsRightToLeftLanguage()
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsMaybeRightToLeftLanguage()
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsSameLanguage()
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   IsScriptRequiringLongerSnippets()
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *******************************************
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsValidLanguage
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===============
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Function to check if the input is within range of the Language enum. If
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsValidLanguage(lang) returns true, it is safe to call
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static_cast<Language>(lang).
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool IsValidLanguage(int lang) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ((lang >= 0) && (lang < kNumLanguages));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return true if the language is "unknown". (This function was
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// previously a macro, hence the spelling in all caps.)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool IS_LANGUAGE_UNKNOWN(Language lang) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return lang == TG_UNKNOWN_LANGUAGE || lang == UNKNOWN_LANGUAGE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsCJKLanguage
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -------------
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the language is either Chinese
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (simplified or traditional), Japanese, or Korean.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsCJKLanguage(Language lang);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsChineseLanguage
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the language is either Chinese
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (simplified or traditional)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsChineseLanguage(Language lang);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsNorwegianLanguage
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the language is any of the Norwegian
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (regular or Nynorsk).
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsNorwegianLanguage(Language lang);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsPortugueseLanguage
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the language is any of the Portuguese
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// languages (regular, Portugal or Brazil)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsPortugueseLanguage(Language lang);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsSameLanguage
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WARNING: This function provides only a simple test on the values of
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the two Language arguments. It returns false if either language is
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// invalid. It returns true if the language arguments are equal, or
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if they are both Chinese languages, both Norwegian languages, or
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both Portuguese languages, as defined by IsChineseLanguage,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsNorwegianLanguage, and IsPortugueseLanguage. Otherwise it returns
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsSameLanguage(Language lang1, Language lang2);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsRightToLeftLanguage
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the language is only written right-to-left
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (E.g., Hebrew, Arabic, Persian etc.)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IMPORTANT NOTE: Technically we're talking about scripts, not languages.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are languages that can be written in more than one script.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Examples:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Kurdish and Azeri ('AZERBAIJANI') can be written left-to-right in
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     Latin or Cyrillic script, and right-to-left in Arabic script.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Sindhi and Punjabi are written in different scripts, depending on
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     region and dialect.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Turkmen used an Arabic script historically, but not any more.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Pashto and Uyghur can use Arabic script, but use a Roman script
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     on the Internet.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   - Kashmiri and Urdu are written either with Arabic or Devanagari script.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function only returns true for languages that are always, unequivocally
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// written in right-to-left script.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(benjy): If we want to do anything special with multi-script languages
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we should create new 'languages' for each language+script, as we do for
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// traditional vs. simplified Chinese. However most such languages are rare in
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use and even rarer on the web, so this is unlikely to be something we'll
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be concerned with for a while.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsRightToLeftLanguage(Language lang);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsMaybeRightToLeftLanguage
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the language may appear on the web in a
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// right-to-left script (E.g., Hebrew, Arabic, Persian, Urdu, Kurdish, etc.)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: See important notes under IsRightToLeftLanguage(...).
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true for languages that *may* appear on the web in a
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// right-to-left script, even if they may also appear in a left-to-right
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// script.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function should typically be used in cases where doing some work on
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// left-to-right text would be OK (usually a no-op), and this function is used
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// just to cut down on unnecessary work on regular, LTR text.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsMaybeRightToLeftLanguage(Language lang);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IsScriptRequiringLongerSnippets
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function returns true if the script chracteristics require longer
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// snippet length (Devanagari, Bengali, Gurmukhi,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gujarati, Oriya, Tamil, Telugu, Kannada, Malayalam).
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMMENTED OUT TO REDUCE DEPENDENCIES ON GOOGLE3 CODE
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bool IsScriptRequiringLongerSnippets(UnicodeScript script);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *******************************************
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LANGUAGE NAMES
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This interface defines a standard name for each valid Language,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and a standard name for invalid languages. Some language names use all
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uppercase letters, but others use mixed case.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageName() [Language to name]
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageEnumName() [language to enum name]
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageFromName() [name to Language]
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   default_language_name()
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   invalid_language_name()
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *******************************************
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a Language, returns its standard name.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return invalid_language_name() if the language is invalid.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageName(Language lang);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a Language, return the name of the enum constant for that
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// language. In all but a few cases, this is the same as its standard
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// name. For example, LanguageName(CHINESE) returns "Chinese", but
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageEnumName(CHINESE) returns "CHINESE". This is intended for
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code that is generating C++ code, where the enum constant is more
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// useful than its integer value.  Return "NUM_LANGUAGES" if
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the language is invalid.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageEnumName(Language lang);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The maximum length of a standard language name.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxLanguageNameSize = 50;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The standard name for the default language.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* default_language_name();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The standard name for all invalid languages.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* invalid_language_name();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If lang_name matches the standard name of a Language, using a
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case-insensitive comparison, set *language to that Language and
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return true.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, set *language to UNKNOWN_LANGUAGE and return false.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For backwards compatibility, "HATIAN_CREOLE" is allowed as a name
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for HAITIAN_CREOLE, and "QUECHAU" is allowed as a name for QUECHUA.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For compatibility with LanguageEnumName, "UNKNOWN_LANGUAGE" is allowed
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as a name for UNKNOWN_LANGUAGE (the return value is true in this case,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as it is for "Unknown"), and "CHINESE_T" is allowed as a name for
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CHINESE_T (i.e., a synonym for "ChineseT").
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// REQUIRES: language must not be NULL.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LanguageFromName(const char* lang_name, Language *language);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *******************************************
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LANGUAGE CODES
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This interface defines a standard code for each valid language, and
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a standard code for invalid languages. These are derived from ISO codes,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with some Google additions.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageCode()
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   default_language_code()
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   invalid_language_code()
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageCodeWithDialects()
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageCodeISO639_1()
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   LanguageCodeISO639_2()
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *******************************************
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a Language, return its standard code. There are Google-specific codes:
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For CHINESE_T, return "zh-TW".
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For TG_UNKNOWN_LANGUAGE, return "ut".
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For UNKNOWN_LANGUAGE, return "un".
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For PORTUGUESE_P, return "pt-PT".
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For PORTUGUESE_B, return "pt-BR".
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For LIMBU, return "sit-NP".
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For CHEROKEE, return "chr".
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     For SYRIAC, return "syr".
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise return the ISO 639-1 two-letter language code for lang.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If lang is invalid, return invalid_language_code().
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: See the note below about the codes for Chinese languages.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageCode(Language lang);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The maximum length of a language code.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxLanguageCodeSize = 50;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The standard code for the default language.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* default_language_code();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The standard code for all invalid languages.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* invalid_language_code();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: CHINESE LANGUAGE CODES
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There are three functions that return codes for Chinese languages.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(lang) and LanguageCodeWithDialects(lang) are defined here.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(lang, encoding) is defined in i18n/encodings.lang_enc.h.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following list shows the different results.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(CHINESE) returns "zh"
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(CHINESE_T) returns "zh-TW".
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCodeWithDialects(CHINESE) returns "zh-CN".
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCodeWithDialects(CHINESE_T) returns "zh-TW".
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(CHINESE_T, <any encoding>) returns "zh-TW".
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(CHINESE, CHINESE_BIG5) returns "zh-TW".
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCode(CHINESE, <any other encoding>) returns "zh-CN".
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------------------------------
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCodeWithDialects
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If lang is CHINESE, return "zh-CN". Otherwise return LanguageCode(lang).
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageCodeWithDialects(Language lang);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCodeISO639_1
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the ISO 639-1 two-letter language code for lang.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return invalid_language_code() if lang is invalid or does not have
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an ISO 639-1 two-letter language code.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageCodeISO639_1(Language lang);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCodeISO639_2
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the ISO 639-2 three-letter language for lang.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return invalid_language_code() if lang is invalid or does not have
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an ISO 639-2 three-letter language code.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageCodeISO639_2(Language lang);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageFromCode
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If lang_code matches the code for a Language, using a case-insensitive
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// comparison, set *lang to that Language and return true.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, set *lang to UNKNOWN_LANGUAGE and return false.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lang_code can be an ISO 639-1 (two-letter) code, an ISO 639-2
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (three-letter) code, or a Google-specific code (see LanguageCode).
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Certain language-code aliases are also allowed:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   For "zh-cn" and "zh_cn", set *lang to CHINESE.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   For "zh-tw" and "zh_tw", set *lang to CHINESE_T.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   For "he", set *lang to HEBREW.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   For "in", set *lang to INDONESIAN.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   For "ji", set *lang to YIDDISH.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   For "fil", set *lang to TAGALOG.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// REQUIRES: 'lang' must not be NULL.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LanguageFromCode(const char* lang_code, Language *language);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageFromCodeOrName
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If lang_code_or_name is a language code or a language name.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set *language to the corresponding Language and return true.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise set *language to UNKNOWN_LANGUAGE and return false.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LanguageFromCodeOrName(const char* lang_code_or_name,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Language* language);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageNameFromCode
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --------------------
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If language_code is the code for a Language (see LanguageFromCode),
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return the standard name of that language (see LanguageName).
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise return invalid_language_name().
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* LanguageNameFromCode(const char* language_code);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Miscellany
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LanguageCodeToUnderscoreForm
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a language code, convert the dash "-" to underscore "_".
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically, if result_length <= strlen(lang_code), set result[0]
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to '\0' and return false. Otherwise, copy lang_code to result,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// converting every dash to an underscore, converting every character
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// before the first dash or underscore to lower case, and converting
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// every character after the first dash or underscore to upper
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// case. If there is no dash or underscore, convert the entire string
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to lower case.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// REQUIRES: 'lang_code' must not be NULL. 'result' must not be NULL.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LanguageCodeToUnderscoreForm(const char* lang_code,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  char* result,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int result_length);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AlwaysPutInExpectedRestrict
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For Web pages in certain top-level domains, Web Search always
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// applies a "country restrict". If 'tld' matches one of those, using
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a case-SENSITIVE comparison, set *expected_language to the Language
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// most commonly found in that top-level domain and return true.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Otherwise, set *expected_language to UNKNOWN_LANGUAGE and return false.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AlwaysPutInExpectedRestrict(const char *tld, Language *expected_language);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // LANGUAGES_PUBLIC_LANGUAGES_H_
380