mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
73 lines
2.6 KiB
C++
73 lines
2.6 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 "fuchsia_intl.h"
|
|
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "loop.h"
|
|
#include "rapidjson/document.h"
|
|
#include "rapidjson/stringbuffer.h"
|
|
#include "rapidjson/writer.h"
|
|
#include "runner.h"
|
|
#include "runtime/dart/utils/tempfs.h"
|
|
#include "third_party/icu/source/common/unicode/bytestream.h"
|
|
#include "third_party/icu/source/common/unicode/errorcode.h"
|
|
#include "third_party/icu/source/common/unicode/locid.h"
|
|
#include "third_party/icu/source/common/unicode/strenum.h"
|
|
#include "third_party/icu/source/common/unicode/stringpiece.h"
|
|
#include "third_party/icu/source/common/unicode/uloc.h"
|
|
|
|
using icu::Locale;
|
|
|
|
namespace flutter_runner {
|
|
|
|
using fuchsia::intl::Profile;
|
|
|
|
std::vector<uint8_t> MakeLocalizationPlatformMessageData(
|
|
const Profile& intl_profile) {
|
|
rapidjson::Document document;
|
|
auto& allocator = document.GetAllocator();
|
|
document.SetObject();
|
|
document.AddMember("method", "setLocale", allocator);
|
|
rapidjson::Value args(rapidjson::kArrayType);
|
|
|
|
for (const auto& locale_id : intl_profile.locales()) {
|
|
UErrorCode error_code = U_ZERO_ERROR;
|
|
icu::Locale locale = icu::Locale::forLanguageTag(locale_id.id, error_code);
|
|
if (U_FAILURE(error_code)) {
|
|
FML_LOG(ERROR) << "Error parsing locale ID \"" << locale_id.id << "\"";
|
|
continue;
|
|
}
|
|
args.PushBack(rapidjson::Value().SetString(locale.getLanguage(), allocator),
|
|
allocator);
|
|
|
|
auto country = locale.getCountry() != nullptr ? locale.getCountry() : "";
|
|
args.PushBack(rapidjson::Value().SetString(country, allocator), allocator);
|
|
|
|
auto script = locale.getScript() != nullptr ? locale.getScript() : "";
|
|
args.PushBack(rapidjson::Value().SetString(script, allocator), allocator);
|
|
|
|
std::string variant =
|
|
locale.getVariant() != nullptr ? locale.getVariant() : "";
|
|
// ICU4C capitalizes the variant for backward compatibility, even though
|
|
// the preferred form is lowercase. So we lowercase here.
|
|
std::transform(begin(variant), end(variant), begin(variant),
|
|
[](unsigned char c) { return std::tolower(c); });
|
|
args.PushBack(rapidjson::Value().SetString(variant, allocator), allocator);
|
|
}
|
|
|
|
document.AddMember("args", args, allocator);
|
|
|
|
rapidjson::StringBuffer buffer;
|
|
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
|
|
document.Accept(writer);
|
|
auto data = reinterpret_cast<const uint8_t*>(buffer.GetString());
|
|
return std::vector<uint8_t>(data, data + buffer.GetSize());
|
|
}
|
|
|
|
} // namespace flutter_runner
|