mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
The other linux shell (and all the other embedding) have support for getting the locales from the system and sending them over the flutter/localization channel. The glfw shell does not have that which is causing a crash on an assert now that Locale is no longer nullable in Platform. This adds a similar approach to what is going on over in the other linux shell.
293 lines
10 KiB
C++
293 lines
10 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "flutter/shell/platform/glfw/system_utils.h"
|
|
|
|
#include <cstdlib>
|
|
|
|
#include "gtest/gtest.h"
|
|
|
|
namespace flutter {
|
|
namespace {
|
|
|
|
// This is a helper for setting up the different environment variables to
|
|
// specific strings, calling GetPreferredLanguageInfo, and then restoring those
|
|
// environment variables to any previously existing values.
|
|
std::vector<LanguageInfo> SetAndRestoreLanguageAroundGettingLanguageInfo(
|
|
const char* language,
|
|
const char* lc_all,
|
|
const char* lc_messages,
|
|
const char* lang) {
|
|
std::vector<const char*> env_vars{
|
|
"LANGUAGE",
|
|
"LC_ALL",
|
|
"LC_MESSAGES",
|
|
"LANG",
|
|
};
|
|
std::map<const char*, const char*> new_values{
|
|
{env_vars[0], language},
|
|
{env_vars[1], lc_all},
|
|
{env_vars[2], lc_messages},
|
|
{env_vars[3], lang},
|
|
};
|
|
std::map<const char*, const char*> prior_values;
|
|
for (auto var : env_vars) {
|
|
const char* value = getenv(var);
|
|
if (value != nullptr) {
|
|
prior_values.emplace(var, value);
|
|
}
|
|
const char* new_value = new_values.at(var);
|
|
if (new_value != nullptr) {
|
|
setenv(var, new_value, 1);
|
|
} else {
|
|
unsetenv(var);
|
|
}
|
|
}
|
|
|
|
std::vector<LanguageInfo> languages = GetPreferredLanguageInfo();
|
|
|
|
for (auto [var, value] : prior_values) {
|
|
setenv(var, value, 1);
|
|
}
|
|
|
|
return languages;
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoFull) {
|
|
const char* locale_string = "en_GB.ISO-8859-1@euro:en_US:sv:zh_CN.UTF-8";
|
|
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(locale_string, nullptr,
|
|
nullptr, nullptr);
|
|
|
|
EXPECT_EQ(languages.size(), 15UL);
|
|
|
|
EXPECT_STREQ(languages[0].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[0].territory.c_str(), "GB");
|
|
EXPECT_STREQ(languages[0].codeset.c_str(), "ISO-8859-1");
|
|
EXPECT_STREQ(languages[0].modifier.c_str(), "euro");
|
|
|
|
EXPECT_STREQ(languages[1].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[1].territory.c_str(), "GB");
|
|
EXPECT_STREQ(languages[1].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[1].modifier.c_str(), "euro");
|
|
|
|
EXPECT_STREQ(languages[2].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[2].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[2].codeset.c_str(), "ISO-8859-1");
|
|
EXPECT_STREQ(languages[2].modifier.c_str(), "euro");
|
|
|
|
EXPECT_STREQ(languages[3].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[3].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[3].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[3].modifier.c_str(), "euro");
|
|
|
|
EXPECT_STREQ(languages[4].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[4].territory.c_str(), "GB");
|
|
EXPECT_STREQ(languages[4].codeset.c_str(), "ISO-8859-1");
|
|
EXPECT_STREQ(languages[4].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[5].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[5].territory.c_str(), "GB");
|
|
EXPECT_STREQ(languages[5].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[5].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[6].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[6].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[6].codeset.c_str(), "ISO-8859-1");
|
|
EXPECT_STREQ(languages[6].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[7].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[7].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[7].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[7].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[8].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[8].territory.c_str(), "US");
|
|
EXPECT_STREQ(languages[8].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[8].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[9].language.c_str(), "en");
|
|
EXPECT_STREQ(languages[9].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[9].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[9].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[10].language.c_str(), "sv");
|
|
EXPECT_STREQ(languages[10].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[10].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[10].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[11].language.c_str(), "zh");
|
|
EXPECT_STREQ(languages[11].territory.c_str(), "CN");
|
|
EXPECT_STREQ(languages[11].codeset.c_str(), "UTF-8");
|
|
EXPECT_STREQ(languages[11].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[12].language.c_str(), "zh");
|
|
EXPECT_STREQ(languages[12].territory.c_str(), "CN");
|
|
EXPECT_STREQ(languages[12].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[12].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[13].language.c_str(), "zh");
|
|
EXPECT_STREQ(languages[13].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[13].codeset.c_str(), "UTF-8");
|
|
EXPECT_STREQ(languages[13].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[14].language.c_str(), "zh");
|
|
EXPECT_STREQ(languages[14].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[14].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[14].modifier.c_str(), "");
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoWeird) {
|
|
const char* locale_string = "tt_RU@iqtelif.UTF-8";
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(locale_string, nullptr,
|
|
nullptr, nullptr);
|
|
|
|
EXPECT_EQ(languages.size(), 4UL);
|
|
|
|
EXPECT_STREQ(languages[0].language.c_str(), "tt");
|
|
EXPECT_STREQ(languages[0].territory.c_str(), "RU");
|
|
EXPECT_STREQ(languages[0].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[0].modifier.c_str(), "iqtelif.UTF-8");
|
|
|
|
EXPECT_STREQ(languages[1].language.c_str(), "tt");
|
|
EXPECT_STREQ(languages[1].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[1].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[1].modifier.c_str(), "iqtelif.UTF-8");
|
|
|
|
EXPECT_STREQ(languages[2].language.c_str(), "tt");
|
|
EXPECT_STREQ(languages[2].territory.c_str(), "RU");
|
|
EXPECT_STREQ(languages[2].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[2].modifier.c_str(), "");
|
|
|
|
EXPECT_STREQ(languages[3].language.c_str(), "tt");
|
|
EXPECT_STREQ(languages[3].territory.c_str(), "");
|
|
EXPECT_STREQ(languages[3].codeset.c_str(), "");
|
|
EXPECT_STREQ(languages[3].modifier.c_str(), "");
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEmpty) {
|
|
const char* locale_string = "";
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(
|
|
locale_string, locale_string, locale_string, locale_string);
|
|
|
|
EXPECT_EQ(languages.size(), 1UL);
|
|
|
|
EXPECT_STREQ(languages[0].language.c_str(), "C");
|
|
EXPECT_TRUE(languages[0].territory.empty());
|
|
EXPECT_TRUE(languages[0].codeset.empty());
|
|
EXPECT_TRUE(languages[0].modifier.empty());
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering1) {
|
|
const char* language = "de";
|
|
const char* lc_all = "en";
|
|
const char* lc_messages = "zh";
|
|
const char* lang = "tt";
|
|
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(language, lc_all,
|
|
lc_messages, lang);
|
|
|
|
EXPECT_EQ(languages.size(), 1UL);
|
|
EXPECT_STREQ(languages[0].language.c_str(), language);
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering2) {
|
|
const char* lc_all = "en";
|
|
const char* lc_messages = "zh";
|
|
const char* lang = "tt";
|
|
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, lc_all,
|
|
lc_messages, lang);
|
|
|
|
EXPECT_EQ(languages.size(), 1UL);
|
|
EXPECT_STREQ(languages[0].language.c_str(), lc_all);
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering3) {
|
|
const char* lc_messages = "zh";
|
|
const char* lang = "tt";
|
|
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, nullptr,
|
|
lc_messages, lang);
|
|
|
|
EXPECT_EQ(languages.size(), 1UL);
|
|
EXPECT_STREQ(languages[0].language.c_str(), lc_messages);
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering4) {
|
|
const char* lang = "tt";
|
|
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, nullptr, nullptr,
|
|
lang);
|
|
|
|
EXPECT_EQ(languages.size(), 1UL);
|
|
EXPECT_STREQ(languages[0].language.c_str(), lang);
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, GetPreferredLanuageInfoEnvVariableOrdering5) {
|
|
std::vector<LanguageInfo> languages =
|
|
SetAndRestoreLanguageAroundGettingLanguageInfo(nullptr, nullptr, nullptr,
|
|
nullptr);
|
|
|
|
EXPECT_EQ(languages.size(), 1UL);
|
|
EXPECT_STREQ(languages[0].language.c_str(), "C");
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, ConvertToFlutterLocaleEmpty) {
|
|
std::vector<LanguageInfo> languages;
|
|
|
|
std::vector<FlutterLocale> locales = ConvertToFlutterLocale(languages);
|
|
|
|
EXPECT_TRUE(locales.empty());
|
|
}
|
|
|
|
TEST(FlutterGlfwSystemUtilsTest, ConvertToFlutterLocaleNonEmpty) {
|
|
std::vector<LanguageInfo> languages;
|
|
languages.push_back(LanguageInfo{"en", "US", "", ""});
|
|
languages.push_back(LanguageInfo{"tt", "RU", "", "iqtelif.UTF-8"});
|
|
languages.push_back(LanguageInfo{"sv", "", "", ""});
|
|
languages.push_back(LanguageInfo{"de", "DE", "UTF-8", "euro"});
|
|
languages.push_back(LanguageInfo{"zh", "CN", "UTF-8", ""});
|
|
|
|
std::vector<FlutterLocale> locales = ConvertToFlutterLocale(languages);
|
|
|
|
EXPECT_EQ(locales.size(), 5UL);
|
|
|
|
EXPECT_EQ(locales[0].struct_size, sizeof(FlutterLocale));
|
|
EXPECT_STREQ(locales[0].language_code, "en");
|
|
EXPECT_STREQ(locales[0].country_code, "US");
|
|
EXPECT_EQ(locales[0].script_code, nullptr);
|
|
EXPECT_EQ(locales[0].variant_code, nullptr);
|
|
|
|
EXPECT_STREQ(locales[1].language_code, "tt");
|
|
EXPECT_STREQ(locales[1].country_code, "RU");
|
|
EXPECT_EQ(locales[1].script_code, nullptr);
|
|
EXPECT_STREQ(locales[1].variant_code, "iqtelif.UTF-8");
|
|
|
|
EXPECT_STREQ(locales[2].language_code, "sv");
|
|
EXPECT_EQ(locales[2].country_code, nullptr);
|
|
EXPECT_EQ(locales[2].script_code, nullptr);
|
|
EXPECT_EQ(locales[2].variant_code, nullptr);
|
|
|
|
EXPECT_STREQ(locales[3].language_code, "de");
|
|
EXPECT_STREQ(locales[3].country_code, "DE");
|
|
EXPECT_STREQ(locales[3].script_code, "UTF-8");
|
|
EXPECT_STREQ(locales[3].variant_code, "euro");
|
|
|
|
EXPECT_STREQ(locales[4].language_code, "zh");
|
|
EXPECT_STREQ(locales[4].country_code, "CN");
|
|
EXPECT_STREQ(locales[4].script_code, "UTF-8");
|
|
EXPECT_EQ(locales[4].variant_code, nullptr);
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace flutter
|