add mobile switch language
This commit is contained in:
parent
93e79b5234
commit
5658ce807e
@ -39,7 +39,7 @@ class App extends StatelessWidget {
|
|||||||
primarySwatch: Colors.blue,
|
primarySwatch: Colors.blue,
|
||||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||||
),
|
),
|
||||||
home: !isAndroid ? WebHomePage() : HomePage(),
|
home: !isAndroid ? WebHomePage() : HomePage(key: homeKey),
|
||||||
navigatorObservers: [
|
navigatorObservers: [
|
||||||
FirebaseAnalyticsObserver(analytics: analytics),
|
FirebaseAnalyticsObserver(analytics: analytics),
|
||||||
FlutterSmartDialog.observer
|
FlutterSmartDialog.observer
|
||||||
|
@ -6,8 +6,6 @@ import 'package:provider/provider.dart';
|
|||||||
import '../models/model.dart';
|
import '../models/model.dart';
|
||||||
import 'home_page.dart';
|
import 'home_page.dart';
|
||||||
|
|
||||||
ChatPage chatPage = ChatPage();
|
|
||||||
|
|
||||||
class ChatPage extends StatelessWidget implements PageShape {
|
class ChatPage extends StatelessWidget implements PageShape {
|
||||||
@override
|
@override
|
||||||
final title = translate("Chat");
|
final title = translate("Chat");
|
||||||
|
@ -12,6 +12,8 @@ abstract class PageShape extends Widget {
|
|||||||
final List<Widget> appBarActions = [];
|
final List<Widget> appBarActions = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final homeKey = GlobalKey<_HomePageState>();
|
||||||
|
|
||||||
class HomePage extends StatefulWidget {
|
class HomePage extends StatefulWidget {
|
||||||
HomePage({Key? key}) : super(key: key);
|
HomePage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
@ -23,12 +25,23 @@ class _HomePageState extends State<HomePage> {
|
|||||||
var _selectedIndex = 0;
|
var _selectedIndex = 0;
|
||||||
final List<PageShape> _pages = [];
|
final List<PageShape> _pages = [];
|
||||||
|
|
||||||
|
void refreshPages() {
|
||||||
|
setState(() {
|
||||||
|
initPages();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
initPages();
|
||||||
|
}
|
||||||
|
|
||||||
|
void initPages() {
|
||||||
|
_pages.clear();
|
||||||
_pages.add(ConnectionPage());
|
_pages.add(ConnectionPage());
|
||||||
if (isAndroid) {
|
if (isAndroid) {
|
||||||
_pages.addAll([chatPage, ServerPage()]);
|
_pages.addAll([ChatPage(), ServerPage()]);
|
||||||
}
|
}
|
||||||
_pages.add(SettingsPage());
|
_pages.add(SettingsPage());
|
||||||
}
|
}
|
||||||
|
@ -146,6 +146,12 @@ class _SettingsState extends State<SettingsPage> with WidgetsBindingObserver {
|
|||||||
leading: Icon(Icons.cloud),
|
leading: Icon(Icons.cloud),
|
||||||
onPressed: (context) {
|
onPressed: (context) {
|
||||||
showServerSettings();
|
showServerSettings();
|
||||||
|
}),
|
||||||
|
SettingsTile.navigation(
|
||||||
|
title: Text(translate('Language')),
|
||||||
|
leading: Icon(Icons.translate),
|
||||||
|
onPressed: (context) {
|
||||||
|
showLanguageSettings();
|
||||||
})
|
})
|
||||||
]),
|
]),
|
||||||
SettingsSection(
|
SettingsSection(
|
||||||
@ -185,6 +191,42 @@ void showServerSettings() {
|
|||||||
showServerSettingsWithValue(id, relay, key, api);
|
showServerSettingsWithValue(id, relay, key, api);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void showLanguageSettings() {
|
||||||
|
try {
|
||||||
|
final langs = json.decode(FFI.getByName('langs')) as List<dynamic>;
|
||||||
|
var lang = FFI.getByName('local_option', 'lang');
|
||||||
|
DialogManager.show((setState, close) {
|
||||||
|
final setLang = (v) {
|
||||||
|
if (lang != v) {
|
||||||
|
setState(() {
|
||||||
|
lang = v;
|
||||||
|
});
|
||||||
|
final msg = Map()
|
||||||
|
..['name'] = 'lang'
|
||||||
|
..['value'] = v;
|
||||||
|
FFI.setByName('local_option', json.encode(msg));
|
||||||
|
homeKey.currentState?.refreshPages();
|
||||||
|
Future.delayed(Duration(milliseconds: 200), close);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return CustomAlertDialog(
|
||||||
|
title: SizedBox.shrink(),
|
||||||
|
content: Column(
|
||||||
|
children: [
|
||||||
|
getRadio('Default', '', lang, setLang),
|
||||||
|
Divider(color: MyTheme.border),
|
||||||
|
] +
|
||||||
|
langs.map((e) {
|
||||||
|
final key = e[0] as String;
|
||||||
|
final name = e[1] as String;
|
||||||
|
return getRadio(name, key, lang, setLang);
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
actions: []);
|
||||||
|
}, backDismiss: true, clickMaskDismiss: true);
|
||||||
|
} catch (_e) {}
|
||||||
|
}
|
||||||
|
|
||||||
void showAbout() {
|
void showAbout() {
|
||||||
DialogManager.show((setState, close) {
|
DialogManager.show((setState, close) {
|
||||||
return CustomAlertDialog(
|
return CustomAlertDialog(
|
||||||
|
@ -27,7 +27,7 @@ class DraggableChatWindow extends StatelessWidget {
|
|||||||
height: height,
|
height: height,
|
||||||
builder: (_, onPanUpdate) {
|
builder: (_, onPanUpdate) {
|
||||||
return isIOS
|
return isIOS
|
||||||
? chatPage
|
? ChatPage()
|
||||||
: Scaffold(
|
: Scaffold(
|
||||||
resizeToAvoidBottomInset: false,
|
resizeToAvoidBottomInset: false,
|
||||||
appBar: CustomAppBar(
|
appBar: CustomAppBar(
|
||||||
@ -68,7 +68,7 @@ class DraggableChatWindow extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: chatPage,
|
body: ChatPage(),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -113,6 +113,14 @@ unsafe extern "C" fn get_by_name(name: *const c_char, arg: *const c_char) -> *co
|
|||||||
res = Session::get_option(arg);
|
res = Session::get_option(arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"local_option" => {
|
||||||
|
if let Ok(arg) = arg.to_str() {
|
||||||
|
res = LocalConfig::get_option(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"langs" => {
|
||||||
|
res = crate::lang::LANGS.to_string();
|
||||||
|
}
|
||||||
// File Action
|
// File Action
|
||||||
"get_home_dir" => {
|
"get_home_dir" => {
|
||||||
res = fs::get_home_as_string();
|
res = fs::get_home_as_string();
|
||||||
@ -311,6 +319,15 @@ unsafe extern "C" fn set_by_name(name: *const c_char, value: *const c_char) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
"local_option" => {
|
||||||
|
if let Ok(m) = serde_json::from_str::<HashMap<String, String>>(value) {
|
||||||
|
if let Some(name) = m.get("name") {
|
||||||
|
if let Some(value) = m.get("value") {
|
||||||
|
LocalConfig::set_option(name.to_owned(), value.to_owned());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
"input_os_password" => {
|
"input_os_password" => {
|
||||||
Session::input_os_password(value.to_owned(), true);
|
Session::input_os_password(value.to_owned(), true);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user