2017-04-18 15:21:03 +00:00
/*
This file is part of Telegram Desktop ,
2018-01-03 10:23:14 +00:00
the official desktop application for the Telegram messaging service .
2017-04-18 15:21:03 +00:00
2018-01-03 10:23:14 +00:00
For license and copyright information please follow this link :
https : //github.com/telegramdesktop/tdesktop/blob/master/LEGAL
2017-04-18 15:21:03 +00:00
*/
# include "lang/lang_cloud_manager.h"
# include "lang/lang_instance.h"
# include "mtproto/mtp_instance.h"
# include "storage/localstorage.h"
# include "messenger.h"
# include "apiwrap.h"
# include "auth_session.h"
2017-04-18 17:37:14 +00:00
# include "boxes/confirm_box.h"
2018-10-22 11:13:48 +00:00
# include "ui/wrap/padding_wrap.h"
# include "ui/widgets/labels.h"
2017-05-30 17:58:25 +00:00
# include "lang/lang_file_parser.h"
# include "core/file_utilities.h"
2018-10-22 11:13:48 +00:00
# include "core/click_handler_types.h"
# include "styles/style_boxes.h"
2017-04-18 15:21:03 +00:00
namespace Lang {
2018-10-22 11:13:48 +00:00
namespace {
class ConfirmSwitchBox : public BoxContent {
public :
ConfirmSwitchBox (
QWidget * ,
const MTPDlangPackLanguage & data ,
const QString & editLink ,
Fn < void ( ) > apply ) ;
protected :
void prepare ( ) override ;
private :
QString _name ;
int _percent = 0 ;
QString _editLink ;
Fn < void ( ) > _apply ;
} ;
2018-11-02 13:52:55 +00:00
class NotReadyBox : public BoxContent {
public :
NotReadyBox (
QWidget * ,
const MTPDlangPackLanguage & data ,
const QString & editLink ) ;
protected :
void prepare ( ) override ;
private :
QString _name ;
QString _editLink ;
} ;
2018-10-22 11:13:48 +00:00
ConfirmSwitchBox : : ConfirmSwitchBox (
QWidget * ,
const MTPDlangPackLanguage & data ,
const QString & editLink ,
Fn < void ( ) > apply )
2018-11-02 13:52:55 +00:00
: _name ( qs ( data . vnative_name ) )
2018-10-22 11:13:48 +00:00
, _percent ( data . vtranslated_count . v * 100 / data . vstrings_count . v )
, _editLink ( editLink )
, _apply ( std : : move ( apply ) ) {
}
void ConfirmSwitchBox : : prepare ( ) {
setTitle ( langFactory ( lng_language_switch_title ) ) ;
auto link = TextWithEntities { lang ( lng_language_switch_link ) } ;
link . entities . push_back ( EntityInText (
EntityInTextCustomUrl ,
0 ,
link . text . size ( ) ,
QString ( " internal:go_to_translations " ) ) ) ;
auto name = TextWithEntities { _name } ;
name . entities . push_back ( EntityInText (
EntityInTextBold ,
0 ,
name . text . size ( ) ) ) ;
auto percent = TextWithEntities { QString : : number ( _percent ) } ;
percent . entities . push_back ( EntityInText (
EntityInTextBold ,
0 ,
percent . text . size ( ) ) ) ;
const auto text = lng_language_switch_about__generic (
lt_lang_name ,
name ,
lt_percent ,
percent ,
lt_link ,
link ) ;
auto content = Ui : : CreateChild < Ui : : PaddingWrap < Ui : : FlatLabel > > (
this ,
object_ptr < Ui : : FlatLabel > (
this ,
2018-11-02 13:52:55 +00:00
rpl : : single ( text ) ,
st : : boxLabel ) ,
2018-10-22 11:13:48 +00:00
QMargins { st : : boxPadding . left ( ) , 0 , st : : boxPadding . right ( ) , 0 } ) ;
content - > entity ( ) - > setClickHandlerFilter ( [ = ] ( auto & & . . . ) {
UrlClickHandler : : Open ( _editLink ) ;
return false ;
} ) ;
addButton ( langFactory ( lng_language_switch_apply ) , [ = ] {
const auto apply = _apply ;
closeBox ( ) ;
apply ( ) ;
} ) ;
addButton ( langFactory ( lng_cancel ) , [ = ] { closeBox ( ) ; } ) ;
2018-11-02 13:52:55 +00:00
content - > resizeToWidth ( st : : boxWideWidth ) ;
content - > heightValue (
) | rpl : : start_with_next ( [ = ] ( int height ) {
setDimensions ( st : : boxWideWidth , height ) ;
} , lifetime ( ) ) ;
}
NotReadyBox : : NotReadyBox (
QWidget * ,
const MTPDlangPackLanguage & data ,
const QString & editLink )
: _name ( qs ( data . vnative_name ) )
, _editLink ( editLink ) {
}
void NotReadyBox : : prepare ( ) {
setTitle ( langFactory ( lng_language_not_ready_title ) ) ;
auto link = TextWithEntities { lang ( lng_language_not_ready_link ) } ;
link . entities . push_back ( EntityInText (
EntityInTextCustomUrl ,
0 ,
link . text . size ( ) ,
QString ( " internal:go_to_translations " ) ) ) ;
auto name = TextWithEntities { _name } ;
const auto text = lng_language_not_ready_about__generic (
lt_lang_name ,
name ,
lt_link ,
link ) ;
auto content = Ui : : CreateChild < Ui : : PaddingWrap < Ui : : FlatLabel > > (
this ,
object_ptr < Ui : : FlatLabel > (
this ,
rpl : : single ( text ) ,
st : : boxLabel ) ,
QMargins { st : : boxPadding . left ( ) , 0 , st : : boxPadding . right ( ) , 0 } ) ;
content - > entity ( ) - > setClickHandlerFilter ( [ = ] ( auto & & . . . ) {
UrlClickHandler : : Open ( _editLink ) ;
return false ;
} ) ;
addButton ( langFactory ( lng_box_ok ) , [ = ] { closeBox ( ) ; } ) ;
2018-10-22 11:13:48 +00:00
content - > resizeToWidth ( st : : boxWidth ) ;
content - > heightValue (
) | rpl : : start_with_next ( [ = ] ( int height ) {
setDimensions ( st : : boxWidth , height ) ;
} , lifetime ( ) ) ;
}
} // namespace
2017-04-18 15:21:03 +00:00
2018-10-30 11:23:54 +00:00
Language ParseLanguage ( const MTPLangPackLanguage & data ) {
return data . match ( [ ] ( const MTPDlangPackLanguage & data ) {
return Language {
qs ( data . vlang_code ) ,
qs ( data . vplural_code ) ,
( data . has_base_lang_code ( )
? qs ( data . vbase_lang_code )
: QString ( ) ) ,
qs ( data . vname ) ,
qs ( data . vnative_name )
} ;
} ) ;
}
2018-08-20 12:40:41 +00:00
CloudManager : : CloudManager (
Instance & langpack ,
not_null < MTP : : Instance * > mtproto )
: MTP : : Sender ( )
2017-04-18 15:21:03 +00:00
, _langpack ( langpack ) {
}
2018-10-22 11:13:48 +00:00
Pack CloudManager : : packTypeFromId ( const QString & id ) const {
if ( id = = LanguageIdOrDefault ( _langpack . id ( ) ) ) {
return Pack : : Current ;
} else if ( id = = _langpack . baseId ( ) ) {
return Pack : : Base ;
}
return Pack : : None ;
}
void CloudManager : : requestLangPackDifference ( const QString & langId ) {
Expects ( ! langId . isEmpty ( ) ) ;
if ( langId = = LanguageIdOrDefault ( _langpack . id ( ) ) ) {
requestLangPackDifference ( Pack : : Current ) ;
} else {
requestLangPackDifference ( Pack : : Base ) ;
}
}
mtpRequestId & CloudManager : : packRequestId ( Pack pack ) {
return ( pack ! = Pack : : Base )
? _langPackRequestId
: _langPackBaseRequestId ;
}
mtpRequestId CloudManager : : packRequestId ( Pack pack ) const {
return ( pack ! = Pack : : Base )
? _langPackRequestId
: _langPackBaseRequestId ;
}
void CloudManager : : requestLangPackDifference ( Pack pack ) {
const auto base = ( pack = = Pack : : Base ) ;
request ( base : : take ( packRequestId ( pack ) ) ) . cancel ( ) ;
2017-07-26 12:50:39 +00:00
if ( _langpack . isCustom ( ) ) {
2017-04-18 15:21:03 +00:00
return ;
}
2018-10-22 11:13:48 +00:00
const auto version = _langpack . version ( pack ) ;
const auto code = _langpack . cloudLangCode ( pack ) ;
if ( code . isEmpty ( ) ) {
return ;
}
2017-04-18 15:21:03 +00:00
if ( version > 0 ) {
2018-10-22 11:13:48 +00:00
packRequestId ( pack ) = request ( MTPlangpack_GetDifference (
MTP_string ( code ) ,
2018-08-20 11:31:40 +00:00
MTP_int ( version )
) ) . done ( [ = ] ( const MTPLangPackDifference & result ) {
2018-10-22 11:13:48 +00:00
packRequestId ( pack ) = 0 ;
2017-04-18 15:21:03 +00:00
applyLangPackDifference ( result ) ;
2018-08-20 11:31:40 +00:00
} ) . fail ( [ = ] ( const RPCError & error ) {
2018-10-22 11:13:48 +00:00
packRequestId ( pack ) = 0 ;
2017-04-18 15:21:03 +00:00
} ) . send ( ) ;
} else {
2018-10-22 11:13:48 +00:00
packRequestId ( pack ) = request ( MTPlangpack_GetLangPack (
2018-08-20 11:31:40 +00:00
MTP_string ( CloudLangPackName ( ) ) ,
2018-10-22 11:13:48 +00:00
MTP_string ( code )
2018-08-20 11:31:40 +00:00
) ) . done ( [ = ] ( const MTPLangPackDifference & result ) {
2018-10-22 11:13:48 +00:00
packRequestId ( pack ) = 0 ;
2017-04-18 15:21:03 +00:00
applyLangPackDifference ( result ) ;
2018-08-20 11:31:40 +00:00
} ) . fail ( [ = ] ( const RPCError & error ) {
2018-10-22 11:13:48 +00:00
packRequestId ( pack ) = 0 ;
2017-04-18 15:21:03 +00:00
} ) . send ( ) ;
}
}
2017-05-30 09:31:32 +00:00
void CloudManager : : setSuggestedLanguage ( const QString & langCode ) {
2018-10-22 11:13:48 +00:00
if ( Lang : : LanguageIdOrDefault ( langCode ) ! = Lang : : DefaultLanguageId ( ) ) {
2017-05-30 09:31:32 +00:00
_suggestedLanguage = langCode ;
} else {
_suggestedLanguage = QString ( ) ;
}
if ( ! _languageWasSuggested ) {
_languageWasSuggested = true ;
_firstLanguageSuggestion . notify ( ) ;
2017-05-30 13:54:05 +00:00
if ( AuthSession : : Exists ( ) & & _langpack . id ( ) . isEmpty ( ) & & ! _suggestedLanguage . isEmpty ( ) ) {
2017-06-04 13:09:53 +00:00
auto isLegacy = [ ] ( const QString & languageId ) {
for ( auto & legacyString : kLegacyLanguages ) {
auto legacyId = str_const_toString ( legacyString ) ;
if ( ConvertLegacyLanguageId ( legacyId ) = = languageId ) {
return true ;
}
}
return false ;
} ;
// The old available languages (de/it/nl/ko/es/pt_BR) won't be
// suggested anyway, because everyone saw the suggestion in intro.
if ( ! isLegacy ( _suggestedLanguage ) ) {
_offerSwitchToId = _suggestedLanguage ;
offerSwitchLangPack ( ) ;
}
2017-05-30 09:31:32 +00:00
}
}
}
2018-11-06 11:29:01 +00:00
void CloudManager : : setCurrentVersions ( int version , int baseVersion ) {
const auto check = [ & ] ( Pack pack , int version ) {
if ( version > _langpack . version ( pack ) & & ! packRequestId ( pack ) ) {
requestLangPackDifference ( pack ) ;
}
} ;
check ( Pack : : Current , version ) ;
check ( Pack : : Base , baseVersion ) ;
}
2018-10-22 11:13:48 +00:00
void CloudManager : : applyLangPackDifference (
const MTPLangPackDifference & difference ) {
2017-04-18 15:21:03 +00:00
Expects ( difference . type ( ) = = mtpc_langPackDifference ) ;
2018-10-22 11:13:48 +00:00
2017-04-18 17:37:14 +00:00
if ( _langpack . isCustom ( ) ) {
2017-04-18 15:21:03 +00:00
return ;
}
2018-10-22 11:13:48 +00:00
const auto & langpack = difference . c_langPackDifference ( ) ;
const auto langpackId = qs ( langpack . vlang_code ) ;
const auto pack = packTypeFromId ( langpackId ) ;
if ( pack ! = Pack : : None ) {
applyLangPackData ( pack , langpack ) ;
2017-05-30 17:58:25 +00:00
if ( _restartAfterSwitch ) {
2018-10-22 11:13:48 +00:00
restartAfterSwitch ( ) ;
2017-05-30 17:58:25 +00:00
}
2017-04-18 15:21:03 +00:00
} else {
2018-10-22 11:13:48 +00:00
LOG ( ( " Lang Warning: "
" Ignoring update for '%1' because our language is '%2' "
) . arg ( langpackId
) . arg ( _langpack . id ( ) ) ) ;
2017-04-18 15:21:03 +00:00
}
}
void CloudManager : : requestLanguageList ( ) {
2018-08-20 11:31:40 +00:00
_languagesRequestId = request ( MTPlangpack_GetLanguages (
MTP_string ( CloudLangPackName ( ) )
) ) . done ( [ = ] ( const MTPVector < MTPLangPackLanguage > & result ) {
2017-04-18 15:21:03 +00:00
auto languages = Languages ( ) ;
2018-10-30 11:23:54 +00:00
for ( const auto & language : result . v ) {
languages . push_back ( ParseLanguage ( language ) ) ;
2017-04-18 15:21:03 +00:00
}
if ( _languages ! = languages ) {
_languages = languages ;
_languagesChanged . notify ( ) ;
}
_languagesRequestId = 0 ;
2018-08-20 11:31:40 +00:00
} ) . fail ( [ = ] ( const RPCError & error ) {
2017-04-18 15:21:03 +00:00
_languagesRequestId = 0 ;
} ) . send ( ) ;
}
2017-04-18 17:37:14 +00:00
void CloudManager : : offerSwitchLangPack ( ) {
Expects ( ! _offerSwitchToId . isEmpty ( ) ) ;
Expects ( _offerSwitchToId ! = DefaultLanguageId ( ) ) ;
if ( ! showOfferSwitchBox ( ) ) {
subscribe ( languageListChanged ( ) , [ this ] {
showOfferSwitchBox ( ) ;
} ) ;
requestLanguageList ( ) ;
}
}
QString CloudManager : : findOfferedLanguageName ( ) {
2018-10-22 11:13:48 +00:00
for ( const auto & language : _languages ) {
2017-04-18 17:37:14 +00:00
if ( language . id = = _offerSwitchToId ) {
return language . name ;
}
}
return QString ( ) ;
}
bool CloudManager : : showOfferSwitchBox ( ) {
auto name = findOfferedLanguageName ( ) ;
if ( name . isEmpty ( ) ) {
return false ;
}
Ui : : show ( Box < ConfirmBox > ( " Do you want to switch your language to " + name + " ? You can always change your language in Settings. " , " Change " , lang ( lng_cancel ) , [ this ] {
Ui : : hideLayer ( ) ;
if ( _offerSwitchToId . isEmpty ( ) ) {
return ;
}
2017-05-30 17:58:25 +00:00
performSwitchAndRestart ( _offerSwitchToId ) ;
2017-04-18 17:37:14 +00:00
} , [ this ] {
Ui : : hideLayer ( ) ;
changeIdAndReInitConnection ( DefaultLanguageId ( ) ) ;
Local : : writeLangPack ( ) ;
2017-09-15 17:34:41 +00:00
} ) , LayerOption : : KeepOther ) ;
2017-04-18 17:37:14 +00:00
return true ;
}
2018-10-22 11:13:48 +00:00
void CloudManager : : applyLangPackData (
Pack pack ,
const MTPDlangPackDifference & data ) {
if ( _langpack . version ( pack ) < data . vfrom_version . v ) {
requestLangPackDifference ( pack ) ;
2017-04-18 17:37:14 +00:00
} else if ( ! data . vstrings . v . isEmpty ( ) ) {
2018-10-22 11:13:48 +00:00
_langpack . applyDifference ( pack , data ) ;
2017-04-18 17:37:14 +00:00
Local : : writeLangPack ( ) ;
2018-10-26 09:08:21 +00:00
} else if ( _restartAfterSwitch ) {
Local : : writeLangPack ( ) ;
2017-04-18 17:37:14 +00:00
} else {
LOG ( ( " Lang Info: Up to date. " ) ) ;
}
}
2017-05-30 17:58:25 +00:00
bool CloudManager : : canApplyWithoutRestart ( const QString & id ) const {
2018-10-26 09:08:21 +00:00
if ( id = = qstr ( " #TEST_X " ) | | id = = qstr ( " #TEST_0 " ) ) {
2017-05-30 17:58:25 +00:00
return true ;
}
// We don't support instant language switch if the auth session exists :(
return ! AuthSession : : Exists ( ) ;
}
void CloudManager : : resetToDefault ( ) {
performSwitch ( DefaultLanguageId ( ) ) ;
}
2018-10-22 11:13:48 +00:00
void CloudManager : : switchWithWarning ( const QString & id ) {
Expects ( ! id . isEmpty ( ) ) ;
if ( LanguageIdOrDefault ( _langpack . id ( ) ) = = id ) {
2018-11-02 13:52:55 +00:00
Ui : : show ( Box < InformBox > ( lang ( lng_language_already ) ) ) ;
2018-10-22 11:13:48 +00:00
return ;
2017-05-30 17:58:25 +00:00
}
2018-10-22 11:13:48 +00:00
request ( _switchingToLanguageRequest ) . cancel ( ) ;
_switchingToLanguageRequest = request ( MTPlangpack_GetLanguage (
MTP_string ( Lang : : CloudLangPackName ( ) ) ,
MTP_string ( id )
) ) . done ( [ = ] ( const MTPLangPackLanguage & result ) {
_switchingToLanguageRequest = 0 ;
result . match ( [ = ] ( const MTPDlangPackLanguage & data ) {
2018-11-02 13:52:55 +00:00
const auto link = " https://translations.telegram.org/ "
+ id
+ ' / ' ;
2018-11-09 07:21:25 +00:00
if ( data . vstrings_count . v > 0 ) {
2018-10-22 11:13:48 +00:00
const auto pluralId = qs ( data . vplural_code ) ;
const auto baseId = qs ( data . vbase_lang_code ) ;
const auto perform = [ = ] {
2018-10-30 11:23:54 +00:00
Local : : pushRecentLanguage ( ParseLanguage ( result ) ) ;
2018-10-22 11:13:48 +00:00
performSwitchAndRestart ( id , pluralId , baseId ) ;
} ;
2018-11-02 13:52:55 +00:00
Ui : : show ( Box < ConfirmSwitchBox > ( data , link , perform ) ) ;
2018-10-22 11:13:48 +00:00
} else {
2018-11-02 13:52:55 +00:00
Ui : : show ( Box < NotReadyBox > ( data , link ) ) ;
2018-10-22 11:13:48 +00:00
}
} ) ;
} ) . fail ( [ = ] ( const RPCError & error ) {
_switchingToLanguageRequest = 0 ;
2018-11-02 13:52:55 +00:00
if ( error . type ( ) = = " LANG_CODE_NOT_SUPPORTED " ) {
Ui : : show ( Box < InformBox > ( lang ( lng_language_not_found ) ) ) ;
}
2018-10-22 11:13:48 +00:00
} ) . send ( ) ;
}
void CloudManager : : switchToLanguage (
const QString & id ,
const QString & pluralId ,
const QString & baseId ) {
const auto requested = LanguageIdOrDefault ( id ) ;
if ( _langpack . id ( ) = = requested & & requested ! = qstr ( " #custom " ) ) {
2017-05-30 17:58:25 +00:00
return ;
}
request ( _switchingToLanguageRequest ) . cancel ( ) ;
2018-10-22 11:13:48 +00:00
if ( requested = = qstr ( " #custom " ) ) {
2017-05-30 17:58:25 +00:00
performSwitchToCustom ( ) ;
2018-10-22 11:13:48 +00:00
} else if ( canApplyWithoutRestart ( requested ) ) {
performSwitch ( requested , pluralId , baseId ) ;
2017-05-30 17:58:25 +00:00
} else {
QVector < MTPstring > keys ;
keys . reserve ( 3 ) ;
keys . push_back ( MTP_string ( " lng_sure_save_language " ) ) ;
2018-08-20 11:31:40 +00:00
_switchingToLanguageRequest = request ( MTPlangpack_GetStrings (
MTP_string ( Lang : : CloudLangPackName ( ) ) ,
2018-10-22 11:13:48 +00:00
MTP_string ( requested ) ,
2018-08-20 11:31:40 +00:00
MTP_vector < MTPstring > ( std : : move ( keys ) )
) ) . done ( [ = ] ( const MTPVector < MTPLangPackString > & result ) {
2018-10-22 11:13:48 +00:00
_switchingToLanguageRequest = 0 ;
2018-09-21 07:21:52 +00:00
const auto values = Instance : : ParseStrings ( result ) ;
const auto getValue = [ & ] ( LangKey key ) {
2017-05-30 17:58:25 +00:00
auto it = values . find ( key ) ;
2018-08-20 11:31:40 +00:00
return ( it = = values . cend ( ) )
? GetOriginalValue ( key )
: it - > second ;
2017-05-30 17:58:25 +00:00
} ;
2018-09-21 07:21:52 +00:00
const auto text = lang ( lng_sure_save_language )
+ " \n \n "
+ getValue ( lng_sure_save_language ) ;
2018-10-22 11:13:48 +00:00
const auto perform = [ = ] {
performSwitchAndRestart ( requested , pluralId , baseId ) ;
} ;
2018-09-21 07:21:52 +00:00
Ui : : show (
Box < ConfirmBox > (
text ,
lang ( lng_box_ok ) ,
lang ( lng_cancel ) ,
2018-10-22 11:13:48 +00:00
perform ) ,
2018-09-21 07:21:52 +00:00
LayerOption : : KeepOther ) ;
2018-10-22 11:13:48 +00:00
} ) . fail ( [ = ] ( const RPCError & error ) {
_switchingToLanguageRequest = 0 ;
2017-05-30 17:58:25 +00:00
} ) . send ( ) ;
}
}
void CloudManager : : performSwitchToCustom ( ) {
auto filter = qsl ( " Language files (*.strings) " ) ;
auto title = qsl ( " Choose language .strings file " ) ;
2018-04-17 15:19:34 +00:00
FileDialog : : GetOpenPath ( Messenger : : Instance ( ) . getFileDialogParent ( ) , title , filter , [ weak = base : : make_weak ( this ) ] ( const FileDialog : : OpenResult & result ) {
2017-05-30 17:58:25 +00:00
if ( ! weak | | result . paths . isEmpty ( ) ) {
return ;
}
auto filePath = result . paths . front ( ) ;
2018-09-21 07:21:52 +00:00
Lang : : FileParser loader ( filePath , { lng_sure_save_language } ) ;
2017-05-30 17:58:25 +00:00
if ( loader . errors ( ) . isEmpty ( ) ) {
weak - > request ( weak - > _switchingToLanguageRequest ) . cancel ( ) ;
2018-10-26 09:08:21 +00:00
if ( weak - > canApplyWithoutRestart ( qsl ( " #custom " ) ) ) {
2017-05-30 17:58:25 +00:00
weak - > _langpack . switchToCustomFile ( filePath ) ;
} else {
2018-09-21 07:21:52 +00:00
const auto values = loader . found ( ) ;
const auto getValue = [ & ] ( LangKey key ) {
const auto it = values . find ( key ) ;
return ( it = = values . cend ( ) )
? GetOriginalValue ( key )
: it . value ( ) ;
2017-05-30 17:58:25 +00:00
} ;
2018-09-21 07:21:52 +00:00
const auto text = lang ( lng_sure_save_language )
+ " \n \n "
+ getValue ( lng_sure_save_language ) ;
const auto change = [ = ] {
2017-05-30 17:58:25 +00:00
weak - > _langpack . switchToCustomFile ( filePath ) ;
App : : restart ( ) ;
2018-09-21 07:21:52 +00:00
} ;
Ui : : show (
Box < ConfirmBox > (
text ,
lang ( lng_box_ok ) ,
lang ( lng_cancel ) ,
change ) ,
LayerOption : : KeepOther ) ;
2017-05-30 17:58:25 +00:00
}
} else {
2017-09-15 17:34:41 +00:00
Ui : : show (
Box < InformBox > ( " Custom lang failed :( \n \n Error: " + loader . errors ( ) ) ,
LayerOption : : KeepOther ) ;
2017-05-30 17:58:25 +00:00
}
} ) ;
}
void CloudManager : : switchToTestLanguage ( ) {
2018-10-26 09:08:21 +00:00
const auto testLanguageId = ( _langpack . id ( ) = = qstr ( " #TEST_X " ) )
? qsl ( " #TEST_0 " )
: qsl ( " #TEST_X " ) ;
2017-05-30 17:58:25 +00:00
performSwitch ( testLanguageId ) ;
}
2018-10-22 11:13:48 +00:00
void CloudManager : : performSwitch (
const QString & id ,
const QString & pluralId ,
const QString & baseId ) {
2017-05-30 17:58:25 +00:00
_restartAfterSwitch = false ;
2018-10-22 11:13:48 +00:00
switchLangPackId ( id , pluralId , baseId ) ;
requestLangPackDifference ( Pack : : Current ) ;
requestLangPackDifference ( Pack : : Base ) ;
}
void CloudManager : : performSwitchAndRestart (
const QString & id ,
const QString & pluralId ,
const QString & baseId ) {
performSwitch ( id , pluralId , baseId ) ;
restartAfterSwitch ( ) ;
2017-04-18 15:21:03 +00:00
}
2018-10-22 11:13:48 +00:00
void CloudManager : : restartAfterSwitch ( ) {
if ( _langPackRequestId | | _langPackBaseRequestId ) {
2017-05-30 17:58:25 +00:00
_restartAfterSwitch = true ;
} else {
App : : restart ( ) ;
}
}
2018-10-22 11:13:48 +00:00
void CloudManager : : switchLangPackId (
const QString & id ,
const QString & pluralId ,
const QString & baseId ) {
const auto currentId = _langpack . id ( ) ;
const auto currentBaseId = _langpack . baseId ( ) ;
const auto notChanged = ( currentId = = id & & currentBaseId = = baseId )
| | ( currentId . isEmpty ( )
& & currentBaseId . isEmpty ( )
& & id = = DefaultLanguageId ( ) ) ;
2017-04-18 17:37:14 +00:00
if ( ! notChanged ) {
2018-10-22 11:13:48 +00:00
changeIdAndReInitConnection ( id , pluralId , baseId ) ;
2017-04-18 15:21:03 +00:00
}
}
2018-10-22 11:13:48 +00:00
void CloudManager : : changeIdAndReInitConnection (
const QString & id ,
const QString & pluralId ,
const QString & baseId ) {
_langpack . switchToId ( id , pluralId , baseId ) ;
2017-04-18 17:37:14 +00:00
auto mtproto = requestMTP ( ) ;
mtproto - > reInitConnection ( mtproto - > mainDcId ( ) ) ;
}
2017-04-18 15:21:03 +00:00
CloudManager & CurrentCloudManager ( ) {
auto result = Messenger : : Instance ( ) . langCloudManager ( ) ;
2017-08-17 09:06:26 +00:00
Assert ( result ! = nullptr ) ;
2017-04-18 15:21:03 +00:00
return * result ;
}
} // namespace Lang