Better td_api::languagePackString.

GitOrigin-RevId: 1d65914ecd09584ae58b3a57a9f59c5ecb34dea5
This commit is contained in:
levlam 2018-08-23 00:29:26 +03:00
parent 7e45ca25f7
commit 0300c3387e
6 changed files with 101 additions and 66 deletions

View File

@ -1703,21 +1703,24 @@ chatEvents events:vector<chatEvent> = ChatEvents;
chatEventLogFilters message_edits:Bool message_deletions:Bool message_pins:Bool member_joins:Bool member_leaves:Bool member_invites:Bool member_promotions:Bool member_restrictions:Bool info_changes:Bool setting_changes:Bool = ChatEventLogFilters; chatEventLogFilters message_edits:Bool message_deletions:Bool message_pins:Bool member_joins:Bool member_leaves:Bool member_invites:Bool member_promotions:Bool member_restrictions:Bool info_changes:Bool setting_changes:Bool = ChatEventLogFilters;
//@class LanguagePackString @description Represents one language pack string //@class LanguagePackStringValue @description Represents a value of language pack string
//@description An ordinary language pack string @key String key @value String value //@description An ordinary language pack string @value String value
languagePackStringValue key:string value:string = LanguagePackString; languagePackStringValueOrdinary value:string = LanguagePackStringValue;
//@description A language pack string, which has different forms based on some quantity @key String key @zero_value Value for zero objects @one_value Value for one object @two_value Value for two objects //@description A language pack string, which has different forms based on some quantity @zero_value Value for zero objects @one_value Value for one object @two_value Value for two objects
//@few_value Value for few objects @many_value Value for many objects @other_value Default value //@few_value Value for few objects @many_value Value for many objects @other_value Default value
languagePackStringPluralized key:string zero_value:string one_value:string two_value:string few_value:string many_value:string other_value:string = LanguagePackString; languagePackStringValuePluralized zero_value:string one_value:string two_value:string few_value:string many_value:string other_value:string = LanguagePackStringValue;
//@description A deleted language pack string, the value should be taken from a built-in english language pack @key String key //@description A deleted language pack string, the value should be taken from a built-in english language pack
languagePackStringDeleted key:string = LanguagePackString; languagePackStringValueDeleted = LanguagePackStringValue;
//@description Represents one language pack string @key String key @value String value
languagePackString key:string value:LanguagePackStringValue = LanguagePackString;
//@description Contains a list of language pack strings @strings A list of language pack strings //@description Contains a list of language pack strings @strings A list of language pack strings
languagePackStrings strings:vector<LanguagePackString> = LanguagePackStrings; languagePackStrings strings:vector<languagePackString> = LanguagePackStrings;
//@description Contains information about a language @code Language code @name Language name @native_name Language native name //@description Contains information about a language @code Language code @name Language name @native_name Language native name
languageInfo code:string name:string native_name:string = LanguageInfo; languageInfo code:string name:string native_name:string = LanguageInfo;
@ -2268,7 +2271,7 @@ updateFavoriteStickers sticker_ids:vector<int32> = Update;
updateSavedAnimations animation_ids:vector<int32> = Update; updateSavedAnimations animation_ids:vector<int32> = Update;
//@description Some language pack strings was updated @language_pack Changed language pack @language_code Code of the language, which was updated @strings List of changed language pack strings //@description Some language pack strings was updated @language_pack Changed language pack @language_code Code of the language, which was updated @strings List of changed language pack strings
updateLanguagePackStrings language_pack:string language_code:string strings:vector<LanguagePackString> = Update; updateLanguagePackStrings language_pack:string language_code:string strings:vector<languagePackString> = Update;
//@description The connection state has changed @state The new connection state //@description The connection state has changed @state The new connection state
updateConnectionState state:ConnectionState = Update; updateConnectionState state:ConnectionState = Update;
@ -2646,7 +2649,7 @@ getFileExtension mime_type:string = Text;
cleanFileName file_name:string = Text; cleanFileName file_name:string = Text;
//@description Returns a string stored in a local database from specified language pack and language by its key. Returns a 404 error if the string is not found. This is an offline method. Can be called before authorization. Can be called synchronously @language_database_path Path to a language database in which strings are stored @language_pack Language pack of string to return @language_code Language code of string to return @key Language pack key of string to return //@description Returns a string stored in a local database from specified language pack and language by its key. Returns a 404 error if the string is not found. This is an offline method. Can be called before authorization. Can be called synchronously @language_database_path Path to a language database in which strings are stored @language_pack Language pack of string to return @language_code Language code of string to return @key Language pack key of string to return
getLanguagePackString language_database_path:string language_pack:string language_code:string key:string = LanguagePackString; getLanguagePackString language_database_path:string language_pack:string language_code:string key:string = LanguagePackStringValue;
//@description Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires @bot_user_id The identifier of the target bot //@description Sends an inline query to a bot and returns its results. Returns an error with code 502 if the bot fails to answer the query before the query timeout expires @bot_user_id The identifier of the target bot
@ -3134,10 +3137,10 @@ getLanguagePackInfo = LanguagePack;
getLanguagePackStrings language_code:string keys:vector<string> = LanguagePackStrings; getLanguagePackStrings language_code:string keys:vector<string> = LanguagePackStrings;
//@description Adds or changes a custom language to the used language pack @info Information about the language. Language code must start with 'X' @strings New language pack strings //@description Adds or changes a custom language to the used language pack @info Information about the language. Language code must start with 'X' @strings New language pack strings
setCustomLanguage info:languageInfo strings:vector<LanguagePackString> = Ok; setCustomLanguage info:languageInfo strings:vector<languagePackString> = Ok;
//@description Sets new value for a string in a custom language in the used language pack @language_code The code of previously added custom language, must start with 'X' @string New language pack string //@description Sets new value for a string in a custom language in the used language pack @language_code The code of previously added custom language, must start with 'X' @new_string New language pack string
setCustomLanguageString language_code:string string:LanguagePackString = Ok; setCustomLanguageString language_code:string new_string:languagePackString = Ok;
//@description Deletes all information about a language in the used language pack. Currently used language can't be deleted @language_code Language code of a language to delete //@description Deletes all information about a language in the used language pack. Currently used language can't be deleted @language_code Language code of a language to delete
deleteLanguage language_code:string = Ok; deleteLanguage language_code:string = Ok;

Binary file not shown.

View File

@ -430,35 +430,53 @@ bool LanguagePackManager::load_language_strings(LanguageDatabase *database, Lang
return true; return true;
} }
td_api::object_ptr<td_api::LanguagePackString> LanguagePackManager::get_language_pack_string_object( td_api::object_ptr<td_api::LanguagePackStringValue> LanguagePackManager::get_language_pack_string_value_object(
const string &value) {
return td_api::make_object<td_api::languagePackStringValueOrdinary>(value);
}
td_api::object_ptr<td_api::LanguagePackStringValue> LanguagePackManager::get_language_pack_string_value_object(
const PluralizedString &value) {
return td_api::make_object<td_api::languagePackStringValuePluralized>(
value.zero_value_, value.one_value_, value.two_value_, value.few_value_, value.many_value_, value.other_value_);
}
td_api::object_ptr<td_api::LanguagePackStringValue> LanguagePackManager::get_language_pack_string_value_object() {
return td_api::make_object<td_api::languagePackStringValueDeleted>();
}
td_api::object_ptr<td_api::languagePackString> LanguagePackManager::get_language_pack_string_object(
const std::pair<string, string> &str) { const std::pair<string, string> &str) {
return td_api::make_object<td_api::languagePackStringValue>(str.first, str.second); return td_api::make_object<td_api::languagePackString>(str.first, get_language_pack_string_value_object(str.second));
} }
td_api::object_ptr<td_api::LanguagePackString> LanguagePackManager::get_language_pack_string_object( td_api::object_ptr<td_api::languagePackString> LanguagePackManager::get_language_pack_string_object(
const std::pair<string, PluralizedString> &str) { const std::pair<string, PluralizedString> &str) {
return td_api::make_object<td_api::languagePackStringPluralized>( return td_api::make_object<td_api::languagePackString>(str.first, get_language_pack_string_value_object(str.second));
str.first, str.second.zero_value_, str.second.one_value_, str.second.two_value_, str.second.few_value_,
str.second.many_value_, str.second.other_value_);
} }
td_api::object_ptr<td_api::LanguagePackString> LanguagePackManager::get_language_pack_string_object(const string &str) { td_api::object_ptr<td_api::languagePackString> LanguagePackManager::get_language_pack_string_object(const string &str) {
return td_api::make_object<td_api::languagePackStringDeleted>(str); return td_api::make_object<td_api::languagePackString>(str, get_language_pack_string_value_object());
} }
td_api::object_ptr<td_api::LanguagePackString> LanguagePackManager::get_language_pack_string_object(Language *language, td_api::object_ptr<td_api::LanguagePackStringValue> LanguagePackManager::get_language_pack_string_value_object(
const string &key) { Language *language, const string &key) {
CHECK(language != nullptr); CHECK(language != nullptr);
auto ordinary_it = language->ordinary_strings_.find(key); auto ordinary_it = language->ordinary_strings_.find(key);
if (ordinary_it != language->ordinary_strings_.end()) { if (ordinary_it != language->ordinary_strings_.end()) {
return get_language_pack_string_object(*ordinary_it); return get_language_pack_string_value_object(ordinary_it->second);
} }
auto pluralized_it = language->pluralized_strings_.find(key); auto pluralized_it = language->pluralized_strings_.find(key);
if (pluralized_it != language->pluralized_strings_.end()) { if (pluralized_it != language->pluralized_strings_.end()) {
return get_language_pack_string_object(*pluralized_it); return get_language_pack_string_value_object(pluralized_it->second);
} }
LOG_IF(ERROR, !language->is_full_ && language->deleted_strings_.count(key) == 0) << "Have no string for key " << key; LOG_IF(ERROR, !language->is_full_ && language->deleted_strings_.count(key) == 0) << "Have no string for key " << key;
return get_language_pack_string_object(key); return get_language_pack_string_value_object(key);
}
td_api::object_ptr<td_api::languagePackString> LanguagePackManager::get_language_pack_string_object(Language *language,
const string &key) {
return td_api::make_object<td_api::languagePackString>(key, get_language_pack_string_value_object(language, key));
} }
td_api::object_ptr<td_api::languagePackStrings> LanguagePackManager::get_language_pack_strings_object( td_api::object_ptr<td_api::languagePackStrings> LanguagePackManager::get_language_pack_strings_object(
@ -466,7 +484,7 @@ td_api::object_ptr<td_api::languagePackStrings> LanguagePackManager::get_languag
CHECK(language != nullptr); CHECK(language != nullptr);
std::lock_guard<std::mutex> lock(language->mutex_); std::lock_guard<std::mutex> lock(language->mutex_);
vector<td_api::object_ptr<td_api::LanguagePackString>> strings; vector<td_api::object_ptr<td_api::languagePackString>> strings;
if (keys.empty()) { if (keys.empty()) {
for (auto &str : language->ordinary_strings_) { for (auto &str : language->ordinary_strings_) {
strings.push_back(get_language_pack_string_object(str)); strings.push_back(get_language_pack_string_object(str));
@ -597,10 +615,10 @@ td_api::object_ptr<td_api::Object> LanguagePackManager::get_language_pack_string
vector<string> keys{key}; vector<string> keys{key};
if (language_has_strings(language, keys)) { if (language_has_strings(language, keys)) {
std::lock_guard<std::mutex> lock(language->mutex_); std::lock_guard<std::mutex> lock(language->mutex_);
return get_language_pack_string_object(language, key); return get_language_pack_string_value_object(language, key);
} }
if (!database->database_.empty() && load_language_strings(database, language, keys)) { if (!database->database_.empty() && load_language_strings(database, language, keys)) {
return get_language_pack_string_object(language, key); return get_language_pack_string_value_object(language, key);
} }
return td_api::make_object<td_api::error>(404, "Not Found"); return td_api::make_object<td_api::error>(404, "Not Found");
} }
@ -669,7 +687,7 @@ void LanguagePackManager::on_get_language_pack_strings(
} }
std::lock_guard<std::mutex> lock(language->mutex_); std::lock_guard<std::mutex> lock(language->mutex_);
if (language->version_ < version || !keys.empty()) { if (language->version_ < version || !keys.empty()) {
vector<td_api::object_ptr<td_api::LanguagePackString>> strings; vector<td_api::object_ptr<td_api::languagePackString>> strings;
if (language->version_ < version && !(is_diff && language->version_ == -1)) { if (language->version_ < version && !(is_diff && language->version_ == -1)) {
LOG(INFO) << "Set language " << language_code << " version to " << version; LOG(INFO) << "Set language " << language_code << " version to " << version;
language->version_ = version; language->version_ = version;
@ -793,26 +811,29 @@ void LanguagePackManager::on_failed_get_difference(string language_pack, string
} }
Result<tl_object_ptr<telegram_api::LangPackString>> LanguagePackManager::convert_to_telegram_api( Result<tl_object_ptr<telegram_api::LangPackString>> LanguagePackManager::convert_to_telegram_api(
tl_object_ptr<td_api::LanguagePackString> &&str) { tl_object_ptr<td_api::languagePackString> &&str) {
if (str == nullptr) { if (str == nullptr) {
return Status::Error(400, "Language strings must not be null"); return Status::Error(400, "Language strings must not be null");
} }
string key; string key = std::move(str->key_);
downcast_call(*str, [&key](auto &value) { key = std::move(value.key_); });
if (!is_valid_key(key)) { if (!is_valid_key(key)) {
return Status::Error(400, "Key is invalid"); return Status::Error(400, "Key is invalid");
} }
switch (str->get_id()) {
case td_api::languagePackStringValue::ID: { if (str->value_ == nullptr) {
auto value = static_cast<td_api::languagePackStringValue *>(str.get()); return make_tl_object<telegram_api::langPackStringDeleted>(std::move(key));
}
switch (str->value_->get_id()) {
case td_api::languagePackStringValueOrdinary::ID: {
auto value = static_cast<td_api::languagePackStringValueOrdinary *>(str->value_.get());
if (!clean_input_string(value->value_)) { if (!clean_input_string(value->value_)) {
return Status::Error(400, "Strings must be encoded in UTF-8"); return Status::Error(400, "Strings must be encoded in UTF-8");
} }
return make_tl_object<telegram_api::langPackString>(std::move(key), std::move(value->value_)); return make_tl_object<telegram_api::langPackString>(std::move(key), std::move(value->value_));
} }
case td_api::languagePackStringPluralized::ID: { case td_api::languagePackStringValuePluralized::ID: {
auto value = static_cast<td_api::languagePackStringPluralized *>(str.get()); auto value = static_cast<td_api::languagePackStringValuePluralized *>(str->value_.get());
if (!clean_input_string(value->zero_value_) || !clean_input_string(value->one_value_) || if (!clean_input_string(value->zero_value_) || !clean_input_string(value->one_value_) ||
!clean_input_string(value->two_value_) || !clean_input_string(value->few_value_) || !clean_input_string(value->two_value_) || !clean_input_string(value->few_value_) ||
!clean_input_string(value->many_value_) || !clean_input_string(value->other_value_)) { !clean_input_string(value->many_value_) || !clean_input_string(value->other_value_)) {
@ -822,7 +843,7 @@ Result<tl_object_ptr<telegram_api::LangPackString>> LanguagePackManager::convert
31, std::move(key), std::move(value->zero_value_), std::move(value->one_value_), std::move(value->two_value_), 31, std::move(key), std::move(value->zero_value_), std::move(value->one_value_), std::move(value->two_value_),
std::move(value->few_value_), std::move(value->many_value_), std::move(value->other_value_)); std::move(value->few_value_), std::move(value->many_value_), std::move(value->other_value_));
} }
case td_api::languagePackStringDeleted::ID: case td_api::languagePackStringValueDeleted::ID:
// there is no reason to save deleted strings in a custom language pack to database // there is no reason to save deleted strings in a custom language pack to database
return make_tl_object<telegram_api::langPackStringDeleted>(std::move(key)); return make_tl_object<telegram_api::langPackStringDeleted>(std::move(key));
default: default:
@ -832,7 +853,7 @@ Result<tl_object_ptr<telegram_api::LangPackString>> LanguagePackManager::convert
} }
void LanguagePackManager::set_custom_language(string language_code, string language_name, string language_native_name, void LanguagePackManager::set_custom_language(string language_code, string language_name, string language_native_name,
vector<tl_object_ptr<td_api::LanguagePackString>> strings, vector<tl_object_ptr<td_api::languagePackString>> strings,
Promise<Unit> &&promise) { Promise<Unit> &&promise) {
if (!check_language_code_name(language_code)) { if (!check_language_code_name(language_code)) {
return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen")); return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen"));
@ -869,7 +890,7 @@ void LanguagePackManager::set_custom_language(string language_code, string langu
} }
void LanguagePackManager::set_custom_language_string(string language_code, void LanguagePackManager::set_custom_language_string(string language_code,
tl_object_ptr<td_api::LanguagePackString> str, tl_object_ptr<td_api::languagePackString> str,
Promise<Unit> &&promise) { Promise<Unit> &&promise) {
if (!check_language_code_name(language_code)) { if (!check_language_code_name(language_code)) {
return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen")); return promise.set_error(Status::Error(400, "Language code name must contain only letters and hyphen"));
@ -881,12 +902,12 @@ void LanguagePackManager::set_custom_language_string(string language_code,
if (get_language(database_, language_pack_, language_code) == nullptr) { if (get_language(database_, language_pack_, language_code) == nullptr) {
return promise.set_error(Status::Error(400, "Custom language not found")); return promise.set_error(Status::Error(400, "Custom language not found"));
} }
if (str == nullptr) {
string key; return promise.set_error(Status::Error(400, "Language strings must not be null"));
if (str != nullptr) {
downcast_call(*str, [&key](auto &value) { key = value.key_; });
} }
vector<string> keys{str->key_};
auto r_str = convert_to_telegram_api(std::move(str)); auto r_str = convert_to_telegram_api(std::move(str));
if (r_str.is_error()) { if (r_str.is_error()) {
return promise.set_error(r_str.move_as_error()); return promise.set_error(r_str.move_as_error());
@ -895,7 +916,7 @@ void LanguagePackManager::set_custom_language_string(string language_code,
vector<tl_object_ptr<telegram_api::LangPackString>> server_strings; vector<tl_object_ptr<telegram_api::LangPackString>> server_strings;
server_strings.push_back(r_str.move_as_ok()); server_strings.push_back(r_str.move_as_ok());
on_get_language_pack_strings(language_pack_, language_code, 1, true, {std::move(key)}, std::move(server_strings), on_get_language_pack_strings(language_pack_, language_code, 1, true, std::move(keys), std::move(server_strings),
Auto()); Auto());
promise.set_value(Unit()); promise.set_value(Unit());
} }

View File

@ -58,9 +58,9 @@ class LanguagePackManager : public NetQueryCallback {
void on_update_language_pack(tl_object_ptr<telegram_api::langPackDifference> difference); void on_update_language_pack(tl_object_ptr<telegram_api::langPackDifference> difference);
void set_custom_language(string language_code, string language_name, string language_native_name, void set_custom_language(string language_code, string language_name, string language_native_name,
vector<tl_object_ptr<td_api::LanguagePackString>> strings, Promise<Unit> &&promise); vector<tl_object_ptr<td_api::languagePackString>> strings, Promise<Unit> &&promise);
void set_custom_language_string(string language_code, tl_object_ptr<td_api::LanguagePackString> str, void set_custom_language_string(string language_code, tl_object_ptr<td_api::languagePackString> str,
Promise<Unit> &&promise); Promise<Unit> &&promise);
void delete_language(string language_code, Promise<Unit> &&promise); void delete_language(string language_code, Promise<Unit> &&promise);
@ -96,20 +96,28 @@ class LanguagePackManager : public NetQueryCallback {
static void load_language_string_unsafe(Language *language, const string &key, string &value); static void load_language_string_unsafe(Language *language, const string &key, string &value);
static bool load_language_strings(LanguageDatabase *database, Language *language, const vector<string> &keys); static bool load_language_strings(LanguageDatabase *database, Language *language, const vector<string> &keys);
static td_api::object_ptr<td_api::LanguagePackString> get_language_pack_string_object( static td_api::object_ptr<td_api::LanguagePackStringValue> get_language_pack_string_value_object(const string &value);
const std::pair<string, string> &str); static td_api::object_ptr<td_api::LanguagePackStringValue> get_language_pack_string_value_object(
static td_api::object_ptr<td_api::LanguagePackString> get_language_pack_string_object( const PluralizedString &value);
const std::pair<string, PluralizedString> &str); static td_api::object_ptr<td_api::LanguagePackStringValue> get_language_pack_string_value_object();
static td_api::object_ptr<td_api::LanguagePackString> get_language_pack_string_object(const string &str);
static td_api::object_ptr<td_api::LanguagePackString> get_language_pack_string_object(Language *language, static td_api::object_ptr<td_api::languagePackString> get_language_pack_string_object(
const std::pair<string, string> &str);
static td_api::object_ptr<td_api::languagePackString> get_language_pack_string_object(
const std::pair<string, PluralizedString> &str);
static td_api::object_ptr<td_api::languagePackString> get_language_pack_string_object(const string &str);
static td_api::object_ptr<td_api::LanguagePackStringValue> get_language_pack_string_value_object(Language *language,
const string &key);
static td_api::object_ptr<td_api::languagePackString> get_language_pack_string_object(Language *language,
const string &key); const string &key);
static td_api::object_ptr<td_api::languagePackStrings> get_language_pack_strings_object(Language *language, static td_api::object_ptr<td_api::languagePackStrings> get_language_pack_strings_object(Language *language,
const vector<string> &keys); const vector<string> &keys);
static Result<tl_object_ptr<telegram_api::LangPackString>> convert_to_telegram_api( static Result<tl_object_ptr<telegram_api::LangPackString>> convert_to_telegram_api(
tl_object_ptr<td_api::LanguagePackString> &&str); tl_object_ptr<td_api::languagePackString> &&str);
void inc_generation(); void inc_generation();

View File

@ -6059,7 +6059,7 @@ void Td::on_request(uint64 id, td_api::setCustomLanguageString &request) {
CLEAN_INPUT_STRING(request.language_code_); CLEAN_INPUT_STRING(request.language_code_);
CREATE_OK_REQUEST_PROMISE(); CREATE_OK_REQUEST_PROMISE();
send_closure(language_pack_manager_, &LanguagePackManager::set_custom_language_string, send_closure(language_pack_manager_, &LanguagePackManager::set_custom_language_string,
std::move(request.language_code_), std::move(request.string_), std::move(promise)); std::move(request.language_code_), std::move(request.new_string_), std::move(promise));
} }
void Td::on_request(uint64 id, td_api::deleteLanguage &request) { void Td::on_request(uint64 id, td_api::deleteLanguage &request) {

View File

@ -1778,11 +1778,14 @@ class CliClient final : public Actor {
std::tie(name, args) = split(args); std::tie(name, args) = split(args);
std::tie(native_name, key) = split(args); std::tie(native_name, key) = split(args);
vector<tl_object_ptr<td_api::LanguagePackString>> strings; vector<tl_object_ptr<td_api::languagePackString>> strings;
strings.push_back(make_tl_object<td_api::languagePackStringValue>(key, "Ordinary value")); strings.push_back(make_tl_object<td_api::languagePackString>(
strings.push_back(make_tl_object<td_api::languagePackStringPluralized>("Plu", "Zero", string("One\0One", 7), key, make_tl_object<td_api::languagePackStringValueOrdinary>("Ordinary value")));
"Two", "Few", "Many", "Other")); strings.push_back(make_tl_object<td_api::languagePackString>(
strings.push_back(make_tl_object<td_api::languagePackStringDeleted>("DELETED")); "Plu", make_tl_object<td_api::languagePackStringValuePluralized>("Zero", string("One\0One", 7), "Two", "Few",
"Many", "Other")));
strings.push_back(make_tl_object<td_api::languagePackString>(
"DELETED", make_tl_object<td_api::languagePackStringValueDeleted>()));
send_request(make_tl_object<td_api::setCustomLanguage>( send_request(make_tl_object<td_api::setCustomLanguage>(
make_tl_object<td_api::languageInfo>(language_code, name, native_name), std::move(strings))); make_tl_object<td_api::languageInfo>(language_code, name, native_name), std::move(strings)));
@ -1794,14 +1797,14 @@ class CliClient final : public Actor {
std::tie(language_code, args) = split(args); std::tie(language_code, args) = split(args);
std::tie(key, value) = split(args); std::tie(key, value) = split(args);
tl_object_ptr<td_api::LanguagePackString> str; tl_object_ptr<td_api::languagePackString> str = make_tl_object<td_api::languagePackString>(key, nullptr);
if (op == "sclsv") { if (op == "sclsv") {
str = make_tl_object<td_api::languagePackStringValue>(key, value); str->value_ = make_tl_object<td_api::languagePackStringValueOrdinary>(value);
} else if (op == "sclsp") { } else if (op == "sclsp") {
str = make_tl_object<td_api::languagePackStringPluralized>(key, value, string("One\0One", 7), "Two", "Few", str->value_ = make_tl_object<td_api::languagePackStringValuePluralized>(value, string("One\0One", 7), "Two",
"Many", "Other"); "Few", "Many", "Other");
} else { } else {
str = make_tl_object<td_api::languagePackStringDeleted>(key); str->value_ = make_tl_object<td_api::languagePackStringValueDeleted>();
} }
send_request(make_tl_object<td_api::setCustomLanguageString>(language_code, std::move(str))); send_request(make_tl_object<td_api::setCustomLanguageString>(language_code, std::move(str)));