Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de9c5ba9cc | ||
|
|
2aae00cf68 | ||
|
|
68be2d34a1 | ||
|
|
7895ccf720 | ||
|
|
e92900dbbd | ||
|
|
eada271c49 |
1
.github/workflows/build.yaml
vendored
1
.github/workflows/build.yaml
vendored
@@ -67,7 +67,6 @@ jobs:
|
|||||||
- name: Setup Flutter
|
- name: Setup Flutter
|
||||||
uses: subosito/flutter-action@v2
|
uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
flutter-version: 3.24.5
|
|
||||||
channel: stable
|
channel: stable
|
||||||
cache: true
|
cache: true
|
||||||
|
|
||||||
|
|||||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,3 +1,27 @@
|
|||||||
|
## v0.8.79
|
||||||
|
|
||||||
|
- Fix tab delay view issues
|
||||||
|
|
||||||
|
- Fix tray action issues
|
||||||
|
|
||||||
|
- Fix get profile redirect client ua issues
|
||||||
|
|
||||||
|
- Fix proxy card delay view issues
|
||||||
|
|
||||||
|
- Add Russian, Japanese adaptation
|
||||||
|
|
||||||
|
- Fix some issues
|
||||||
|
|
||||||
|
- Update changelog
|
||||||
|
|
||||||
|
## v0.8.78
|
||||||
|
|
||||||
|
- Fix list form input view issues
|
||||||
|
|
||||||
|
- Fix traffic view issues
|
||||||
|
|
||||||
|
- Update changelog
|
||||||
|
|
||||||
## v0.8.77
|
## v0.8.77
|
||||||
|
|
||||||
- Optimize performance
|
- Optimize performance
|
||||||
|
|||||||
Binary file not shown.
@@ -28,6 +28,14 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func splitByComma(s string) interface{} {
|
||||||
|
parts := strings.Split(s, ",")
|
||||||
|
if len(parts) > 1 {
|
||||||
|
return parts
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
isRunning = false
|
isRunning = false
|
||||||
runLock sync.Mutex
|
runLock sync.Mutex
|
||||||
@@ -162,7 +170,17 @@ func decorationConfig(profileId string, cfg config.RawConfig) *config.RawConfig
|
|||||||
|
|
||||||
func genHosts(hosts, patchHosts map[string]any) {
|
func genHosts(hosts, patchHosts map[string]any) {
|
||||||
for k, v := range patchHosts {
|
for k, v := range patchHosts {
|
||||||
hosts[k] = v
|
if str, ok := v.(string); ok {
|
||||||
|
hosts[k] = splitByComma(str)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func modPatchDns(dns *config.RawDNS) {
|
||||||
|
for pair := dns.NameServerPolicy.Oldest(); pair != nil; pair = pair.Next() {
|
||||||
|
if str, ok := pair.Value.(string); ok {
|
||||||
|
dns.NameServerPolicy.Set(pair.Key, splitByComma(str))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,6 +246,7 @@ func overwriteConfig(targetConfig *config.RawConfig, patchConfig config.RawConfi
|
|||||||
}
|
}
|
||||||
genHosts(targetConfig.Hosts, patchConfig.Hosts)
|
genHosts(targetConfig.Hosts, patchConfig.Hosts)
|
||||||
if configParams.OverrideDns {
|
if configParams.OverrideDns {
|
||||||
|
modPatchDns(&patchConfig.DNS)
|
||||||
targetConfig.DNS = patchConfig.DNS
|
targetConfig.DNS = patchConfig.DNS
|
||||||
} else {
|
} else {
|
||||||
if targetConfig.DNS.Enable == false {
|
if targetConfig.DNS.Enable == false {
|
||||||
|
|||||||
@@ -62,15 +62,15 @@ class ApplicationState extends ConsumerState<Application> {
|
|||||||
_autoUpdateProfilesTask();
|
_autoUpdateProfilesTask();
|
||||||
globalState.appController = AppController(context, ref);
|
globalState.appController = AppController(context, ref);
|
||||||
globalState.measure = Measure.of(context);
|
globalState.measure = Measure.of(context);
|
||||||
ref.listenManual(themeSettingProvider.select((state) => state.fontFamily),
|
// ref.listenManual(themeSettingProvider.select((state) => state.fontFamily),
|
||||||
(prev, next) {
|
// (prev, next) {
|
||||||
if (prev != next) {
|
// if (prev != next) {
|
||||||
globalState.measure = Measure.of(
|
// globalState.measure = Measure.of(
|
||||||
context,
|
// context,
|
||||||
fontFamily: next.value,
|
// fontFamily: next.value,
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
}, fireImmediately: true);
|
// }, fireImmediately: true);
|
||||||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
|
||||||
final currentContext = globalState.navigatorKey.currentContext;
|
final currentContext = globalState.navigatorKey.currentContext;
|
||||||
if (currentContext != null) {
|
if (currentContext != null) {
|
||||||
@@ -194,7 +194,6 @@ class ApplicationState extends ConsumerState<Application> {
|
|||||||
themeMode: themeProps.themeMode,
|
themeMode: themeProps.themeMode,
|
||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
fontFamily: themeProps.fontFamily.value,
|
|
||||||
pageTransitionsTheme: _pageTransitionsTheme,
|
pageTransitionsTheme: _pageTransitionsTheme,
|
||||||
colorScheme: _getAppColorScheme(
|
colorScheme: _getAppColorScheme(
|
||||||
brightness: Brightness.light,
|
brightness: Brightness.light,
|
||||||
@@ -204,13 +203,12 @@ class ApplicationState extends ConsumerState<Application> {
|
|||||||
),
|
),
|
||||||
darkTheme: ThemeData(
|
darkTheme: ThemeData(
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
fontFamily: themeProps.fontFamily.value,
|
|
||||||
pageTransitionsTheme: _pageTransitionsTheme,
|
pageTransitionsTheme: _pageTransitionsTheme,
|
||||||
colorScheme: _getAppColorScheme(
|
colorScheme: _getAppColorScheme(
|
||||||
brightness: Brightness.dark,
|
brightness: Brightness.dark,
|
||||||
systemColorSchemes: systemColorSchemes,
|
systemColorSchemes: systemColorSchemes,
|
||||||
primaryColor: themeProps.primaryColor,
|
primaryColor: themeProps.primaryColor,
|
||||||
).toPrueBlack(themeProps.prueBlack),
|
).toPureBlack(themeProps.pureBlack),
|
||||||
),
|
),
|
||||||
home: child,
|
home: child,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -235,12 +235,12 @@ class ClashCore {
|
|||||||
return int.parse(value);
|
return int.parse(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<ClashConfig?> getProfile(String id) async {
|
Future<ClashConfigSnippet?> getProfile(String id) async {
|
||||||
final res = await clashInterface.getProfile(id);
|
final res = await clashInterface.getProfile(id);
|
||||||
if (res.isEmpty) {
|
if (res.isEmpty) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return ClashConfig.fromJson(json.decode(res));
|
return ClashConfigSnippet.fromJson(json.decode(res));
|
||||||
}
|
}
|
||||||
|
|
||||||
resetTraffic() {
|
resetTraffic() {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
extension ColorExtension on Color {
|
extension ColorExtension on Color {
|
||||||
|
|
||||||
Color get toLight {
|
Color get toLight {
|
||||||
return withOpacity(0.8);
|
return withOpacity(0.8);
|
||||||
}
|
}
|
||||||
@@ -51,7 +50,7 @@ extension ColorExtension on Color {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension ColorSchemeExtension on ColorScheme {
|
extension ColorSchemeExtension on ColorScheme {
|
||||||
ColorScheme toPrueBlack(bool isPrueBlack) => isPrueBlack
|
ColorScheme toPureBlack(bool isPrueBlack) => isPrueBlack
|
||||||
? copyWith(
|
? copyWith(
|
||||||
surface: Colors.black,
|
surface: Colors.black,
|
||||||
surfaceContainer: surfaceContainer.darken(
|
surfaceContainer: surfaceContainer.darken(
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
|
import 'package:fl_clash/state.dart';
|
||||||
import '../state.dart';
|
|
||||||
|
|
||||||
class FlClashHttpOverrides extends HttpOverrides {
|
class FlClashHttpOverrides extends HttpOverrides {
|
||||||
|
static String handleFindProxy(Uri url) {
|
||||||
|
if ([localhost].contains(url.host)) {
|
||||||
|
return "DIRECT";
|
||||||
|
}
|
||||||
|
final port = globalState.config.patchClashConfig.mixedPort;
|
||||||
|
final isStart = globalState.appState.runTime != null;
|
||||||
|
commonPrint.log("find $url proxy:$isStart");
|
||||||
|
if (!isStart) return "DIRECT";
|
||||||
|
return "PROXY localhost:$port";
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
HttpClient createHttpClient(SecurityContext? context) {
|
HttpClient createHttpClient(SecurityContext? context) {
|
||||||
final client = super.createHttpClient(context);
|
final client = super.createHttpClient(context);
|
||||||
client.badCertificateCallback = (_, __, ___) => true;
|
client.findProxy = handleFindProxy;
|
||||||
client.findProxy = (url) {
|
|
||||||
if ([localhost].contains(url.host)) {
|
|
||||||
return "DIRECT";
|
|
||||||
}
|
|
||||||
final port = globalState.config.patchClashConfig.mixedPort;
|
|
||||||
final isStart = globalState.appState.runTime != null;
|
|
||||||
commonPrint.log("find $url proxy:$isStart");
|
|
||||||
if (!isStart) return "DIRECT";
|
|
||||||
return "PROXY localhost:$port";
|
|
||||||
};
|
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ class Navigation {
|
|||||||
const NavigationItem(
|
const NavigationItem(
|
||||||
icon: Icon(Icons.space_dashboard),
|
icon: Icon(Icons.space_dashboard),
|
||||||
label: PageLabel.dashboard,
|
label: PageLabel.dashboard,
|
||||||
|
keep: false,
|
||||||
fragment: DashboardFragment(
|
fragment: DashboardFragment(
|
||||||
key: GlobalObjectKey(PageLabel.dashboard),
|
key: GlobalObjectKey(PageLabel.dashboard),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class Render {
|
|||||||
debouncer.call(
|
debouncer.call(
|
||||||
DebounceTag.renderPause,
|
DebounceTag.renderPause,
|
||||||
_pause,
|
_pause,
|
||||||
duration: Duration(seconds: 15),
|
duration: Duration(seconds: 5),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import 'dart:io';
|
|||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
|
import 'package:dio/io.dart';
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:fl_clash/models/models.dart';
|
import 'package:fl_clash/models/models.dart';
|
||||||
import 'package:fl_clash/state.dart';
|
import 'package:fl_clash/state.dart';
|
||||||
@@ -10,6 +11,7 @@ import 'package:flutter/cupertino.dart';
|
|||||||
|
|
||||||
class Request {
|
class Request {
|
||||||
late final Dio _dio;
|
late final Dio _dio;
|
||||||
|
late final Dio _clashDio;
|
||||||
String? userAgent;
|
String? userAgent;
|
||||||
|
|
||||||
Request() {
|
Request() {
|
||||||
@@ -20,22 +22,24 @@ class Request {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
_clashDio = Dio();
|
||||||
|
_clashDio.httpClientAdapter = IOHttpClientAdapter(createHttpClient: () {
|
||||||
|
final client = HttpClient();
|
||||||
|
client.findProxy = (Uri uri) {
|
||||||
|
client.userAgent = globalState.ua;
|
||||||
|
return FlClashHttpOverrides.handleFindProxy(uri);
|
||||||
|
};
|
||||||
|
return client;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response> getFileResponseForUrl(String url) async {
|
Future<Response> getFileResponseForUrl(String url) async {
|
||||||
final response = await _dio
|
final response = await _clashDio.get(
|
||||||
.get(
|
url,
|
||||||
url,
|
options: Options(
|
||||||
options: Options(
|
responseType: ResponseType.bytes,
|
||||||
headers: {
|
),
|
||||||
"User-Agent": globalState.ua,
|
);
|
||||||
},
|
|
||||||
responseType: ResponseType.bytes,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.timeout(
|
|
||||||
httpTimeoutDuration * 6,
|
|
||||||
);
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,9 +113,6 @@ class Request {
|
|||||||
.get(
|
.get(
|
||||||
"http://$localhost:$helperPort/ping",
|
"http://$localhost:$helperPort/ping",
|
||||||
options: Options(
|
options: Options(
|
||||||
headers: {
|
|
||||||
"User-Agent": browserUa,
|
|
||||||
},
|
|
||||||
responseType: ResponseType.plain,
|
responseType: ResponseType.plain,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ class AppController {
|
|||||||
AppController(this.context, WidgetRef ref) : _ref = ref;
|
AppController(this.context, WidgetRef ref) : _ref = ref;
|
||||||
|
|
||||||
updateClashConfigDebounce() {
|
updateClashConfigDebounce() {
|
||||||
debouncer.call(DebounceTag.updateClashConfig, updateClashConfig);
|
debouncer.call(DebounceTag.updateClashConfig, () {
|
||||||
|
updateClashConfig(true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
updateGroupsDebounce() {
|
updateGroupsDebounce() {
|
||||||
@@ -41,10 +43,12 @@ class AppController {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
applyProfileDebounce() {
|
applyProfileDebounce({
|
||||||
debouncer.call(DebounceTag.addCheckIpNum, () {
|
bool silence = false,
|
||||||
applyProfile();
|
}) {
|
||||||
});
|
debouncer.call(DebounceTag.applyProfile, (silence) {
|
||||||
|
applyProfile(silence: silence);
|
||||||
|
}, args: [silence]);
|
||||||
}
|
}
|
||||||
|
|
||||||
savePreferencesDebounce() {
|
savePreferencesDebounce() {
|
||||||
@@ -156,18 +160,18 @@ class AppController {
|
|||||||
.read(profilesProvider.notifier)
|
.read(profilesProvider.notifier)
|
||||||
.setProfile(newProfile.copyWith(isUpdating: false));
|
.setProfile(newProfile.copyWith(isUpdating: false));
|
||||||
if (profile.id == _ref.read(currentProfileIdProvider)) {
|
if (profile.id == _ref.read(currentProfileIdProvider)) {
|
||||||
applyProfileDebounce();
|
applyProfileDebounce(silence: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_setProfile(Profile profile) {
|
setProfile(Profile profile) {
|
||||||
_ref.read(profilesProvider.notifier).setProfile(profile);
|
_ref.read(profilesProvider.notifier).setProfile(profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
setProfile(Profile profile) {
|
setProfileAndAutoApply(Profile profile) {
|
||||||
_setProfile(profile);
|
_ref.read(profilesProvider.notifier).setProfile(profile);
|
||||||
if (profile.id == _ref.read(currentProfileIdProvider)) {
|
if (profile.id == _ref.read(currentProfileIdProvider)) {
|
||||||
applyProfileDebounce();
|
applyProfileDebounce(silence: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,8 +223,8 @@ class AppController {
|
|||||||
return currentGroupName;
|
return currentGroupName;
|
||||||
}
|
}
|
||||||
|
|
||||||
getRealProxyName(proxyName) {
|
ProxyCardState getProxyCardState(proxyName) {
|
||||||
return _ref.read(getRealTestUrlProvider(proxyName));
|
return _ref.read(getProxyCardStateProvider(proxyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
getSelectedProxyName(groupName) {
|
getSelectedProxyName(groupName) {
|
||||||
@@ -232,7 +236,7 @@ class AppController {
|
|||||||
if (profile == null || profile.currentGroupName == groupName) {
|
if (profile == null || profile.currentGroupName == groupName) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_setProfile(
|
setProfile(
|
||||||
profile.copyWith(currentGroupName: groupName),
|
profile.copyWith(currentGroupName: groupName),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -754,13 +758,13 @@ class AppController {
|
|||||||
updateSystemProxy() {
|
updateSystemProxy() {
|
||||||
_ref.read(networkSettingProvider.notifier).updateState(
|
_ref.read(networkSettingProvider.notifier).updateState(
|
||||||
(state) => state.copyWith(
|
(state) => state.copyWith(
|
||||||
systemProxy: state.systemProxy,
|
systemProxy: !state.systemProxy,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateStart() {
|
updateStart() {
|
||||||
updateStatus(_ref.read(runTimeProvider.notifier).isStart);
|
updateStatus(!_ref.read(runTimeProvider.notifier).isStart);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCurrentSelectedMap(String groupName, String proxyName) {
|
updateCurrentSelectedMap(String groupName, String proxyName) {
|
||||||
@@ -794,10 +798,10 @@ class AppController {
|
|||||||
_ref.read(patchClashConfigProvider.notifier).updateState(
|
_ref.read(patchClashConfigProvider.notifier).updateState(
|
||||||
(state) => state.copyWith(mode: mode),
|
(state) => state.copyWith(mode: mode),
|
||||||
);
|
);
|
||||||
if (mode == Mode.global) {
|
// if (mode == Mode.global) {
|
||||||
updateCurrentGroupName(GroupName.GLOBAL.name);
|
// updateCurrentGroupName(GroupName.GLOBAL.name);
|
||||||
}
|
// }
|
||||||
addCheckIpNumDebounce();
|
// addCheckIpNumDebounce();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateAutoLaunch() {
|
updateAutoLaunch() {
|
||||||
|
|||||||
@@ -219,8 +219,6 @@ enum ProxiesIconStyle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum FontFamily {
|
enum FontFamily {
|
||||||
system(),
|
|
||||||
miSans("MiSans"),
|
|
||||||
twEmoji("Twemoji"),
|
twEmoji("Twemoji"),
|
||||||
icon("Icons");
|
icon("Icons");
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,32 @@ class StatusItem extends ConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ListenItem extends ConsumerWidget {
|
||||||
|
const ListenItem({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context, ref) {
|
||||||
|
final listen =
|
||||||
|
ref.watch(patchClashConfigProvider.select((state) => state.dns.listen));
|
||||||
|
return ListItem.input(
|
||||||
|
title: Text(appLocalizations.listen),
|
||||||
|
subtitle: Text(listen),
|
||||||
|
delegate: InputDelegate(
|
||||||
|
title: appLocalizations.listen,
|
||||||
|
value: listen,
|
||||||
|
onChanged: (String? value) {
|
||||||
|
if (value == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ref
|
||||||
|
.read(patchClashConfigProvider.notifier)
|
||||||
|
.updateState((state) => state.copyWith.dns(listen: value));
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PreferH3Item extends ConsumerWidget {
|
class PreferH3Item extends ConsumerWidget {
|
||||||
const PreferH3Item({super.key});
|
const PreferH3Item({super.key});
|
||||||
|
|
||||||
@@ -596,6 +622,7 @@ class DnsOptions extends StatelessWidget {
|
|||||||
title: appLocalizations.options,
|
title: appLocalizations.options,
|
||||||
items: [
|
items: [
|
||||||
const StatusItem(),
|
const StatusItem(),
|
||||||
|
const ListenItem(),
|
||||||
const UseHostsItem(),
|
const UseHostsItem(),
|
||||||
const UseSystemHostsItem(),
|
const UseSystemHostsItem(),
|
||||||
const IPv6Item(),
|
const IPv6Item(),
|
||||||
|
|||||||
@@ -62,12 +62,12 @@ class _MemoryInfoState extends State<MemoryInfo> {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
clashCore.requestGc();
|
clashCore.requestGc();
|
||||||
},
|
},
|
||||||
child: ValueListenableBuilder(
|
child: Column(
|
||||||
valueListenable: _memoryInfoStateNotifier,
|
children: [
|
||||||
builder: (_, trafficValue, __) {
|
ValueListenableBuilder(
|
||||||
return Column(
|
valueListenable: _memoryInfoStateNotifier,
|
||||||
children: [
|
builder: (_, trafficValue, __) {
|
||||||
Padding(
|
return Padding(
|
||||||
padding: baseInfoEdgeInsets.copyWith(
|
padding: baseInfoEdgeInsets.copyWith(
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
top: 12,
|
top: 12,
|
||||||
@@ -87,30 +87,30 @@ class _MemoryInfoState extends State<MemoryInfo> {
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
);
|
||||||
Flexible(
|
},
|
||||||
child: Stack(
|
),
|
||||||
children: [
|
Flexible(
|
||||||
Positioned.fill(
|
child: Stack(
|
||||||
child: WaveView(
|
children: [
|
||||||
waveAmplitude: 12.0,
|
Positioned.fill(
|
||||||
waveFrequency: 0.35,
|
child: WaveView(
|
||||||
waveColor: darkenLighter,
|
waveAmplitude: 12.0,
|
||||||
),
|
waveFrequency: 0.35,
|
||||||
),
|
waveColor: darkenLighter,
|
||||||
Positioned.fill(
|
),
|
||||||
child: WaveView(
|
|
||||||
waveAmplitude: 12.0,
|
|
||||||
waveFrequency: 0.9,
|
|
||||||
waveColor: darken,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
)
|
Positioned.fill(
|
||||||
],
|
child: WaveView(
|
||||||
);
|
waveAmplitude: 12.0,
|
||||||
},
|
waveFrequency: 0.9,
|
||||||
|
waveColor: darken,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -59,7 +59,9 @@ class _NetworkDetectionState extends ConsumerState<NetworkDetection> {
|
|||||||
final isStart = appState.runTime != null;
|
final isStart = appState.runTime != null;
|
||||||
if (_preIsStart == false &&
|
if (_preIsStart == false &&
|
||||||
_preIsStart == isStart &&
|
_preIsStart == isStart &&
|
||||||
_networkDetectionState.value.ipInfo != null) return;
|
_networkDetectionState.value.ipInfo != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
_clearSetTimeoutTimer();
|
_clearSetTimeoutTimer();
|
||||||
_networkDetectionState.value = _networkDetectionState.value.copyWith(
|
_networkDetectionState.value = _networkDetectionState.value.copyWith(
|
||||||
isTesting: true,
|
isTesting: true,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||||||
class TrafficUsage extends StatelessWidget {
|
class TrafficUsage extends StatelessWidget {
|
||||||
const TrafficUsage({super.key});
|
const TrafficUsage({super.key});
|
||||||
|
|
||||||
Widget getTrafficDataItem(
|
Widget _buildTrafficDataItem(
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
Icon icon,
|
Icon icon,
|
||||||
TrafficValue trafficValue,
|
TrafficValue trafficValue,
|
||||||
@@ -189,7 +189,7 @@ class TrafficUsage extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
getTrafficDataItem(
|
_buildTrafficDataItem(
|
||||||
context,
|
context,
|
||||||
Icon(
|
Icon(
|
||||||
Icons.arrow_upward,
|
Icons.arrow_upward,
|
||||||
@@ -201,7 +201,7 @@ class TrafficUsage extends StatelessWidget {
|
|||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 8,
|
height: 8,
|
||||||
),
|
),
|
||||||
getTrafficDataItem(
|
_buildTrafficDataItem(
|
||||||
context,
|
context,
|
||||||
Icon(
|
Icon(
|
||||||
Icons.arrow_downward,
|
Icons.arrow_downward,
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
import 'package:fl_clash/models/models.dart';
|
|
||||||
import 'package:fl_clash/widgets/scaffold.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class CustomProfile extends StatefulWidget {
|
|
||||||
final String profileId;
|
|
||||||
|
|
||||||
const CustomProfile({
|
|
||||||
super.key,
|
|
||||||
required this.profileId,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<CustomProfile> createState() => _CustomProfileState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _CustomProfileState extends State<CustomProfile> {
|
|
||||||
final _currentClashConfigNotifier = ValueNotifier<ClashConfig?>(null);
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_initCurrentClashConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
_initCurrentClashConfig() async {
|
|
||||||
// final currentProfileId = globalState.config.currentProfileId;
|
|
||||||
// if (currentProfileId == null) {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// _currentClashConfigNotifier.value =
|
|
||||||
// await clashCore.getProfile(currentProfileId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return CommonScaffold(
|
|
||||||
body: ValueListenableBuilder(
|
|
||||||
valueListenable: _currentClashConfigNotifier,
|
|
||||||
builder: (_, clashConfig, ___) {
|
|
||||||
if (clashConfig == null) {
|
|
||||||
return Center(
|
|
||||||
child: CircularProgressIndicator(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return Column(
|
|
||||||
children: [],
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
title: "自定义",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -80,9 +80,9 @@ class _EditProfileState extends State<EditProfile> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
appController.setProfile(await profile.saveFile(fileData!));
|
appController.setProfileAndAutoApply(await profile.saveFile(fileData!));
|
||||||
} else if (!hasUpdate) {
|
} else if (!hasUpdate) {
|
||||||
appController.setProfile(profile);
|
appController.setProfileAndAutoApply(profile);
|
||||||
} else {
|
} else {
|
||||||
globalState.homeScaffoldKey.currentState?.loadingRun(
|
globalState.homeScaffoldKey.currentState?.loadingRun(
|
||||||
() async {
|
() async {
|
||||||
|
|||||||
87
lib/fragments/profiles/gen_profile.dart
Normal file
87
lib/fragments/profiles/gen_profile.dart
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
import 'package:fl_clash/clash/core.dart';
|
||||||
|
import 'package:fl_clash/models/models.dart';
|
||||||
|
import 'package:fl_clash/state.dart';
|
||||||
|
import 'package:fl_clash/widgets/card.dart';
|
||||||
|
import 'package:fl_clash/widgets/scaffold.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class GenProfile extends StatefulWidget {
|
||||||
|
final String profileId;
|
||||||
|
|
||||||
|
const GenProfile({
|
||||||
|
super.key,
|
||||||
|
required this.profileId,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<GenProfile> createState() => _GenProfileState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _GenProfileState extends State<GenProfile> {
|
||||||
|
final _currentClashConfigNotifier = ValueNotifier<ClashConfigSnippet?>(null);
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_initCurrentClashConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
_initCurrentClashConfig() async {
|
||||||
|
final currentProfileId = globalState.config.currentProfileId;
|
||||||
|
if (currentProfileId == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_currentClashConfigNotifier.value =
|
||||||
|
await clashCore.getProfile(currentProfileId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return CommonScaffold(
|
||||||
|
body: ValueListenableBuilder(
|
||||||
|
valueListenable: _currentClashConfigNotifier,
|
||||||
|
builder: (_, clashConfig, ___) {
|
||||||
|
if (clashConfig == null) {
|
||||||
|
return Center(
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
child: CustomScrollView(
|
||||||
|
slivers: [
|
||||||
|
SliverGrid.builder(
|
||||||
|
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
|
maxCrossAxisExtent: 100,
|
||||||
|
mainAxisExtent: 50,
|
||||||
|
mainAxisSpacing: 8,
|
||||||
|
crossAxisSpacing: 8,
|
||||||
|
),
|
||||||
|
itemCount: clashConfig.proxyGroups.length,
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return CommonCard(
|
||||||
|
onPressed: () {},
|
||||||
|
child: Text(
|
||||||
|
clashConfig.proxyGroups[index].name,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
SliverList.builder(
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
final rule = clashConfig.rule[index];
|
||||||
|
return Text(
|
||||||
|
rule,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
itemCount: clashConfig.rule.length,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
title: "自定义",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
|
||||||
import 'add_profile.dart';
|
import 'add_profile.dart';
|
||||||
|
import 'gen_profile.dart';
|
||||||
|
|
||||||
class ProfilesFragment extends StatefulWidget {
|
class ProfilesFragment extends StatefulWidget {
|
||||||
const ProfilesFragment({super.key});
|
const ProfilesFragment({super.key});
|
||||||
@@ -181,10 +182,6 @@ class ProfileItem extends StatelessWidget {
|
|||||||
await globalState.appController.deleteProfile(profile.id);
|
await globalState.appController.deleteProfile(profile.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
_handleUpdateProfile() async {
|
|
||||||
await globalState.safeRun<void>(updateProfile);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future updateProfile() async {
|
Future updateProfile() async {
|
||||||
final appController = globalState.appController;
|
final appController = globalState.appController;
|
||||||
if (profile.type == ProfileType.file) return;
|
if (profile.type == ProfileType.file) return;
|
||||||
@@ -277,14 +274,14 @@ class ProfileItem extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// _handlePushCustomPage(BuildContext context, String id) {
|
_handlePushGenProfilePage(BuildContext context, String id) {
|
||||||
// BaseNavigator.push(
|
BaseNavigator.push(
|
||||||
// context,
|
context,
|
||||||
// CustomProfile(
|
GenProfile(
|
||||||
// profileId: id,
|
profileId: id,
|
||||||
// ),
|
),
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -323,7 +320,7 @@ class ProfileItem extends StatelessWidget {
|
|||||||
icon: Icons.sync_alt_sharp,
|
icon: Icons.sync_alt_sharp,
|
||||||
label: appLocalizations.sync,
|
label: appLocalizations.sync,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
_handleUpdateProfile();
|
updateProfile();
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
// ActionItemData(
|
// ActionItemData(
|
||||||
@@ -338,7 +335,7 @@ class ProfileItem extends StatelessWidget {
|
|||||||
// icon: Icons.extension_outlined,
|
// icon: Icons.extension_outlined,
|
||||||
// label: "自定义",
|
// label: "自定义",
|
||||||
// onPressed: () {
|
// onPressed: () {
|
||||||
// _handlePushCustomPage(context, profile.id);
|
// _handlePushGenProfilePage(context, profile.id);
|
||||||
// },
|
// },
|
||||||
// ),
|
// ),
|
||||||
ActionItemData(
|
ActionItemData(
|
||||||
|
|||||||
@@ -22,44 +22,52 @@ double getItemHeight(ProxyCardType proxyCardType) {
|
|||||||
|
|
||||||
proxyDelayTest(Proxy proxy, [String? testUrl]) async {
|
proxyDelayTest(Proxy proxy, [String? testUrl]) async {
|
||||||
final appController = globalState.appController;
|
final appController = globalState.appController;
|
||||||
final proxyName = appController.getRealProxyName(proxy.name);
|
final state = appController.getProxyCardState(proxy.name);
|
||||||
final url = appController.getRealTestUrl(testUrl);
|
final url = state.testUrl.getSafeValue(
|
||||||
|
appController.getRealTestUrl(testUrl),
|
||||||
|
);
|
||||||
|
if (state.proxyName.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
appController.setDelay(
|
appController.setDelay(
|
||||||
Delay(
|
Delay(
|
||||||
url: url,
|
url: url,
|
||||||
name: proxyName,
|
name: state.proxyName,
|
||||||
value: 0,
|
value: 0,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
appController.setDelay(
|
appController.setDelay(
|
||||||
await clashCore.getDelay(
|
await clashCore.getDelay(
|
||||||
url,
|
url,
|
||||||
proxyName,
|
state.proxyName,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
delayTest(List<Proxy> proxies, [String? testUrl]) async {
|
delayTest(List<Proxy> proxies, [String? testUrl]) async {
|
||||||
final appController = globalState.appController;
|
final appController = globalState.appController;
|
||||||
final proxyNames = proxies
|
final proxyNames = proxies.map((proxy) => proxy.name).toSet().toList();
|
||||||
.map((proxy) => appController.getRealProxyName(proxy.name))
|
|
||||||
.toSet()
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
final url = appController.getRealTestUrl(testUrl);
|
|
||||||
|
|
||||||
final delayProxies = proxyNames.map<Future>((proxyName) async {
|
final delayProxies = proxyNames.map<Future>((proxyName) async {
|
||||||
|
final state = appController.getProxyCardState(proxyName);
|
||||||
|
final url = state.testUrl.getSafeValue(
|
||||||
|
appController.getRealTestUrl(testUrl),
|
||||||
|
);
|
||||||
|
final name = state.proxyName;
|
||||||
|
if (name.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
appController.setDelay(
|
appController.setDelay(
|
||||||
Delay(
|
Delay(
|
||||||
url: url,
|
url: url,
|
||||||
name: proxyName,
|
name: name,
|
||||||
value: 0,
|
value: 0,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
appController.setDelay(
|
appController.setDelay(
|
||||||
await clashCore.getDelay(
|
await clashCore.getDelay(
|
||||||
url,
|
url,
|
||||||
proxyName,
|
name,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class ProxiesTabFragmentState extends ConsumerState<ProxiesTabFragment>
|
|||||||
|
|
||||||
_tabControllerListener([int? index]) {
|
_tabControllerListener([int? index]) {
|
||||||
int? groupIndex = index;
|
int? groupIndex = index;
|
||||||
if(groupIndex == -1){
|
if (groupIndex == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final appController = globalState.appController;
|
final appController = globalState.appController;
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ class _ThemeColorsBoxState extends ConsumerState<ThemeColorsBox> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
_FontFamilyItem(),
|
// _FontFamilyItem(),
|
||||||
_ThemeModeItem(),
|
_ThemeModeItem(),
|
||||||
_PrimaryColorItem(),
|
_PrimaryColorItem(),
|
||||||
_PrueBlackItem(),
|
_PrueBlackItem(),
|
||||||
@@ -110,74 +110,74 @@ class _ThemeColorsBoxState extends ConsumerState<ThemeColorsBox> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _FontFamilyItem extends ConsumerWidget {
|
// class _FontFamilyItem extends ConsumerWidget {
|
||||||
const _FontFamilyItem();
|
// const _FontFamilyItem();
|
||||||
|
//
|
||||||
@override
|
// @override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
// Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final fontFamily =
|
// final fontFamily =
|
||||||
ref.watch(themeSettingProvider.select((state) => state.fontFamily));
|
// ref.watch(themeSettingProvider.select((state) => state.fontFamily));
|
||||||
List<FontFamilyItem> fontFamilyItems = [
|
// List<FontFamilyItem> fontFamilyItems = [
|
||||||
FontFamilyItem(
|
// FontFamilyItem(
|
||||||
label: appLocalizations.systemFont,
|
// label: appLocalizations.systemFont,
|
||||||
fontFamily: FontFamily.system,
|
// fontFamily: FontFamily.system,
|
||||||
),
|
// ),
|
||||||
const FontFamilyItem(
|
// const FontFamilyItem(
|
||||||
label: "MiSans",
|
// label: "roboto",
|
||||||
fontFamily: FontFamily.miSans,
|
// fontFamily: FontFamily.roboto,
|
||||||
),
|
// ),
|
||||||
];
|
// ];
|
||||||
return ItemCard(
|
// return ItemCard(
|
||||||
info: Info(
|
// info: Info(
|
||||||
label: appLocalizations.fontFamily,
|
// label: appLocalizations.fontFamily,
|
||||||
iconData: Icons.text_fields,
|
// iconData: Icons.text_fields,
|
||||||
),
|
// ),
|
||||||
child: Container(
|
// child: Container(
|
||||||
margin: const EdgeInsets.only(
|
// margin: const EdgeInsets.only(
|
||||||
left: 16,
|
// left: 16,
|
||||||
right: 16,
|
// right: 16,
|
||||||
),
|
// ),
|
||||||
height: 48,
|
// height: 48,
|
||||||
child: ListView.separated(
|
// child: ListView.separated(
|
||||||
scrollDirection: Axis.horizontal,
|
// scrollDirection: Axis.horizontal,
|
||||||
itemBuilder: (_, index) {
|
// itemBuilder: (_, index) {
|
||||||
final fontFamilyItem = fontFamilyItems[index];
|
// final fontFamilyItem = fontFamilyItems[index];
|
||||||
return CommonCard(
|
// return CommonCard(
|
||||||
isSelected: fontFamilyItem.fontFamily == fontFamily,
|
// isSelected: fontFamilyItem.fontFamily == fontFamily,
|
||||||
onPressed: () {
|
// onPressed: () {
|
||||||
ref.read(themeSettingProvider.notifier).updateState(
|
// ref.read(themeSettingProvider.notifier).updateState(
|
||||||
(state) => state.copyWith(
|
// (state) => state.copyWith(
|
||||||
fontFamily: fontFamilyItem.fontFamily,
|
// fontFamily: fontFamilyItem.fontFamily,
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
child: Padding(
|
// child: Padding(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
// padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
child: Row(
|
// child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
// mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
// mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
// children: [
|
||||||
Flexible(
|
// Flexible(
|
||||||
child: Text(
|
// child: Text(
|
||||||
fontFamilyItem.label,
|
// fontFamilyItem.label,
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
],
|
// ],
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
separatorBuilder: (_, __) {
|
// separatorBuilder: (_, __) {
|
||||||
return const SizedBox(
|
// return const SizedBox(
|
||||||
width: 16,
|
// width: 16,
|
||||||
);
|
// );
|
||||||
},
|
// },
|
||||||
itemCount: fontFamilyItems.length,
|
// itemCount: fontFamilyItems.length,
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
class _ThemeModeItem extends ConsumerWidget {
|
class _ThemeModeItem extends ConsumerWidget {
|
||||||
const _ThemeModeItem();
|
const _ThemeModeItem();
|
||||||
@@ -320,7 +320,7 @@ class _PrueBlackItem extends ConsumerWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final prueBlack =
|
final prueBlack =
|
||||||
ref.watch(themeSettingProvider.select((state) => state.prueBlack));
|
ref.watch(themeSettingProvider.select((state) => state.pureBlack));
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 16),
|
padding: const EdgeInsets.symmetric(vertical: 16),
|
||||||
child: ListItem.switchItem(
|
child: ListItem.switchItem(
|
||||||
@@ -328,13 +328,13 @@ class _PrueBlackItem extends ConsumerWidget {
|
|||||||
Icons.contrast,
|
Icons.contrast,
|
||||||
color: context.colorScheme.primary,
|
color: context.colorScheme.primary,
|
||||||
),
|
),
|
||||||
title: Text(appLocalizations.prueBlackMode),
|
title: Text(appLocalizations.pureBlackMode),
|
||||||
delegate: SwitchDelegate(
|
delegate: SwitchDelegate(
|
||||||
value: prueBlack,
|
value: prueBlack,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
ref.read(themeSettingProvider.notifier).updateState(
|
ref.read(themeSettingProvider.notifier).updateState(
|
||||||
(state) => state.copyWith(
|
(state) => state.copyWith(
|
||||||
prueBlack: value,
|
pureBlack: value,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
"other": "Other",
|
"other": "Other",
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
|
"ja": "Japanese",
|
||||||
|
"ru": "Russian",
|
||||||
"zh_CN": "Simplified Chinese",
|
"zh_CN": "Simplified Chinese",
|
||||||
"theme": "Theme",
|
"theme": "Theme",
|
||||||
"themeDesc": "Set dark mode,adjust the color",
|
"themeDesc": "Set dark mode,adjust the color",
|
||||||
@@ -215,12 +217,12 @@
|
|||||||
"go": "Go",
|
"go": "Go",
|
||||||
"externalLink": "External link",
|
"externalLink": "External link",
|
||||||
"otherContributors": "Other contributors",
|
"otherContributors": "Other contributors",
|
||||||
"autoCloseConnections": "Auto lose connections",
|
"autoCloseConnections": "Auto close connections",
|
||||||
"autoCloseConnectionsDesc": "Auto close connections after change node",
|
"autoCloseConnectionsDesc": "Auto close connections after change node",
|
||||||
"onlyStatisticsProxy": "Only statistics proxy",
|
"onlyStatisticsProxy": "Only statistics proxy",
|
||||||
"onlyStatisticsProxyDesc": "When turned on, only statistics proxy traffic",
|
"onlyStatisticsProxyDesc": "When turned on, only statistics proxy traffic",
|
||||||
"deleteProfileTip": "Sure you want to delete the current profile?",
|
"deleteProfileTip": "Sure you want to delete the current profile?",
|
||||||
"prueBlackMode": "Prue black mode",
|
"pureBlackMode": "Pure black mode",
|
||||||
"keepAliveIntervalDesc": "Tcp keep alive interval",
|
"keepAliveIntervalDesc": "Tcp keep alive interval",
|
||||||
"entries": " entries",
|
"entries": " entries",
|
||||||
"local": "Local",
|
"local": "Local",
|
||||||
@@ -343,5 +345,6 @@
|
|||||||
"copyLink": "Copy link",
|
"copyLink": "Copy link",
|
||||||
"exportFile": "Export file",
|
"exportFile": "Export file",
|
||||||
"cacheCorrupt": "The cache is corrupt. Do you want to clear it?",
|
"cacheCorrupt": "The cache is corrupt. Do you want to clear it?",
|
||||||
"detectionTip": "Relying on third-party api is for reference only"
|
"detectionTip": "Relying on third-party api is for reference only",
|
||||||
|
"listen": "Listen"
|
||||||
}
|
}
|
||||||
350
lib/l10n/arb/intl_ja.arb
Normal file
350
lib/l10n/arb/intl_ja.arb
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
{
|
||||||
|
"rule": "ルール",
|
||||||
|
"global": "グローバル",
|
||||||
|
"direct": "ダイレクト",
|
||||||
|
"dashboard": "ダッシュボード",
|
||||||
|
"proxies": "プロキシ",
|
||||||
|
"profile": "プロファイル",
|
||||||
|
"profiles": "プロファイル一覧",
|
||||||
|
"tools": "ツール",
|
||||||
|
"logs": "ログ",
|
||||||
|
"logsDesc": "ログキャプチャ記録",
|
||||||
|
"resources": "リソース",
|
||||||
|
"resourcesDesc": "外部リソース関連情報",
|
||||||
|
"trafficUsage": "トラフィック使用量",
|
||||||
|
"coreInfo": "コア情報",
|
||||||
|
"nullCoreInfoDesc": "コア情報を取得できません",
|
||||||
|
"networkSpeed": "ネットワーク速度",
|
||||||
|
"outboundMode": "アウトバウンドモード",
|
||||||
|
"networkDetection": "ネットワーク検出",
|
||||||
|
"upload": "アップロード",
|
||||||
|
"download": "ダウンロード",
|
||||||
|
"noProxy": "プロキシなし",
|
||||||
|
"noProxyDesc": "プロファイルを作成するか、有効なプロファイルを追加してください",
|
||||||
|
"nullProfileDesc": "プロファイルがありません。追加してください",
|
||||||
|
"nullLogsDesc": "ログがありません",
|
||||||
|
"settings": "設定",
|
||||||
|
"language": "言語",
|
||||||
|
"defaultText": "デフォルト",
|
||||||
|
"more": "詳細",
|
||||||
|
"other": "その他",
|
||||||
|
"about": "について",
|
||||||
|
"en": "英語",
|
||||||
|
"ja": "日本語",
|
||||||
|
"ru": "ロシア語",
|
||||||
|
"zh_CN": "簡体字中国語",
|
||||||
|
"theme": "テーマ",
|
||||||
|
"themeDesc": "ダークモードの設定、色の調整",
|
||||||
|
"override": "上書き",
|
||||||
|
"overrideDesc": "プロキシ関連設定を上書き",
|
||||||
|
"allowLan": "LANを許可",
|
||||||
|
"allowLanDesc": "LAN経由でのプロキシアクセスを許可",
|
||||||
|
"tun": "TUN",
|
||||||
|
"tunDesc": "管理者モードでのみ有効",
|
||||||
|
"minimizeOnExit": "終了時に最小化",
|
||||||
|
"minimizeOnExitDesc": "システムの終了イベントを変更",
|
||||||
|
"autoLaunch": "自動起動",
|
||||||
|
"autoLaunchDesc": "システムの自動起動に従う",
|
||||||
|
"silentLaunch": "バックグラウンド起動",
|
||||||
|
"silentLaunchDesc": "バックグラウンドで起動",
|
||||||
|
"autoRun": "自動実行",
|
||||||
|
"autoRunDesc": "アプリ起動時に自動実行",
|
||||||
|
"logcat": "ログキャット",
|
||||||
|
"logcatDesc": "無効化するとログエントリを非表示",
|
||||||
|
"autoCheckUpdate": "自動更新チェック",
|
||||||
|
"autoCheckUpdateDesc": "起動時に更新を自動チェック",
|
||||||
|
"accessControl": "アクセス制御",
|
||||||
|
"accessControlDesc": "アプリケーションのプロキシアクセスを設定",
|
||||||
|
"application": "アプリケーション",
|
||||||
|
"applicationDesc": "アプリ関連設定を変更",
|
||||||
|
"edit": "編集",
|
||||||
|
"confirm": "確認",
|
||||||
|
"update": "更新",
|
||||||
|
"add": "追加",
|
||||||
|
"save": "保存",
|
||||||
|
"delete": "削除",
|
||||||
|
"years": "年",
|
||||||
|
"months": "月",
|
||||||
|
"hours": "時間",
|
||||||
|
"days": "日",
|
||||||
|
"minutes": "分",
|
||||||
|
"seconds": "秒",
|
||||||
|
"ago": "前",
|
||||||
|
"just": "たった今",
|
||||||
|
"qrcode": "QRコード",
|
||||||
|
"qrcodeDesc": "QRコードをスキャンしてプロファイルを取得",
|
||||||
|
"url": "URL",
|
||||||
|
"urlDesc": "URL経由でプロファイルを取得",
|
||||||
|
"file": "ファイル",
|
||||||
|
"fileDesc": "プロファイルを直接アップロード",
|
||||||
|
"name": "名前",
|
||||||
|
"profileNameNullValidationDesc": "プロファイル名を入力してください",
|
||||||
|
"profileUrlNullValidationDesc": "プロファイルURLを入力してください",
|
||||||
|
"profileUrlInvalidValidationDesc": "有効なプロファイルURLを入力してください",
|
||||||
|
"autoUpdate": "自動更新",
|
||||||
|
"autoUpdateInterval": "自動更新間隔(分)",
|
||||||
|
"profileAutoUpdateIntervalNullValidationDesc": "自動更新間隔を入力してください",
|
||||||
|
"profileAutoUpdateIntervalInvalidValidationDesc": "有効な間隔形式を入力してください",
|
||||||
|
"themeMode": "テーマモード",
|
||||||
|
"themeColor": "テーマカラー",
|
||||||
|
"preview": "プレビュー",
|
||||||
|
"auto": "自動",
|
||||||
|
"light": "ライト",
|
||||||
|
"dark": "ダーク",
|
||||||
|
"importFromURL": "URLからインポート",
|
||||||
|
"submit": "送信",
|
||||||
|
"doYouWantToPass": "通過させますか?",
|
||||||
|
"create": "作成",
|
||||||
|
"defaultSort": "デフォルト順",
|
||||||
|
"delaySort": "遅延順",
|
||||||
|
"nameSort": "名前順",
|
||||||
|
"pleaseUploadFile": "ファイルをアップロードしてください",
|
||||||
|
"pleaseUploadValidQrcode": "有効なQRコードをアップロードしてください",
|
||||||
|
"blacklistMode": "ブラックリストモード",
|
||||||
|
"whitelistMode": "ホワイトリストモード",
|
||||||
|
"filterSystemApp": "システムアプリを除外",
|
||||||
|
"cancelFilterSystemApp": "システムアプリの除外を解除",
|
||||||
|
"selectAll": "すべて選択",
|
||||||
|
"cancelSelectAll": "全選択解除",
|
||||||
|
"appAccessControl": "アプリアクセス制御",
|
||||||
|
"accessControlAllowDesc": "選択したアプリのみVPNを許可",
|
||||||
|
"accessControlNotAllowDesc": "選択したアプリをVPNから除外",
|
||||||
|
"selected": "選択済み",
|
||||||
|
"unableToUpdateCurrentProfileDesc": "現在のプロファイルを更新できません",
|
||||||
|
"noMoreInfoDesc": "追加情報なし",
|
||||||
|
"profileParseErrorDesc": "プロファイル解析エラー",
|
||||||
|
"proxyPort": "プロキシポート",
|
||||||
|
"proxyPortDesc": "Clashのリスニングポートを設定",
|
||||||
|
"port": "ポート",
|
||||||
|
"logLevel": "ログレベル",
|
||||||
|
"show": "表示",
|
||||||
|
"exit": "終了",
|
||||||
|
"systemProxy": "システムプロキシ",
|
||||||
|
"project": "プロジェクト",
|
||||||
|
"core": "コア",
|
||||||
|
"tabAnimation": "タブアニメーション",
|
||||||
|
"tabAnimationDesc": "有効化するとホームタブに切り替えアニメーションを追加",
|
||||||
|
"desc": "ClashMetaベースのマルチプラットフォームプロキシクライアント。シンプルで使いやすく、オープンソースで広告なし。",
|
||||||
|
"startVpn": "VPNを開始中...",
|
||||||
|
"stopVpn": "VPNを停止中...",
|
||||||
|
"discovery": "新しいバージョンを発見",
|
||||||
|
"compatible": "互換モード",
|
||||||
|
"compatibleDesc": "有効化すると一部機能を失いますが、Clashの完全サポートを獲得",
|
||||||
|
"notSelectedTip": "現在のプロキシグループは選択できません",
|
||||||
|
"tip": "ヒント",
|
||||||
|
"backupAndRecovery": "バックアップと復元",
|
||||||
|
"backupAndRecoveryDesc": "WebDAVまたはファイルでデータを同期",
|
||||||
|
"account": "アカウント",
|
||||||
|
"backup": "バックアップ",
|
||||||
|
"recovery": "復元",
|
||||||
|
"recoveryProfiles": "プロファイルのみ復元",
|
||||||
|
"recoveryAll": "全データ復元",
|
||||||
|
"recoverySuccess": "復元成功",
|
||||||
|
"backupSuccess": "バックアップ成功",
|
||||||
|
"noInfo": "情報なし",
|
||||||
|
"pleaseBindWebDAV": "WebDAVをバインドしてください",
|
||||||
|
"bind": "バインド",
|
||||||
|
"connectivity": "接続性:",
|
||||||
|
"webDAVConfiguration": "WebDAV設定",
|
||||||
|
"address": "アドレス",
|
||||||
|
"addressHelp": "WebDAVサーバーアドレス",
|
||||||
|
"addressTip": "有効なWebDAVアドレスを入力",
|
||||||
|
"password": "パスワード",
|
||||||
|
"passwordTip": "パスワードは必須です",
|
||||||
|
"accountTip": "アカウントは必須です",
|
||||||
|
"checkUpdate": "更新を確認",
|
||||||
|
"discoverNewVersion": "新バージョンを発見",
|
||||||
|
"checkUpdateError": "アプリは最新版です",
|
||||||
|
"goDownload": "ダウンロードへ",
|
||||||
|
"unknown": "不明",
|
||||||
|
"geoData": "地域データ",
|
||||||
|
"externalResources": "外部リソース",
|
||||||
|
"checking": "確認中...",
|
||||||
|
"country": "国",
|
||||||
|
"checkError": "確認エラー",
|
||||||
|
"search": "検索",
|
||||||
|
"allowBypass": "アプリがVPNをバイパスすることを許可",
|
||||||
|
"allowBypassDesc": "有効化すると一部アプリがVPNをバイパス",
|
||||||
|
"externalController": "外部コントローラー",
|
||||||
|
"externalControllerDesc": "有効化するとClashコアをポート9090で制御可能",
|
||||||
|
"ipv6Desc": "有効化するとIPv6トラフィックを受信可能",
|
||||||
|
"app": "アプリ",
|
||||||
|
"general": "一般",
|
||||||
|
"vpnSystemProxyDesc": "HTTPプロキシをVpnServiceに接続",
|
||||||
|
"systemProxyDesc": "HTTPプロキシをVpnServiceに接続",
|
||||||
|
"unifiedDelay": "統一遅延",
|
||||||
|
"unifiedDelayDesc": "ハンドシェイクなどの余分な遅延を削除",
|
||||||
|
"tcpConcurrent": "TCP並列処理",
|
||||||
|
"tcpConcurrentDesc": "TCP並列処理を許可",
|
||||||
|
"geodataLoader": "Geo低メモリモード",
|
||||||
|
"geodataLoaderDesc": "有効化するとGeo低メモリローダーを使用",
|
||||||
|
"requests": "リクエスト",
|
||||||
|
"requestsDesc": "最近のリクエスト記録を表示",
|
||||||
|
"findProcessMode": "プロセス検出",
|
||||||
|
"findProcessModeDesc": "有効化するとフラッシュバックのリスクあり",
|
||||||
|
"init": "初期化",
|
||||||
|
"infiniteTime": "長期有効",
|
||||||
|
"expirationTime": "有効期限",
|
||||||
|
"connections": "接続",
|
||||||
|
"connectionsDesc": "現在の接続データを表示",
|
||||||
|
"nullRequestsDesc": "リクエストなし",
|
||||||
|
"nullConnectionsDesc": "接続なし",
|
||||||
|
"intranetIP": "イントラネットIP",
|
||||||
|
"view": "表示",
|
||||||
|
"cut": "切り取り",
|
||||||
|
"copy": "コピー",
|
||||||
|
"paste": "貼り付け",
|
||||||
|
"testUrl": "URLテスト",
|
||||||
|
"sync": "同期",
|
||||||
|
"exclude": "最近のタスクから非表示",
|
||||||
|
"excludeDesc": "アプリがバックグラウンド時に最近のタスクから非表示",
|
||||||
|
"oneColumn": "1列",
|
||||||
|
"twoColumns": "2列",
|
||||||
|
"threeColumns": "3列",
|
||||||
|
"fourColumns": "4列",
|
||||||
|
"expand": "標準",
|
||||||
|
"shrink": "縮小",
|
||||||
|
"min": "最小化",
|
||||||
|
"tab": "タブ",
|
||||||
|
"list": "リスト",
|
||||||
|
"delay": "遅延",
|
||||||
|
"style": "スタイル",
|
||||||
|
"size": "サイズ",
|
||||||
|
"sort": "並び替え",
|
||||||
|
"columns": "列",
|
||||||
|
"proxiesSetting": "プロキシ設定",
|
||||||
|
"proxyGroup": "プロキシグループ",
|
||||||
|
"go": "移動",
|
||||||
|
"externalLink": "外部リンク",
|
||||||
|
"otherContributors": "その他の貢献者",
|
||||||
|
"autoCloseConnections": "接続を自動閉じる",
|
||||||
|
"autoCloseConnectionsDesc": "ノード変更後に接続を自動閉じる",
|
||||||
|
"onlyStatisticsProxy": "プロキシのみ統計",
|
||||||
|
"onlyStatisticsProxyDesc": "有効化するとプロキシトラフィックのみ統計",
|
||||||
|
"deleteProfileTip": "現在のプロファイルを削除しますか?",
|
||||||
|
"pureBlackMode": "純黒モード",
|
||||||
|
"keepAliveIntervalDesc": "TCPキープアライブ間隔",
|
||||||
|
"entries": " エントリ",
|
||||||
|
"local": "ローカル",
|
||||||
|
"remote": "リモート",
|
||||||
|
"remoteBackupDesc": "WebDAVにデータをバックアップ",
|
||||||
|
"remoteRecoveryDesc": "WebDAVからデータを復元",
|
||||||
|
"localBackupDesc": "ローカルにデータをバックアップ",
|
||||||
|
"localRecoveryDesc": "ファイルからデータを復元",
|
||||||
|
"mode": "モード",
|
||||||
|
"time": "時間",
|
||||||
|
"source": "ソース",
|
||||||
|
"allApps": "全アプリ",
|
||||||
|
"onlyOtherApps": "サードパーティアプリのみ",
|
||||||
|
"action": "アクション",
|
||||||
|
"intelligentSelected": "インテリジェント選択",
|
||||||
|
"clipboardImport": "クリップボードからインポート",
|
||||||
|
"clipboardExport": "クリップボードにエクスポート",
|
||||||
|
"layout": "レイアウト",
|
||||||
|
"tight": "密",
|
||||||
|
"standard": "標準",
|
||||||
|
"loose": "疎",
|
||||||
|
"profilesSort": "プロファイルの並び替え",
|
||||||
|
"start": "開始",
|
||||||
|
"stop": "停止",
|
||||||
|
"appDesc": "アプリ関連設定の処理",
|
||||||
|
"vpnDesc": "VPN関連設定の変更",
|
||||||
|
"generalDesc": "一般設定の上書き",
|
||||||
|
"dnsDesc": "DNS関連設定の更新",
|
||||||
|
"key": "キー",
|
||||||
|
"value": "値",
|
||||||
|
"notEmpty": "空欄不可",
|
||||||
|
"hostsDesc": "ホストを追加",
|
||||||
|
"vpnTip": "変更はVPN再起動後に有効",
|
||||||
|
"vpnEnableDesc": "VpnService経由で全システムトラフィックをルーティング",
|
||||||
|
"options": "オプション",
|
||||||
|
"loopback": "ループバック解除ツール",
|
||||||
|
"loopbackDesc": "UWPループバック解除用",
|
||||||
|
"providers": "プロバイダー",
|
||||||
|
"proxyProviders": "プロキシプロバイダー",
|
||||||
|
"ruleProviders": "ルールプロバイダー",
|
||||||
|
"overrideDns": "DNS上書き",
|
||||||
|
"overrideDnsDesc": "有効化するとプロファイルのDNS設定を上書き",
|
||||||
|
"status": "ステータス",
|
||||||
|
"statusDesc": "無効時はシステムDNSを使用",
|
||||||
|
"preferH3Desc": "DOHのHTTP/3を優先使用",
|
||||||
|
"respectRules": "ルール尊重",
|
||||||
|
"respectRulesDesc": "DNS接続がルールに従う(proxy-server-nameserverの設定が必要)",
|
||||||
|
"dnsMode": "DNSモード",
|
||||||
|
"fakeipRange": "Fakeip範囲",
|
||||||
|
"fakeipFilter": "Fakeipフィルター",
|
||||||
|
"defaultNameserver": "デフォルトネームサーバー",
|
||||||
|
"defaultNameserverDesc": "DNSサーバーの解決用",
|
||||||
|
"nameserver": "ネームサーバー",
|
||||||
|
"nameserverDesc": "ドメイン解決用",
|
||||||
|
"useHosts": "ホストを使用",
|
||||||
|
"useSystemHosts": "システムホストを使用",
|
||||||
|
"nameserverPolicy": "ネームサーバーポリシー",
|
||||||
|
"nameserverPolicyDesc": "対応するネームサーバーポリシーを指定",
|
||||||
|
"proxyNameserver": "プロキシネームサーバー",
|
||||||
|
"proxyNameserverDesc": "プロキシノード解決用ドメイン",
|
||||||
|
"fallback": "フォールバック",
|
||||||
|
"fallbackDesc": "通常はオフショアDNSを使用",
|
||||||
|
"fallbackFilter": "フォールバックフィルター",
|
||||||
|
"geoipCode": "GeoIPコード",
|
||||||
|
"ipcidr": "IPCIDR",
|
||||||
|
"domain": "ドメイン",
|
||||||
|
"reset": "リセット",
|
||||||
|
"action_view": "表示/非表示",
|
||||||
|
"action_start": "開始/停止",
|
||||||
|
"action_mode": "モード切替",
|
||||||
|
"action_proxy": "システムプロキシ",
|
||||||
|
"action_tun": "TUN",
|
||||||
|
"disclaimer": "免責事項",
|
||||||
|
"disclaimerDesc": "本ソフトウェアは学習交流や科学研究などの非営利目的でのみ使用されます。商用利用は厳禁です。いかなる商用活動も本ソフトウェアとは無関係です。",
|
||||||
|
"agree": "同意",
|
||||||
|
"hotkeyManagement": "ホットキー管理",
|
||||||
|
"hotkeyManagementDesc": "キーボードでアプリを制御",
|
||||||
|
"pressKeyboard": "キーボードを押してください",
|
||||||
|
"inputCorrectHotkey": "正しいホットキーを入力",
|
||||||
|
"hotkeyConflict": "ホットキー競合",
|
||||||
|
"remove": "削除",
|
||||||
|
"noHotKey": "ホットキーなし",
|
||||||
|
"noNetwork": "ネットワークなし",
|
||||||
|
"ipv6InboundDesc": "IPv6インバウンドを許可",
|
||||||
|
"exportLogs": "ログをエクスポート",
|
||||||
|
"exportSuccess": "エクスポート成功",
|
||||||
|
"iconStyle": "アイコンスタイル",
|
||||||
|
"onlyIcon": "アイコンのみ",
|
||||||
|
"noIcon": "なし",
|
||||||
|
"stackMode": "スタックモード",
|
||||||
|
"network": "ネットワーク",
|
||||||
|
"networkDesc": "ネットワーク関連設定の変更",
|
||||||
|
"bypassDomain": "バイパスドメイン",
|
||||||
|
"bypassDomainDesc": "システムプロキシ有効時のみ適用",
|
||||||
|
"resetTip": "リセットを確定",
|
||||||
|
"regExp": "正規表現",
|
||||||
|
"icon": "アイコン",
|
||||||
|
"iconConfiguration": "アイコン設定",
|
||||||
|
"noData": "データなし",
|
||||||
|
"adminAutoLaunch": "管理者自動起動",
|
||||||
|
"adminAutoLaunchDesc": "管理者モードで起動",
|
||||||
|
"fontFamily": "フォントファミリー",
|
||||||
|
"systemFont": "システムフォント",
|
||||||
|
"toggle": "トグル",
|
||||||
|
"system": "システム",
|
||||||
|
"routeMode": "ルートモード",
|
||||||
|
"routeMode_bypassPrivate": "プライベートルートをバイパス",
|
||||||
|
"routeMode_config": "設定を使用",
|
||||||
|
"routeAddress": "ルートアドレス",
|
||||||
|
"routeAddressDesc": "ルートアドレスを設定",
|
||||||
|
"pleaseInputAdminPassword": "管理者パスワードを入力",
|
||||||
|
"copyEnvVar": "環境変数をコピー",
|
||||||
|
"memoryInfo": "メモリ情報",
|
||||||
|
"cancel": "キャンセル",
|
||||||
|
"fileIsUpdate": "ファイルが変更されました。保存しますか?",
|
||||||
|
"profileHasUpdate": "プロファイルが変更されました。自動更新を無効化しますか?",
|
||||||
|
"hasCacheChange": "変更をキャッシュしますか?",
|
||||||
|
"nullProxies": "プロキシなし",
|
||||||
|
"copySuccess": "コピー成功",
|
||||||
|
"copyLink": "リンクをコピー",
|
||||||
|
"exportFile": "ファイルをエクスポート",
|
||||||
|
"cacheCorrupt": "キャッシュが破損しています。クリアしますか?",
|
||||||
|
"detectionTip": "サードパーティAPIに依存(参考値)",
|
||||||
|
"listen": "リスン"
|
||||||
|
}
|
||||||
350
lib/l10n/arb/intl_ru.arb
Normal file
350
lib/l10n/arb/intl_ru.arb
Normal file
@@ -0,0 +1,350 @@
|
|||||||
|
{
|
||||||
|
"rule": "Правило",
|
||||||
|
"global": "Глобальный",
|
||||||
|
"direct": "Прямой",
|
||||||
|
"dashboard": "Панель управления",
|
||||||
|
"proxies": "Прокси",
|
||||||
|
"profile": "Профиль",
|
||||||
|
"profiles": "Профили",
|
||||||
|
"tools": "Инструменты",
|
||||||
|
"logs": "Логи",
|
||||||
|
"logsDesc": "Записи захвата логов",
|
||||||
|
"resources": "Ресурсы",
|
||||||
|
"resourcesDesc": "Информация, связанная с внешними ресурсами",
|
||||||
|
"trafficUsage": "Использование трафика",
|
||||||
|
"coreInfo": "Информация о ядре",
|
||||||
|
"nullCoreInfoDesc": "Не удалось получить информацию о ядре",
|
||||||
|
"networkSpeed": "Скорость сети",
|
||||||
|
"outboundMode": "Режим исходящего трафика",
|
||||||
|
"networkDetection": "Обнаружение сети",
|
||||||
|
"upload": "Загрузка",
|
||||||
|
"download": "Скачивание",
|
||||||
|
"noProxy": "Нет прокси",
|
||||||
|
"noProxyDesc": "Пожалуйста, создайте профиль или добавьте действительный профиль",
|
||||||
|
"nullProfileDesc": "Нет профиля, пожалуйста, добавьте профиль",
|
||||||
|
"nullLogsDesc": "Нет логов",
|
||||||
|
"settings": "Настройки",
|
||||||
|
"language": "Язык",
|
||||||
|
"defaultText": "По умолчанию",
|
||||||
|
"more": "Еще",
|
||||||
|
"other": "Другое",
|
||||||
|
"about": "О программе",
|
||||||
|
"en": "Английский",
|
||||||
|
"ja": "Японский",
|
||||||
|
"ru": "Русский",
|
||||||
|
"zh_CN": "Упрощенный китайский",
|
||||||
|
"theme": "Тема",
|
||||||
|
"themeDesc": "Установить темный режим, настроить цвет",
|
||||||
|
"override": "Переопределить",
|
||||||
|
"overrideDesc": "Переопределить конфигурацию, связанную с прокси",
|
||||||
|
"allowLan": "Разрешить LAN",
|
||||||
|
"allowLanDesc": "Разрешить доступ к прокси через локальную сеть",
|
||||||
|
"tun": "TUN",
|
||||||
|
"tunDesc": "действительно только в режиме администратора",
|
||||||
|
"minimizeOnExit": "Свернуть при выходе",
|
||||||
|
"minimizeOnExitDesc": "Изменить стандартное событие выхода из системы",
|
||||||
|
"autoLaunch": "Автозапуск",
|
||||||
|
"autoLaunchDesc": "Следовать автозапуску системы",
|
||||||
|
"silentLaunch": "Тихий запуск",
|
||||||
|
"silentLaunchDesc": "Запуск в фоновом режиме",
|
||||||
|
"autoRun": "Автозапуск",
|
||||||
|
"autoRunDesc": "Автоматический запуск при открытии приложения",
|
||||||
|
"logcat": "Logcat",
|
||||||
|
"logcatDesc": "Отключение скроет запись логов",
|
||||||
|
"autoCheckUpdate": "Автопроверка обновлений",
|
||||||
|
"autoCheckUpdateDesc": "Автоматически проверять обновления при запуске приложения",
|
||||||
|
"accessControl": "Контроль доступа",
|
||||||
|
"accessControlDesc": "Настройка доступа приложений к прокси",
|
||||||
|
"application": "Приложение",
|
||||||
|
"applicationDesc": "Изменение настроек, связанных с приложением",
|
||||||
|
"edit": "Редактировать",
|
||||||
|
"confirm": "Подтвердить",
|
||||||
|
"update": "Обновить",
|
||||||
|
"add": "Добавить",
|
||||||
|
"save": "Сохранить",
|
||||||
|
"delete": "Удалить",
|
||||||
|
"years": "Лет",
|
||||||
|
"months": "Месяцев",
|
||||||
|
"hours": "Часов",
|
||||||
|
"days": "Дней",
|
||||||
|
"minutes": "Минут",
|
||||||
|
"seconds": "Секунд",
|
||||||
|
"ago": " назад",
|
||||||
|
"just": "Только что",
|
||||||
|
"qrcode": "QR-код",
|
||||||
|
"qrcodeDesc": "Сканируйте QR-код для получения профиля",
|
||||||
|
"url": "URL",
|
||||||
|
"urlDesc": "Получить профиль через URL",
|
||||||
|
"file": "Файл",
|
||||||
|
"fileDesc": "Прямая загрузка профиля",
|
||||||
|
"name": "Имя",
|
||||||
|
"profileNameNullValidationDesc": "Пожалуйста, введите имя профиля",
|
||||||
|
"profileUrlNullValidationDesc": "Пожалуйста, введите URL профиля",
|
||||||
|
"profileUrlInvalidValidationDesc": "Пожалуйста, введите действительный URL профиля",
|
||||||
|
"autoUpdate": "Автообновление",
|
||||||
|
"autoUpdateInterval": "Интервал автообновления (минуты)",
|
||||||
|
"profileAutoUpdateIntervalNullValidationDesc": "Пожалуйста, введите интервал времени для автообновления",
|
||||||
|
"profileAutoUpdateIntervalInvalidValidationDesc": "Пожалуйста, введите действительный формат интервала времени",
|
||||||
|
"themeMode": "Режим темы",
|
||||||
|
"themeColor": "Цвет темы",
|
||||||
|
"preview": "Предпросмотр",
|
||||||
|
"auto": "Авто",
|
||||||
|
"light": "Светлый",
|
||||||
|
"dark": "Темный",
|
||||||
|
"importFromURL": "Импорт из URL",
|
||||||
|
"submit": "Отправить",
|
||||||
|
"doYouWantToPass": "Вы хотите пропустить",
|
||||||
|
"create": "Создать",
|
||||||
|
"defaultSort": "Сортировка по умолчанию",
|
||||||
|
"delaySort": "Сортировка по задержке",
|
||||||
|
"nameSort": "Сортировка по имени",
|
||||||
|
"pleaseUploadFile": "Пожалуйста, загрузите файл",
|
||||||
|
"pleaseUploadValidQrcode": "Пожалуйста, загрузите действительный QR-код",
|
||||||
|
"blacklistMode": "Режим черного списка",
|
||||||
|
"whitelistMode": "Режим белого списка",
|
||||||
|
"filterSystemApp": "Фильтровать системные приложения",
|
||||||
|
"cancelFilterSystemApp": "Отменить фильтрацию системных приложений",
|
||||||
|
"selectAll": "Выбрать все",
|
||||||
|
"cancelSelectAll": "Отменить выбор всего",
|
||||||
|
"appAccessControl": "Контроль доступа приложений",
|
||||||
|
"accessControlAllowDesc": "Разрешить только выбранным приложениям доступ к VPN",
|
||||||
|
"accessControlNotAllowDesc": "Выбранные приложения будут исключены из VPN",
|
||||||
|
"selected": "Выбрано",
|
||||||
|
"unableToUpdateCurrentProfileDesc": "невозможно обновить текущий профиль",
|
||||||
|
"noMoreInfoDesc": "Нет дополнительной информации",
|
||||||
|
"profileParseErrorDesc": "ошибка разбора профиля",
|
||||||
|
"proxyPort": "Порт прокси",
|
||||||
|
"proxyPortDesc": "Установить порт прослушивания Clash",
|
||||||
|
"port": "Порт",
|
||||||
|
"logLevel": "Уровень логов",
|
||||||
|
"show": "Показать",
|
||||||
|
"exit": "Выход",
|
||||||
|
"systemProxy": "Системный прокси",
|
||||||
|
"project": "Проект",
|
||||||
|
"core": "Ядро",
|
||||||
|
"tabAnimation": "Анимация вкладок",
|
||||||
|
"tabAnimationDesc": "При включении домашняя вкладка добавит анимацию переключения",
|
||||||
|
"desc": "Многоплатформенный прокси-клиент на основе ClashMeta, простой и удобный в использовании, с открытым исходным кодом и без рекламы.",
|
||||||
|
"startVpn": "Запуск VPN...",
|
||||||
|
"stopVpn": "Остановка VPN...",
|
||||||
|
"discovery": "Обнаружена новая версия",
|
||||||
|
"compatible": "Режим совместимости",
|
||||||
|
"compatibleDesc": "Включение приведет к потере части функциональности приложения, но обеспечит полную поддержку Clash.",
|
||||||
|
"notSelectedTip": "Текущая группа прокси не может быть выбрана.",
|
||||||
|
"tip": "подсказка",
|
||||||
|
"backupAndRecovery": "Резервное копирование и восстановление",
|
||||||
|
"backupAndRecoveryDesc": "Синхронизация данных через WebDAV или файл",
|
||||||
|
"account": "Аккаунт",
|
||||||
|
"backup": "Резервное копирование",
|
||||||
|
"recovery": "Восстановление",
|
||||||
|
"recoveryProfiles": "Только восстановление профилей",
|
||||||
|
"recoveryAll": "Восстановить все данные",
|
||||||
|
"recoverySuccess": "Восстановление успешно",
|
||||||
|
"backupSuccess": "Резервное копирование успешно",
|
||||||
|
"noInfo": "Нет информации",
|
||||||
|
"pleaseBindWebDAV": "Пожалуйста, привяжите WebDAV",
|
||||||
|
"bind": "Привязать",
|
||||||
|
"connectivity": "Связь:",
|
||||||
|
"webDAVConfiguration": "Конфигурация WebDAV",
|
||||||
|
"address": "Адрес",
|
||||||
|
"addressHelp": "Адрес сервера WebDAV",
|
||||||
|
"addressTip": "Пожалуйста, введите действительный адрес WebDAV",
|
||||||
|
"password": "Пароль",
|
||||||
|
"passwordTip": "Пароль не может быть пустым",
|
||||||
|
"accountTip": "Аккаунт не может быть пустым",
|
||||||
|
"checkUpdate": "Проверить обновления",
|
||||||
|
"discoverNewVersion": "Обнаружена новая версия",
|
||||||
|
"checkUpdateError": "Текущее приложение уже является последней версией",
|
||||||
|
"goDownload": "Перейти к загрузке",
|
||||||
|
"unknown": "Неизвестно",
|
||||||
|
"geoData": "Геоданные",
|
||||||
|
"externalResources": "Внешние ресурсы",
|
||||||
|
"checking": "Проверка...",
|
||||||
|
"country": "Страна",
|
||||||
|
"checkError": "Ошибка проверки",
|
||||||
|
"search": "Поиск",
|
||||||
|
"allowBypass": "Разрешить приложениям обходить VPN",
|
||||||
|
"allowBypassDesc": "Некоторые приложения могут обходить VPN при включении",
|
||||||
|
"externalController": "Внешний контроллер",
|
||||||
|
"externalControllerDesc": "При включении ядро Clash можно контролировать на порту 9090",
|
||||||
|
"ipv6Desc": "При включении будет возможно получать IPv6 трафик",
|
||||||
|
"app": "Приложение",
|
||||||
|
"general": "Общие",
|
||||||
|
"vpnSystemProxyDesc": "Прикрепить HTTP-прокси к VpnService",
|
||||||
|
"systemProxyDesc": "Прикрепить HTTP-прокси к VpnService",
|
||||||
|
"unifiedDelay": "Унифицированная задержка",
|
||||||
|
"unifiedDelayDesc": "Убрать дополнительные задержки, такие как рукопожатие",
|
||||||
|
"tcpConcurrent": "TCP параллелизм",
|
||||||
|
"tcpConcurrentDesc": "Включение позволит использовать параллелизм TCP",
|
||||||
|
"geodataLoader": "Режим низкого потребления памяти для геоданных",
|
||||||
|
"geodataLoaderDesc": "Включение будет использовать загрузчик геоданных с низким потреблением памяти",
|
||||||
|
"requests": "Запросы",
|
||||||
|
"requestsDesc": "Просмотр последних записей запросов",
|
||||||
|
"findProcessMode": "Режим поиска процесса",
|
||||||
|
"findProcessModeDesc": "Есть риск сбоя после включения",
|
||||||
|
"init": "Инициализация",
|
||||||
|
"infiniteTime": "Долгосрочное действие",
|
||||||
|
"expirationTime": "Время истечения",
|
||||||
|
"connections": "Соединения",
|
||||||
|
"connectionsDesc": "Просмотр текущих данных о соединениях",
|
||||||
|
"nullRequestsDesc": "Нет запросов",
|
||||||
|
"nullConnectionsDesc": "Нет соединений",
|
||||||
|
"intranetIP": "Внутренний IP",
|
||||||
|
"view": "Просмотр",
|
||||||
|
"cut": "Вырезать",
|
||||||
|
"copy": "Копировать",
|
||||||
|
"paste": "Вставить",
|
||||||
|
"testUrl": "Тест URL",
|
||||||
|
"sync": "Синхронизация",
|
||||||
|
"exclude": "Скрыть из последних задач",
|
||||||
|
"excludeDesc": "Когда приложение находится в фоновом режиме, оно скрыто из последних задач",
|
||||||
|
"oneColumn": "Один столбец",
|
||||||
|
"twoColumns": "Два столбца",
|
||||||
|
"threeColumns": "Три столбца",
|
||||||
|
"fourColumns": "Четыре столбца",
|
||||||
|
"expand": "Стандартный",
|
||||||
|
"shrink": "Сжать",
|
||||||
|
"min": "Мин",
|
||||||
|
"tab": "Вкладка",
|
||||||
|
"list": "Список",
|
||||||
|
"delay": "Задержка",
|
||||||
|
"style": "Стиль",
|
||||||
|
"size": "Размер",
|
||||||
|
"sort": "Сортировка",
|
||||||
|
"columns": "Столбцы",
|
||||||
|
"proxiesSetting": "Настройка прокси",
|
||||||
|
"proxyGroup": "Группа прокси",
|
||||||
|
"go": "Перейти",
|
||||||
|
"externalLink": "Внешняя ссылка",
|
||||||
|
"otherContributors": "Другие участники",
|
||||||
|
"autoCloseConnections": "Автоматическое закрытие соединений",
|
||||||
|
"autoCloseConnectionsDesc": "Автоматически закрывать соединения после смены узла",
|
||||||
|
"onlyStatisticsProxy": "Только статистика прокси",
|
||||||
|
"onlyStatisticsProxyDesc": "При включении будет учитываться только трафик прокси",
|
||||||
|
"deleteProfileTip": "Вы уверены, что хотите удалить текущий профиль?",
|
||||||
|
"pureBlackMode": "Чисто черный режим",
|
||||||
|
"keepAliveIntervalDesc": "Интервал поддержания TCP-соединения",
|
||||||
|
"entries": " записей",
|
||||||
|
"local": "Локальный",
|
||||||
|
"remote": "Удаленный",
|
||||||
|
"remoteBackupDesc": "Резервное копирование локальных данных на WebDAV",
|
||||||
|
"remoteRecoveryDesc": "Восстановление данных с WebDAV",
|
||||||
|
"localBackupDesc": "Резервное копирование локальных данных на локальный диск",
|
||||||
|
"localRecoveryDesc": "Восстановление данных из файла",
|
||||||
|
"mode": "Режим",
|
||||||
|
"time": "Время",
|
||||||
|
"source": "Источник",
|
||||||
|
"allApps": "Все приложения",
|
||||||
|
"onlyOtherApps": "Только сторонние приложения",
|
||||||
|
"action": "Действие",
|
||||||
|
"intelligentSelected": "Интеллектуальный выбор",
|
||||||
|
"clipboardImport": "Импорт из буфера обмена",
|
||||||
|
"clipboardExport": "Экспорт в буфер обмена",
|
||||||
|
"layout": "Макет",
|
||||||
|
"tight": "Плотный",
|
||||||
|
"standard": "Стандартный",
|
||||||
|
"loose": "Свободный",
|
||||||
|
"profilesSort": "Сортировка профилей",
|
||||||
|
"start": "Старт",
|
||||||
|
"stop": "Стоп",
|
||||||
|
"appDesc": "Обработка настроек, связанных с приложением",
|
||||||
|
"vpnDesc": "Изменение настроек, связанных с VPN",
|
||||||
|
"generalDesc": "Переопределение общих настроек",
|
||||||
|
"dnsDesc": "Обновление настроек, связанных с DNS",
|
||||||
|
"key": "Ключ",
|
||||||
|
"value": "Значение",
|
||||||
|
"notEmpty": "Не может быть пустым",
|
||||||
|
"hostsDesc": "Добавить Hosts",
|
||||||
|
"vpnTip": "Изменения вступят в силу после перезапуска VPN",
|
||||||
|
"vpnEnableDesc": "Автоматически направляет весь системный трафик через VpnService",
|
||||||
|
"options": "Опции",
|
||||||
|
"loopback": "Инструмент разблокировки Loopback",
|
||||||
|
"loopbackDesc": "Используется для разблокировки Loopback UWP",
|
||||||
|
"providers": "Провайдеры",
|
||||||
|
"proxyProviders": "Провайдеры прокси",
|
||||||
|
"ruleProviders": "Провайдеры правил",
|
||||||
|
"overrideDns": "Переопределить DNS",
|
||||||
|
"overrideDnsDesc": "Включение переопределит настройки DNS в профиле",
|
||||||
|
"status": "Статус",
|
||||||
|
"statusDesc": "Системный DNS будет использоваться при выключении",
|
||||||
|
"preferH3Desc": "Приоритетное использование HTTP/3 для DOH",
|
||||||
|
"respectRules": "Соблюдение правил",
|
||||||
|
"respectRulesDesc": "DNS-соединение следует правилам, необходимо настроить proxy-server-nameserver",
|
||||||
|
"dnsMode": "Режим DNS",
|
||||||
|
"fakeipRange": "Диапазон Fakeip",
|
||||||
|
"fakeipFilter": "Фильтр Fakeip",
|
||||||
|
"defaultNameserver": "Сервер имен по умолчанию",
|
||||||
|
"defaultNameserverDesc": "Для разрешения DNS-сервера",
|
||||||
|
"nameserver": "Сервер имен",
|
||||||
|
"nameserverDesc": "Для разрешения домена",
|
||||||
|
"useHosts": "Использовать hosts",
|
||||||
|
"useSystemHosts": "Использовать системные hosts",
|
||||||
|
"nameserverPolicy": "Политика сервера имен",
|
||||||
|
"nameserverPolicyDesc": "Указать соответствующую политику сервера имен",
|
||||||
|
"proxyNameserver": "Прокси-сервер имен",
|
||||||
|
"proxyNameserverDesc": "Домен для разрешения прокси-узлов",
|
||||||
|
"fallback": "Резервный",
|
||||||
|
"fallbackDesc": "Обычно используется оффшорный DNS",
|
||||||
|
"fallbackFilter": "Фильтр резервного DNS",
|
||||||
|
"geoipCode": "Код Geoip",
|
||||||
|
"ipcidr": "IPCIDR",
|
||||||
|
"domain": "Домен",
|
||||||
|
"reset": "Сброс",
|
||||||
|
"action_view": "Показать/Скрыть",
|
||||||
|
"action_start": "Старт/Стоп",
|
||||||
|
"action_mode": "Переключить режим",
|
||||||
|
"action_proxy": "Системный прокси",
|
||||||
|
"action_tun": "TUN",
|
||||||
|
"disclaimer": "Отказ от ответственности",
|
||||||
|
"disclaimerDesc": "Это программное обеспечение используется только в некоммерческих целях, таких как учебные обмены и научные исследования. Запрещено использовать это программное обеспечение в коммерческих целях. Любая коммерческая деятельность, если таковая имеется, не имеет отношения к этому программному обеспечению.",
|
||||||
|
"agree": "Согласен",
|
||||||
|
"hotkeyManagement": "Управление горячими клавишами",
|
||||||
|
"hotkeyManagementDesc": "Использование клавиатуры для управления приложением",
|
||||||
|
"pressKeyboard": "Пожалуйста, нажмите клавишу.",
|
||||||
|
"inputCorrectHotkey": "Пожалуйста, введите правильную горячую клавишу",
|
||||||
|
"hotkeyConflict": "Конфликт горячих клавиш",
|
||||||
|
"remove": "Удалить",
|
||||||
|
"noHotKey": "Нет горячей клавиши",
|
||||||
|
"noNetwork": "Нет сети",
|
||||||
|
"ipv6InboundDesc": "Разрешить входящий IPv6",
|
||||||
|
"exportLogs": "Экспорт логов",
|
||||||
|
"exportSuccess": "Экспорт успешен",
|
||||||
|
"iconStyle": "Стиль иконки",
|
||||||
|
"onlyIcon": "Только иконка",
|
||||||
|
"noIcon": "Нет иконки",
|
||||||
|
"stackMode": "Режим стека",
|
||||||
|
"network": "Сеть",
|
||||||
|
"networkDesc": "Изменение настроек, связанных с сетью",
|
||||||
|
"bypassDomain": "Обход домена",
|
||||||
|
"bypassDomainDesc": "Действует только при включенном системном прокси",
|
||||||
|
"resetTip": "Убедитесь, что хотите сбросить",
|
||||||
|
"regExp": "Регулярное выражение",
|
||||||
|
"icon": "Иконка",
|
||||||
|
"iconConfiguration": "Конфигурация иконки",
|
||||||
|
"noData": "Нет данных",
|
||||||
|
"adminAutoLaunch": "Автозапуск с правами администратора",
|
||||||
|
"adminAutoLaunchDesc": "Запуск с правами администратора при загрузке системы",
|
||||||
|
"fontFamily": "Семейство шрифтов",
|
||||||
|
"systemFont": "Системный шрифт",
|
||||||
|
"toggle": "Переключить",
|
||||||
|
"system": "Система",
|
||||||
|
"routeMode": "Режим маршрутизации",
|
||||||
|
"routeMode_bypassPrivate": "Обход частных адресов маршрутизации",
|
||||||
|
"routeMode_config": "Использовать конфигурацию",
|
||||||
|
"routeAddress": "Адрес маршрутизации",
|
||||||
|
"routeAddressDesc": "Настройка адреса прослушивания маршрутизации",
|
||||||
|
"pleaseInputAdminPassword": "Пожалуйста, введите пароль администратора",
|
||||||
|
"copyEnvVar": "Копирование переменных окружения",
|
||||||
|
"memoryInfo": "Информация о памяти",
|
||||||
|
"cancel": "Отмена",
|
||||||
|
"fileIsUpdate": "Файл был изменен. Хотите сохранить изменения?",
|
||||||
|
"profileHasUpdate": "Профиль был изменен. Хотите отключить автообновление?",
|
||||||
|
"hasCacheChange": "Хотите сохранить изменения в кэше?",
|
||||||
|
"nullProxies": "Нет прокси",
|
||||||
|
"copySuccess": "Копирование успешно",
|
||||||
|
"copyLink": "Копировать ссылку",
|
||||||
|
"exportFile": "Экспорт файла",
|
||||||
|
"cacheCorrupt": "Кэш поврежден. Хотите очистить его?",
|
||||||
|
"detectionTip": "Опирается на сторонний API, только для справки",
|
||||||
|
"listen": "Слушать"
|
||||||
|
}
|
||||||
@@ -30,6 +30,8 @@
|
|||||||
"other": "其他",
|
"other": "其他",
|
||||||
"about": "关于",
|
"about": "关于",
|
||||||
"en": "英语",
|
"en": "英语",
|
||||||
|
"ja": "日语",
|
||||||
|
"ru": "俄语",
|
||||||
"zh_CN": "中文简体",
|
"zh_CN": "中文简体",
|
||||||
"theme": "主题",
|
"theme": "主题",
|
||||||
"themeDesc": "设置深色模式,调整色彩",
|
"themeDesc": "设置深色模式,调整色彩",
|
||||||
@@ -220,7 +222,7 @@
|
|||||||
"onlyStatisticsProxy": "仅统计代理",
|
"onlyStatisticsProxy": "仅统计代理",
|
||||||
"onlyStatisticsProxyDesc": "开启后,将只统计代理流量",
|
"onlyStatisticsProxyDesc": "开启后,将只统计代理流量",
|
||||||
"deleteProfileTip": "确定要删除当前配置吗?",
|
"deleteProfileTip": "确定要删除当前配置吗?",
|
||||||
"prueBlackMode": "纯黑模式",
|
"pureBlackMode": "纯黑模式",
|
||||||
"keepAliveIntervalDesc": "TCP保持活动间隔",
|
"keepAliveIntervalDesc": "TCP保持活动间隔",
|
||||||
"entries": "个条目",
|
"entries": "个条目",
|
||||||
"local": "本地",
|
"local": "本地",
|
||||||
@@ -343,5 +345,6 @@
|
|||||||
"copyLink": "复制链接",
|
"copyLink": "复制链接",
|
||||||
"exportFile": "导出文件",
|
"exportFile": "导出文件",
|
||||||
"cacheCorrupt": "缓存已损坏,是否清空?",
|
"cacheCorrupt": "缓存已损坏,是否清空?",
|
||||||
"detectionTip": "依赖第三方api仅供参考"
|
"detectionTip": "依赖第三方api,仅供参考",
|
||||||
|
"listen": "监听"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,15 @@ import 'package:intl/message_lookup_by_library.dart';
|
|||||||
import 'package:intl/src/intl_helpers.dart';
|
import 'package:intl/src/intl_helpers.dart';
|
||||||
|
|
||||||
import 'messages_en.dart' as messages_en;
|
import 'messages_en.dart' as messages_en;
|
||||||
|
import 'messages_ja.dart' as messages_ja;
|
||||||
|
import 'messages_ru.dart' as messages_ru;
|
||||||
import 'messages_zh_CN.dart' as messages_zh_cn;
|
import 'messages_zh_CN.dart' as messages_zh_cn;
|
||||||
|
|
||||||
typedef Future<dynamic> LibraryLoader();
|
typedef Future<dynamic> LibraryLoader();
|
||||||
Map<String, LibraryLoader> _deferredLibraries = {
|
Map<String, LibraryLoader> _deferredLibraries = {
|
||||||
'en': () => new SynchronousFuture(null),
|
'en': () => new SynchronousFuture(null),
|
||||||
|
'ja': () => new SynchronousFuture(null),
|
||||||
|
'ru': () => new SynchronousFuture(null),
|
||||||
'zh_CN': () => new SynchronousFuture(null),
|
'zh_CN': () => new SynchronousFuture(null),
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -29,6 +33,10 @@ MessageLookupByLibrary? _findExact(String localeName) {
|
|||||||
switch (localeName) {
|
switch (localeName) {
|
||||||
case 'en':
|
case 'en':
|
||||||
return messages_en.messages;
|
return messages_en.messages;
|
||||||
|
case 'ja':
|
||||||
|
return messages_ja.messages;
|
||||||
|
case 'ru':
|
||||||
|
return messages_ru.messages;
|
||||||
case 'zh_CN':
|
case 'zh_CN':
|
||||||
return messages_zh_cn.messages;
|
return messages_zh_cn.messages;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Auto check for updates when the app starts",
|
"Auto check for updates when the app starts",
|
||||||
),
|
),
|
||||||
"autoCloseConnections": MessageLookupByLibrary.simpleMessage(
|
"autoCloseConnections": MessageLookupByLibrary.simpleMessage(
|
||||||
"Auto lose connections",
|
"Auto close connections",
|
||||||
),
|
),
|
||||||
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Auto close connections after change node",
|
"Auto close connections after change node",
|
||||||
@@ -296,6 +296,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage(
|
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Allow IPv6 inbound",
|
"Allow IPv6 inbound",
|
||||||
),
|
),
|
||||||
|
"ja": MessageLookupByLibrary.simpleMessage("Japanese"),
|
||||||
"just": MessageLookupByLibrary.simpleMessage("Just"),
|
"just": MessageLookupByLibrary.simpleMessage("Just"),
|
||||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Tcp keep alive interval",
|
"Tcp keep alive interval",
|
||||||
@@ -305,6 +306,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"layout": MessageLookupByLibrary.simpleMessage("Layout"),
|
"layout": MessageLookupByLibrary.simpleMessage("Layout"),
|
||||||
"light": MessageLookupByLibrary.simpleMessage("Light"),
|
"light": MessageLookupByLibrary.simpleMessage("Light"),
|
||||||
"list": MessageLookupByLibrary.simpleMessage("List"),
|
"list": MessageLookupByLibrary.simpleMessage("List"),
|
||||||
|
"listen": MessageLookupByLibrary.simpleMessage("Listen"),
|
||||||
"local": MessageLookupByLibrary.simpleMessage("Local"),
|
"local": MessageLookupByLibrary.simpleMessage("Local"),
|
||||||
"localBackupDesc": MessageLookupByLibrary.simpleMessage(
|
"localBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Backup local data to local",
|
"Backup local data to local",
|
||||||
@@ -470,7 +472,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Set the Clash listening port",
|
"Set the Clash listening port",
|
||||||
),
|
),
|
||||||
"proxyProviders": MessageLookupByLibrary.simpleMessage("Proxy providers"),
|
"proxyProviders": MessageLookupByLibrary.simpleMessage("Proxy providers"),
|
||||||
"prueBlackMode": MessageLookupByLibrary.simpleMessage("Prue black mode"),
|
"pureBlackMode": MessageLookupByLibrary.simpleMessage("Pure black mode"),
|
||||||
"qrcode": MessageLookupByLibrary.simpleMessage("QR code"),
|
"qrcode": MessageLookupByLibrary.simpleMessage("QR code"),
|
||||||
"qrcodeDesc": MessageLookupByLibrary.simpleMessage(
|
"qrcodeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
"Scan QR code to obtain profile",
|
"Scan QR code to obtain profile",
|
||||||
@@ -513,6 +515,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"Bypass private route address",
|
"Bypass private route address",
|
||||||
),
|
),
|
||||||
"routeMode_config": MessageLookupByLibrary.simpleMessage("Use config"),
|
"routeMode_config": MessageLookupByLibrary.simpleMessage("Use config"),
|
||||||
|
"ru": MessageLookupByLibrary.simpleMessage("Russian"),
|
||||||
"rule": MessageLookupByLibrary.simpleMessage("Rule"),
|
"rule": MessageLookupByLibrary.simpleMessage("Rule"),
|
||||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("Rule providers"),
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("Rule providers"),
|
||||||
"save": MessageLookupByLibrary.simpleMessage("Save"),
|
"save": MessageLookupByLibrary.simpleMessage("Save"),
|
||||||
|
|||||||
472
lib/l10n/intl/messages_ja.dart
Normal file
472
lib/l10n/intl/messages_ja.dart
Normal file
@@ -0,0 +1,472 @@
|
|||||||
|
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
|
||||||
|
// This is a library that provides messages for a ja locale. All the
|
||||||
|
// messages from the main program should be duplicated here with the same
|
||||||
|
// function name.
|
||||||
|
|
||||||
|
// Ignore issues from commonly used lints in this file.
|
||||||
|
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
|
||||||
|
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
|
||||||
|
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
|
||||||
|
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
|
||||||
|
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
|
||||||
|
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:intl/message_lookup_by_library.dart';
|
||||||
|
|
||||||
|
final messages = new MessageLookup();
|
||||||
|
|
||||||
|
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
||||||
|
|
||||||
|
class MessageLookup extends MessageLookupByLibrary {
|
||||||
|
String get localeName => 'ja';
|
||||||
|
|
||||||
|
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||||
|
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||||
|
"about": MessageLookupByLibrary.simpleMessage("について"),
|
||||||
|
"accessControl": MessageLookupByLibrary.simpleMessage("アクセス制御"),
|
||||||
|
"accessControlAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"選択したアプリのみVPNを許可",
|
||||||
|
),
|
||||||
|
"accessControlDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"アプリケーションのプロキシアクセスを設定",
|
||||||
|
),
|
||||||
|
"accessControlNotAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"選択したアプリをVPNから除外",
|
||||||
|
),
|
||||||
|
"account": MessageLookupByLibrary.simpleMessage("アカウント"),
|
||||||
|
"accountTip": MessageLookupByLibrary.simpleMessage("アカウントは必須です"),
|
||||||
|
"action": MessageLookupByLibrary.simpleMessage("アクション"),
|
||||||
|
"action_mode": MessageLookupByLibrary.simpleMessage("モード切替"),
|
||||||
|
"action_proxy": MessageLookupByLibrary.simpleMessage("システムプロキシ"),
|
||||||
|
"action_start": MessageLookupByLibrary.simpleMessage("開始/停止"),
|
||||||
|
"action_tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||||
|
"action_view": MessageLookupByLibrary.simpleMessage("表示/非表示"),
|
||||||
|
"add": MessageLookupByLibrary.simpleMessage("追加"),
|
||||||
|
"address": MessageLookupByLibrary.simpleMessage("アドレス"),
|
||||||
|
"addressHelp": MessageLookupByLibrary.simpleMessage("WebDAVサーバーアドレス"),
|
||||||
|
"addressTip": MessageLookupByLibrary.simpleMessage("有効なWebDAVアドレスを入力"),
|
||||||
|
"adminAutoLaunch": MessageLookupByLibrary.simpleMessage("管理者自動起動"),
|
||||||
|
"adminAutoLaunchDesc": MessageLookupByLibrary.simpleMessage("管理者モードで起動"),
|
||||||
|
"ago": MessageLookupByLibrary.simpleMessage("前"),
|
||||||
|
"agree": MessageLookupByLibrary.simpleMessage("同意"),
|
||||||
|
"allApps": MessageLookupByLibrary.simpleMessage("全アプリ"),
|
||||||
|
"allowBypass": MessageLookupByLibrary.simpleMessage("アプリがVPNをバイパスすることを許可"),
|
||||||
|
"allowBypassDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化すると一部アプリがVPNをバイパス",
|
||||||
|
),
|
||||||
|
"allowLan": MessageLookupByLibrary.simpleMessage("LANを許可"),
|
||||||
|
"allowLanDesc": MessageLookupByLibrary.simpleMessage("LAN経由でのプロキシアクセスを許可"),
|
||||||
|
"app": MessageLookupByLibrary.simpleMessage("アプリ"),
|
||||||
|
"appAccessControl": MessageLookupByLibrary.simpleMessage("アプリアクセス制御"),
|
||||||
|
"appDesc": MessageLookupByLibrary.simpleMessage("アプリ関連設定の処理"),
|
||||||
|
"application": MessageLookupByLibrary.simpleMessage("アプリケーション"),
|
||||||
|
"applicationDesc": MessageLookupByLibrary.simpleMessage("アプリ関連設定を変更"),
|
||||||
|
"auto": MessageLookupByLibrary.simpleMessage("自動"),
|
||||||
|
"autoCheckUpdate": MessageLookupByLibrary.simpleMessage("自動更新チェック"),
|
||||||
|
"autoCheckUpdateDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"起動時に更新を自動チェック",
|
||||||
|
),
|
||||||
|
"autoCloseConnections": MessageLookupByLibrary.simpleMessage("接続を自動閉じる"),
|
||||||
|
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"ノード変更後に接続を自動閉じる",
|
||||||
|
),
|
||||||
|
"autoLaunch": MessageLookupByLibrary.simpleMessage("自動起動"),
|
||||||
|
"autoLaunchDesc": MessageLookupByLibrary.simpleMessage("システムの自動起動に従う"),
|
||||||
|
"autoRun": MessageLookupByLibrary.simpleMessage("自動実行"),
|
||||||
|
"autoRunDesc": MessageLookupByLibrary.simpleMessage("アプリ起動時に自動実行"),
|
||||||
|
"autoUpdate": MessageLookupByLibrary.simpleMessage("自動更新"),
|
||||||
|
"autoUpdateInterval": MessageLookupByLibrary.simpleMessage("自動更新間隔(分)"),
|
||||||
|
"backup": MessageLookupByLibrary.simpleMessage("バックアップ"),
|
||||||
|
"backupAndRecovery": MessageLookupByLibrary.simpleMessage("バックアップと復元"),
|
||||||
|
"backupAndRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"WebDAVまたはファイルでデータを同期",
|
||||||
|
),
|
||||||
|
"backupSuccess": MessageLookupByLibrary.simpleMessage("バックアップ成功"),
|
||||||
|
"bind": MessageLookupByLibrary.simpleMessage("バインド"),
|
||||||
|
"blacklistMode": MessageLookupByLibrary.simpleMessage("ブラックリストモード"),
|
||||||
|
"bypassDomain": MessageLookupByLibrary.simpleMessage("バイパスドメイン"),
|
||||||
|
"bypassDomainDesc": MessageLookupByLibrary.simpleMessage("システムプロキシ有効時のみ適用"),
|
||||||
|
"cacheCorrupt": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"キャッシュが破損しています。クリアしますか?",
|
||||||
|
),
|
||||||
|
"cancel": MessageLookupByLibrary.simpleMessage("キャンセル"),
|
||||||
|
"cancelFilterSystemApp": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"システムアプリの除外を解除",
|
||||||
|
),
|
||||||
|
"cancelSelectAll": MessageLookupByLibrary.simpleMessage("全選択解除"),
|
||||||
|
"checkError": MessageLookupByLibrary.simpleMessage("確認エラー"),
|
||||||
|
"checkUpdate": MessageLookupByLibrary.simpleMessage("更新を確認"),
|
||||||
|
"checkUpdateError": MessageLookupByLibrary.simpleMessage("アプリは最新版です"),
|
||||||
|
"checking": MessageLookupByLibrary.simpleMessage("確認中..."),
|
||||||
|
"clipboardExport": MessageLookupByLibrary.simpleMessage("クリップボードにエクスポート"),
|
||||||
|
"clipboardImport": MessageLookupByLibrary.simpleMessage("クリップボードからインポート"),
|
||||||
|
"columns": MessageLookupByLibrary.simpleMessage("列"),
|
||||||
|
"compatible": MessageLookupByLibrary.simpleMessage("互換モード"),
|
||||||
|
"compatibleDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化すると一部機能を失いますが、Clashの完全サポートを獲得",
|
||||||
|
),
|
||||||
|
"confirm": MessageLookupByLibrary.simpleMessage("確認"),
|
||||||
|
"connections": MessageLookupByLibrary.simpleMessage("接続"),
|
||||||
|
"connectionsDesc": MessageLookupByLibrary.simpleMessage("現在の接続データを表示"),
|
||||||
|
"connectivity": MessageLookupByLibrary.simpleMessage("接続性:"),
|
||||||
|
"copy": MessageLookupByLibrary.simpleMessage("コピー"),
|
||||||
|
"copyEnvVar": MessageLookupByLibrary.simpleMessage("環境変数をコピー"),
|
||||||
|
"copyLink": MessageLookupByLibrary.simpleMessage("リンクをコピー"),
|
||||||
|
"copySuccess": MessageLookupByLibrary.simpleMessage("コピー成功"),
|
||||||
|
"core": MessageLookupByLibrary.simpleMessage("コア"),
|
||||||
|
"coreInfo": MessageLookupByLibrary.simpleMessage("コア情報"),
|
||||||
|
"country": MessageLookupByLibrary.simpleMessage("国"),
|
||||||
|
"create": MessageLookupByLibrary.simpleMessage("作成"),
|
||||||
|
"cut": MessageLookupByLibrary.simpleMessage("切り取り"),
|
||||||
|
"dark": MessageLookupByLibrary.simpleMessage("ダーク"),
|
||||||
|
"dashboard": MessageLookupByLibrary.simpleMessage("ダッシュボード"),
|
||||||
|
"days": MessageLookupByLibrary.simpleMessage("日"),
|
||||||
|
"defaultNameserver": MessageLookupByLibrary.simpleMessage("デフォルトネームサーバー"),
|
||||||
|
"defaultNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"DNSサーバーの解決用",
|
||||||
|
),
|
||||||
|
"defaultSort": MessageLookupByLibrary.simpleMessage("デフォルト順"),
|
||||||
|
"defaultText": MessageLookupByLibrary.simpleMessage("デフォルト"),
|
||||||
|
"delay": MessageLookupByLibrary.simpleMessage("遅延"),
|
||||||
|
"delaySort": MessageLookupByLibrary.simpleMessage("遅延順"),
|
||||||
|
"delete": MessageLookupByLibrary.simpleMessage("削除"),
|
||||||
|
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"現在のプロファイルを削除しますか?",
|
||||||
|
),
|
||||||
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"ClashMetaベースのマルチプラットフォームプロキシクライアント。シンプルで使いやすく、オープンソースで広告なし。",
|
||||||
|
),
|
||||||
|
"detectionTip": MessageLookupByLibrary.simpleMessage("サードパーティAPIに依存(参考値)"),
|
||||||
|
"direct": MessageLookupByLibrary.simpleMessage("ダイレクト"),
|
||||||
|
"disclaimer": MessageLookupByLibrary.simpleMessage("免責事項"),
|
||||||
|
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"本ソフトウェアは学習交流や科学研究などの非営利目的でのみ使用されます。商用利用は厳禁です。いかなる商用活動も本ソフトウェアとは無関係です。",
|
||||||
|
),
|
||||||
|
"discoverNewVersion": MessageLookupByLibrary.simpleMessage("新バージョンを発見"),
|
||||||
|
"discovery": MessageLookupByLibrary.simpleMessage("新しいバージョンを発見"),
|
||||||
|
"dnsDesc": MessageLookupByLibrary.simpleMessage("DNS関連設定の更新"),
|
||||||
|
"dnsMode": MessageLookupByLibrary.simpleMessage("DNSモード"),
|
||||||
|
"doYouWantToPass": MessageLookupByLibrary.simpleMessage("通過させますか?"),
|
||||||
|
"domain": MessageLookupByLibrary.simpleMessage("ドメイン"),
|
||||||
|
"download": MessageLookupByLibrary.simpleMessage("ダウンロード"),
|
||||||
|
"edit": MessageLookupByLibrary.simpleMessage("編集"),
|
||||||
|
"en": MessageLookupByLibrary.simpleMessage("英語"),
|
||||||
|
"entries": MessageLookupByLibrary.simpleMessage(" エントリ"),
|
||||||
|
"exclude": MessageLookupByLibrary.simpleMessage("最近のタスクから非表示"),
|
||||||
|
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"アプリがバックグラウンド時に最近のタスクから非表示",
|
||||||
|
),
|
||||||
|
"exit": MessageLookupByLibrary.simpleMessage("終了"),
|
||||||
|
"expand": MessageLookupByLibrary.simpleMessage("標準"),
|
||||||
|
"expirationTime": MessageLookupByLibrary.simpleMessage("有効期限"),
|
||||||
|
"exportFile": MessageLookupByLibrary.simpleMessage("ファイルをエクスポート"),
|
||||||
|
"exportLogs": MessageLookupByLibrary.simpleMessage("ログをエクスポート"),
|
||||||
|
"exportSuccess": MessageLookupByLibrary.simpleMessage("エクスポート成功"),
|
||||||
|
"externalController": MessageLookupByLibrary.simpleMessage("外部コントローラー"),
|
||||||
|
"externalControllerDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化するとClashコアをポート9090で制御可能",
|
||||||
|
),
|
||||||
|
"externalLink": MessageLookupByLibrary.simpleMessage("外部リンク"),
|
||||||
|
"externalResources": MessageLookupByLibrary.simpleMessage("外部リソース"),
|
||||||
|
"fakeipFilter": MessageLookupByLibrary.simpleMessage("Fakeipフィルター"),
|
||||||
|
"fakeipRange": MessageLookupByLibrary.simpleMessage("Fakeip範囲"),
|
||||||
|
"fallback": MessageLookupByLibrary.simpleMessage("フォールバック"),
|
||||||
|
"fallbackDesc": MessageLookupByLibrary.simpleMessage("通常はオフショアDNSを使用"),
|
||||||
|
"fallbackFilter": MessageLookupByLibrary.simpleMessage("フォールバックフィルター"),
|
||||||
|
"file": MessageLookupByLibrary.simpleMessage("ファイル"),
|
||||||
|
"fileDesc": MessageLookupByLibrary.simpleMessage("プロファイルを直接アップロード"),
|
||||||
|
"fileIsUpdate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"ファイルが変更されました。保存しますか?",
|
||||||
|
),
|
||||||
|
"filterSystemApp": MessageLookupByLibrary.simpleMessage("システムアプリを除外"),
|
||||||
|
"findProcessMode": MessageLookupByLibrary.simpleMessage("プロセス検出"),
|
||||||
|
"findProcessModeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化するとフラッシュバックのリスクあり",
|
||||||
|
),
|
||||||
|
"fontFamily": MessageLookupByLibrary.simpleMessage("フォントファミリー"),
|
||||||
|
"fourColumns": MessageLookupByLibrary.simpleMessage("4列"),
|
||||||
|
"general": MessageLookupByLibrary.simpleMessage("一般"),
|
||||||
|
"generalDesc": MessageLookupByLibrary.simpleMessage("一般設定の上書き"),
|
||||||
|
"geoData": MessageLookupByLibrary.simpleMessage("地域データ"),
|
||||||
|
"geodataLoader": MessageLookupByLibrary.simpleMessage("Geo低メモリモード"),
|
||||||
|
"geodataLoaderDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化するとGeo低メモリローダーを使用",
|
||||||
|
),
|
||||||
|
"geoipCode": MessageLookupByLibrary.simpleMessage("GeoIPコード"),
|
||||||
|
"global": MessageLookupByLibrary.simpleMessage("グローバル"),
|
||||||
|
"go": MessageLookupByLibrary.simpleMessage("移動"),
|
||||||
|
"goDownload": MessageLookupByLibrary.simpleMessage("ダウンロードへ"),
|
||||||
|
"hasCacheChange": MessageLookupByLibrary.simpleMessage("変更をキャッシュしますか?"),
|
||||||
|
"hostsDesc": MessageLookupByLibrary.simpleMessage("ホストを追加"),
|
||||||
|
"hotkeyConflict": MessageLookupByLibrary.simpleMessage("ホットキー競合"),
|
||||||
|
"hotkeyManagement": MessageLookupByLibrary.simpleMessage("ホットキー管理"),
|
||||||
|
"hotkeyManagementDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"キーボードでアプリを制御",
|
||||||
|
),
|
||||||
|
"hours": MessageLookupByLibrary.simpleMessage("時間"),
|
||||||
|
"icon": MessageLookupByLibrary.simpleMessage("アイコン"),
|
||||||
|
"iconConfiguration": MessageLookupByLibrary.simpleMessage("アイコン設定"),
|
||||||
|
"iconStyle": MessageLookupByLibrary.simpleMessage("アイコンスタイル"),
|
||||||
|
"importFromURL": MessageLookupByLibrary.simpleMessage("URLからインポート"),
|
||||||
|
"infiniteTime": MessageLookupByLibrary.simpleMessage("長期有効"),
|
||||||
|
"init": MessageLookupByLibrary.simpleMessage("初期化"),
|
||||||
|
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage("正しいホットキーを入力"),
|
||||||
|
"intelligentSelected": MessageLookupByLibrary.simpleMessage("インテリジェント選択"),
|
||||||
|
"intranetIP": MessageLookupByLibrary.simpleMessage("イントラネットIP"),
|
||||||
|
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
||||||
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage("有効化するとIPv6トラフィックを受信可能"),
|
||||||
|
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage("IPv6インバウンドを許可"),
|
||||||
|
"ja": MessageLookupByLibrary.simpleMessage("日本語"),
|
||||||
|
"just": MessageLookupByLibrary.simpleMessage("たった今"),
|
||||||
|
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"TCPキープアライブ間隔",
|
||||||
|
),
|
||||||
|
"key": MessageLookupByLibrary.simpleMessage("キー"),
|
||||||
|
"language": MessageLookupByLibrary.simpleMessage("言語"),
|
||||||
|
"layout": MessageLookupByLibrary.simpleMessage("レイアウト"),
|
||||||
|
"light": MessageLookupByLibrary.simpleMessage("ライト"),
|
||||||
|
"list": MessageLookupByLibrary.simpleMessage("リスト"),
|
||||||
|
"listen": MessageLookupByLibrary.simpleMessage("リスン"),
|
||||||
|
"local": MessageLookupByLibrary.simpleMessage("ローカル"),
|
||||||
|
"localBackupDesc": MessageLookupByLibrary.simpleMessage("ローカルにデータをバックアップ"),
|
||||||
|
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage("ファイルからデータを復元"),
|
||||||
|
"logLevel": MessageLookupByLibrary.simpleMessage("ログレベル"),
|
||||||
|
"logcat": MessageLookupByLibrary.simpleMessage("ログキャット"),
|
||||||
|
"logcatDesc": MessageLookupByLibrary.simpleMessage("無効化するとログエントリを非表示"),
|
||||||
|
"logs": MessageLookupByLibrary.simpleMessage("ログ"),
|
||||||
|
"logsDesc": MessageLookupByLibrary.simpleMessage("ログキャプチャ記録"),
|
||||||
|
"loopback": MessageLookupByLibrary.simpleMessage("ループバック解除ツール"),
|
||||||
|
"loopbackDesc": MessageLookupByLibrary.simpleMessage("UWPループバック解除用"),
|
||||||
|
"loose": MessageLookupByLibrary.simpleMessage("疎"),
|
||||||
|
"memoryInfo": MessageLookupByLibrary.simpleMessage("メモリ情報"),
|
||||||
|
"min": MessageLookupByLibrary.simpleMessage("最小化"),
|
||||||
|
"minimizeOnExit": MessageLookupByLibrary.simpleMessage("終了時に最小化"),
|
||||||
|
"minimizeOnExitDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"システムの終了イベントを変更",
|
||||||
|
),
|
||||||
|
"minutes": MessageLookupByLibrary.simpleMessage("分"),
|
||||||
|
"mode": MessageLookupByLibrary.simpleMessage("モード"),
|
||||||
|
"months": MessageLookupByLibrary.simpleMessage("月"),
|
||||||
|
"more": MessageLookupByLibrary.simpleMessage("詳細"),
|
||||||
|
"name": MessageLookupByLibrary.simpleMessage("名前"),
|
||||||
|
"nameSort": MessageLookupByLibrary.simpleMessage("名前順"),
|
||||||
|
"nameserver": MessageLookupByLibrary.simpleMessage("ネームサーバー"),
|
||||||
|
"nameserverDesc": MessageLookupByLibrary.simpleMessage("ドメイン解決用"),
|
||||||
|
"nameserverPolicy": MessageLookupByLibrary.simpleMessage("ネームサーバーポリシー"),
|
||||||
|
"nameserverPolicyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"対応するネームサーバーポリシーを指定",
|
||||||
|
),
|
||||||
|
"network": MessageLookupByLibrary.simpleMessage("ネットワーク"),
|
||||||
|
"networkDesc": MessageLookupByLibrary.simpleMessage("ネットワーク関連設定の変更"),
|
||||||
|
"networkDetection": MessageLookupByLibrary.simpleMessage("ネットワーク検出"),
|
||||||
|
"networkSpeed": MessageLookupByLibrary.simpleMessage("ネットワーク速度"),
|
||||||
|
"noData": MessageLookupByLibrary.simpleMessage("データなし"),
|
||||||
|
"noHotKey": MessageLookupByLibrary.simpleMessage("ホットキーなし"),
|
||||||
|
"noIcon": MessageLookupByLibrary.simpleMessage("なし"),
|
||||||
|
"noInfo": MessageLookupByLibrary.simpleMessage("情報なし"),
|
||||||
|
"noMoreInfoDesc": MessageLookupByLibrary.simpleMessage("追加情報なし"),
|
||||||
|
"noNetwork": MessageLookupByLibrary.simpleMessage("ネットワークなし"),
|
||||||
|
"noProxy": MessageLookupByLibrary.simpleMessage("プロキシなし"),
|
||||||
|
"noProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロファイルを作成するか、有効なプロファイルを追加してください",
|
||||||
|
),
|
||||||
|
"notEmpty": MessageLookupByLibrary.simpleMessage("空欄不可"),
|
||||||
|
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"現在のプロキシグループは選択できません",
|
||||||
|
),
|
||||||
|
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage("接続なし"),
|
||||||
|
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage("コア情報を取得できません"),
|
||||||
|
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("ログがありません"),
|
||||||
|
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロファイルがありません。追加してください",
|
||||||
|
),
|
||||||
|
"nullProxies": MessageLookupByLibrary.simpleMessage("プロキシなし"),
|
||||||
|
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("リクエストなし"),
|
||||||
|
"oneColumn": MessageLookupByLibrary.simpleMessage("1列"),
|
||||||
|
"onlyIcon": MessageLookupByLibrary.simpleMessage("アイコンのみ"),
|
||||||
|
"onlyOtherApps": MessageLookupByLibrary.simpleMessage("サードパーティアプリのみ"),
|
||||||
|
"onlyStatisticsProxy": MessageLookupByLibrary.simpleMessage("プロキシのみ統計"),
|
||||||
|
"onlyStatisticsProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化するとプロキシトラフィックのみ統計",
|
||||||
|
),
|
||||||
|
"options": MessageLookupByLibrary.simpleMessage("オプション"),
|
||||||
|
"other": MessageLookupByLibrary.simpleMessage("その他"),
|
||||||
|
"otherContributors": MessageLookupByLibrary.simpleMessage("その他の貢献者"),
|
||||||
|
"outboundMode": MessageLookupByLibrary.simpleMessage("アウトバウンドモード"),
|
||||||
|
"override": MessageLookupByLibrary.simpleMessage("上書き"),
|
||||||
|
"overrideDesc": MessageLookupByLibrary.simpleMessage("プロキシ関連設定を上書き"),
|
||||||
|
"overrideDns": MessageLookupByLibrary.simpleMessage("DNS上書き"),
|
||||||
|
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化するとプロファイルのDNS設定を上書き",
|
||||||
|
),
|
||||||
|
"password": MessageLookupByLibrary.simpleMessage("パスワード"),
|
||||||
|
"passwordTip": MessageLookupByLibrary.simpleMessage("パスワードは必須です"),
|
||||||
|
"paste": MessageLookupByLibrary.simpleMessage("貼り付け"),
|
||||||
|
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"WebDAVをバインドしてください",
|
||||||
|
),
|
||||||
|
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"管理者パスワードを入力",
|
||||||
|
),
|
||||||
|
"pleaseUploadFile": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"ファイルをアップロードしてください",
|
||||||
|
),
|
||||||
|
"pleaseUploadValidQrcode": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効なQRコードをアップロードしてください",
|
||||||
|
),
|
||||||
|
"port": MessageLookupByLibrary.simpleMessage("ポート"),
|
||||||
|
"preferH3Desc": MessageLookupByLibrary.simpleMessage("DOHのHTTP/3を優先使用"),
|
||||||
|
"pressKeyboard": MessageLookupByLibrary.simpleMessage("キーボードを押してください"),
|
||||||
|
"preview": MessageLookupByLibrary.simpleMessage("プレビュー"),
|
||||||
|
"profile": MessageLookupByLibrary.simpleMessage("プロファイル"),
|
||||||
|
"profileAutoUpdateIntervalInvalidValidationDesc":
|
||||||
|
MessageLookupByLibrary.simpleMessage("有効な間隔形式を入力してください"),
|
||||||
|
"profileAutoUpdateIntervalNullValidationDesc":
|
||||||
|
MessageLookupByLibrary.simpleMessage("自動更新間隔を入力してください"),
|
||||||
|
"profileHasUpdate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロファイルが変更されました。自動更新を無効化しますか?",
|
||||||
|
),
|
||||||
|
"profileNameNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロファイル名を入力してください",
|
||||||
|
),
|
||||||
|
"profileParseErrorDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロファイル解析エラー",
|
||||||
|
),
|
||||||
|
"profileUrlInvalidValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効なプロファイルURLを入力してください",
|
||||||
|
),
|
||||||
|
"profileUrlNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロファイルURLを入力してください",
|
||||||
|
),
|
||||||
|
"profiles": MessageLookupByLibrary.simpleMessage("プロファイル一覧"),
|
||||||
|
"profilesSort": MessageLookupByLibrary.simpleMessage("プロファイルの並び替え"),
|
||||||
|
"project": MessageLookupByLibrary.simpleMessage("プロジェクト"),
|
||||||
|
"providers": MessageLookupByLibrary.simpleMessage("プロバイダー"),
|
||||||
|
"proxies": MessageLookupByLibrary.simpleMessage("プロキシ"),
|
||||||
|
"proxiesSetting": MessageLookupByLibrary.simpleMessage("プロキシ設定"),
|
||||||
|
"proxyGroup": MessageLookupByLibrary.simpleMessage("プロキシグループ"),
|
||||||
|
"proxyNameserver": MessageLookupByLibrary.simpleMessage("プロキシネームサーバー"),
|
||||||
|
"proxyNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プロキシノード解決用ドメイン",
|
||||||
|
),
|
||||||
|
"proxyPort": MessageLookupByLibrary.simpleMessage("プロキシポート"),
|
||||||
|
"proxyPortDesc": MessageLookupByLibrary.simpleMessage("Clashのリスニングポートを設定"),
|
||||||
|
"proxyProviders": MessageLookupByLibrary.simpleMessage("プロキシプロバイダー"),
|
||||||
|
"pureBlackMode": MessageLookupByLibrary.simpleMessage("純黒モード"),
|
||||||
|
"qrcode": MessageLookupByLibrary.simpleMessage("QRコード"),
|
||||||
|
"qrcodeDesc": MessageLookupByLibrary.simpleMessage("QRコードをスキャンしてプロファイルを取得"),
|
||||||
|
"recovery": MessageLookupByLibrary.simpleMessage("復元"),
|
||||||
|
"recoveryAll": MessageLookupByLibrary.simpleMessage("全データ復元"),
|
||||||
|
"recoveryProfiles": MessageLookupByLibrary.simpleMessage("プロファイルのみ復元"),
|
||||||
|
"recoverySuccess": MessageLookupByLibrary.simpleMessage("復元成功"),
|
||||||
|
"regExp": MessageLookupByLibrary.simpleMessage("正規表現"),
|
||||||
|
"remote": MessageLookupByLibrary.simpleMessage("リモート"),
|
||||||
|
"remoteBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"WebDAVにデータをバックアップ",
|
||||||
|
),
|
||||||
|
"remoteRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"WebDAVからデータを復元",
|
||||||
|
),
|
||||||
|
"remove": MessageLookupByLibrary.simpleMessage("削除"),
|
||||||
|
"requests": MessageLookupByLibrary.simpleMessage("リクエスト"),
|
||||||
|
"requestsDesc": MessageLookupByLibrary.simpleMessage("最近のリクエスト記録を表示"),
|
||||||
|
"reset": MessageLookupByLibrary.simpleMessage("リセット"),
|
||||||
|
"resetTip": MessageLookupByLibrary.simpleMessage("リセットを確定"),
|
||||||
|
"resources": MessageLookupByLibrary.simpleMessage("リソース"),
|
||||||
|
"resourcesDesc": MessageLookupByLibrary.simpleMessage("外部リソース関連情報"),
|
||||||
|
"respectRules": MessageLookupByLibrary.simpleMessage("ルール尊重"),
|
||||||
|
"respectRulesDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"DNS接続がルールに従う(proxy-server-nameserverの設定が必要)",
|
||||||
|
),
|
||||||
|
"routeAddress": MessageLookupByLibrary.simpleMessage("ルートアドレス"),
|
||||||
|
"routeAddressDesc": MessageLookupByLibrary.simpleMessage("ルートアドレスを設定"),
|
||||||
|
"routeMode": MessageLookupByLibrary.simpleMessage("ルートモード"),
|
||||||
|
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"プライベートルートをバイパス",
|
||||||
|
),
|
||||||
|
"routeMode_config": MessageLookupByLibrary.simpleMessage("設定を使用"),
|
||||||
|
"ru": MessageLookupByLibrary.simpleMessage("ロシア語"),
|
||||||
|
"rule": MessageLookupByLibrary.simpleMessage("ルール"),
|
||||||
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("ルールプロバイダー"),
|
||||||
|
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
||||||
|
"search": MessageLookupByLibrary.simpleMessage("検索"),
|
||||||
|
"seconds": MessageLookupByLibrary.simpleMessage("秒"),
|
||||||
|
"selectAll": MessageLookupByLibrary.simpleMessage("すべて選択"),
|
||||||
|
"selected": MessageLookupByLibrary.simpleMessage("選択済み"),
|
||||||
|
"settings": MessageLookupByLibrary.simpleMessage("設定"),
|
||||||
|
"show": MessageLookupByLibrary.simpleMessage("表示"),
|
||||||
|
"shrink": MessageLookupByLibrary.simpleMessage("縮小"),
|
||||||
|
"silentLaunch": MessageLookupByLibrary.simpleMessage("バックグラウンド起動"),
|
||||||
|
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage("バックグラウンドで起動"),
|
||||||
|
"size": MessageLookupByLibrary.simpleMessage("サイズ"),
|
||||||
|
"sort": MessageLookupByLibrary.simpleMessage("並び替え"),
|
||||||
|
"source": MessageLookupByLibrary.simpleMessage("ソース"),
|
||||||
|
"stackMode": MessageLookupByLibrary.simpleMessage("スタックモード"),
|
||||||
|
"standard": MessageLookupByLibrary.simpleMessage("標準"),
|
||||||
|
"start": MessageLookupByLibrary.simpleMessage("開始"),
|
||||||
|
"startVpn": MessageLookupByLibrary.simpleMessage("VPNを開始中..."),
|
||||||
|
"status": MessageLookupByLibrary.simpleMessage("ステータス"),
|
||||||
|
"statusDesc": MessageLookupByLibrary.simpleMessage("無効時はシステムDNSを使用"),
|
||||||
|
"stop": MessageLookupByLibrary.simpleMessage("停止"),
|
||||||
|
"stopVpn": MessageLookupByLibrary.simpleMessage("VPNを停止中..."),
|
||||||
|
"style": MessageLookupByLibrary.simpleMessage("スタイル"),
|
||||||
|
"submit": MessageLookupByLibrary.simpleMessage("送信"),
|
||||||
|
"sync": MessageLookupByLibrary.simpleMessage("同期"),
|
||||||
|
"system": MessageLookupByLibrary.simpleMessage("システム"),
|
||||||
|
"systemFont": MessageLookupByLibrary.simpleMessage("システムフォント"),
|
||||||
|
"systemProxy": MessageLookupByLibrary.simpleMessage("システムプロキシ"),
|
||||||
|
"systemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"HTTPプロキシをVpnServiceに接続",
|
||||||
|
),
|
||||||
|
"tab": MessageLookupByLibrary.simpleMessage("タブ"),
|
||||||
|
"tabAnimation": MessageLookupByLibrary.simpleMessage("タブアニメーション"),
|
||||||
|
"tabAnimationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"有効化するとホームタブに切り替えアニメーションを追加",
|
||||||
|
),
|
||||||
|
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("TCP並列処理"),
|
||||||
|
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage("TCP並列処理を許可"),
|
||||||
|
"testUrl": MessageLookupByLibrary.simpleMessage("URLテスト"),
|
||||||
|
"theme": MessageLookupByLibrary.simpleMessage("テーマ"),
|
||||||
|
"themeColor": MessageLookupByLibrary.simpleMessage("テーマカラー"),
|
||||||
|
"themeDesc": MessageLookupByLibrary.simpleMessage("ダークモードの設定、色の調整"),
|
||||||
|
"themeMode": MessageLookupByLibrary.simpleMessage("テーマモード"),
|
||||||
|
"threeColumns": MessageLookupByLibrary.simpleMessage("3列"),
|
||||||
|
"tight": MessageLookupByLibrary.simpleMessage("密"),
|
||||||
|
"time": MessageLookupByLibrary.simpleMessage("時間"),
|
||||||
|
"tip": MessageLookupByLibrary.simpleMessage("ヒント"),
|
||||||
|
"toggle": MessageLookupByLibrary.simpleMessage("トグル"),
|
||||||
|
"tools": MessageLookupByLibrary.simpleMessage("ツール"),
|
||||||
|
"trafficUsage": MessageLookupByLibrary.simpleMessage("トラフィック使用量"),
|
||||||
|
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||||
|
"tunDesc": MessageLookupByLibrary.simpleMessage("管理者モードでのみ有効"),
|
||||||
|
"twoColumns": MessageLookupByLibrary.simpleMessage("2列"),
|
||||||
|
"unableToUpdateCurrentProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"現在のプロファイルを更新できません",
|
||||||
|
),
|
||||||
|
"unifiedDelay": MessageLookupByLibrary.simpleMessage("統一遅延"),
|
||||||
|
"unifiedDelayDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"ハンドシェイクなどの余分な遅延を削除",
|
||||||
|
),
|
||||||
|
"unknown": MessageLookupByLibrary.simpleMessage("不明"),
|
||||||
|
"update": MessageLookupByLibrary.simpleMessage("更新"),
|
||||||
|
"upload": MessageLookupByLibrary.simpleMessage("アップロード"),
|
||||||
|
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||||
|
"urlDesc": MessageLookupByLibrary.simpleMessage("URL経由でプロファイルを取得"),
|
||||||
|
"useHosts": MessageLookupByLibrary.simpleMessage("ホストを使用"),
|
||||||
|
"useSystemHosts": MessageLookupByLibrary.simpleMessage("システムホストを使用"),
|
||||||
|
"value": MessageLookupByLibrary.simpleMessage("値"),
|
||||||
|
"view": MessageLookupByLibrary.simpleMessage("表示"),
|
||||||
|
"vpnDesc": MessageLookupByLibrary.simpleMessage("VPN関連設定の変更"),
|
||||||
|
"vpnEnableDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"VpnService経由で全システムトラフィックをルーティング",
|
||||||
|
),
|
||||||
|
"vpnSystemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"HTTPプロキシをVpnServiceに接続",
|
||||||
|
),
|
||||||
|
"vpnTip": MessageLookupByLibrary.simpleMessage("変更はVPN再起動後に有効"),
|
||||||
|
"webDAVConfiguration": MessageLookupByLibrary.simpleMessage("WebDAV設定"),
|
||||||
|
"whitelistMode": MessageLookupByLibrary.simpleMessage("ホワイトリストモード"),
|
||||||
|
"years": MessageLookupByLibrary.simpleMessage("年"),
|
||||||
|
"zh_CN": MessageLookupByLibrary.simpleMessage("簡体字中国語"),
|
||||||
|
};
|
||||||
|
}
|
||||||
666
lib/l10n/intl/messages_ru.dart
Normal file
666
lib/l10n/intl/messages_ru.dart
Normal file
@@ -0,0 +1,666 @@
|
|||||||
|
// DO NOT EDIT. This is code generated via package:intl/generate_localized.dart
|
||||||
|
// This is a library that provides messages for a ru locale. All the
|
||||||
|
// messages from the main program should be duplicated here with the same
|
||||||
|
// function name.
|
||||||
|
|
||||||
|
// Ignore issues from commonly used lints in this file.
|
||||||
|
// ignore_for_file:unnecessary_brace_in_string_interps, unnecessary_new
|
||||||
|
// ignore_for_file:prefer_single_quotes,comment_references, directives_ordering
|
||||||
|
// ignore_for_file:annotate_overrides,prefer_generic_function_type_aliases
|
||||||
|
// ignore_for_file:unused_import, file_names, avoid_escaping_inner_quotes
|
||||||
|
// ignore_for_file:unnecessary_string_interpolations, unnecessary_string_escapes
|
||||||
|
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
import 'package:intl/message_lookup_by_library.dart';
|
||||||
|
|
||||||
|
final messages = new MessageLookup();
|
||||||
|
|
||||||
|
typedef String MessageIfAbsent(String messageStr, List<dynamic> args);
|
||||||
|
|
||||||
|
class MessageLookup extends MessageLookupByLibrary {
|
||||||
|
String get localeName => 'ru';
|
||||||
|
|
||||||
|
final messages = _notInlinedMessages(_notInlinedMessages);
|
||||||
|
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
|
||||||
|
"about": MessageLookupByLibrary.simpleMessage("О программе"),
|
||||||
|
"accessControl": MessageLookupByLibrary.simpleMessage("Контроль доступа"),
|
||||||
|
"accessControlAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Разрешить только выбранным приложениям доступ к VPN",
|
||||||
|
),
|
||||||
|
"accessControlDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Настройка доступа приложений к прокси",
|
||||||
|
),
|
||||||
|
"accessControlNotAllowDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Выбранные приложения будут исключены из VPN",
|
||||||
|
),
|
||||||
|
"account": MessageLookupByLibrary.simpleMessage("Аккаунт"),
|
||||||
|
"accountTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Аккаунт не может быть пустым",
|
||||||
|
),
|
||||||
|
"action": MessageLookupByLibrary.simpleMessage("Действие"),
|
||||||
|
"action_mode": MessageLookupByLibrary.simpleMessage("Переключить режим"),
|
||||||
|
"action_proxy": MessageLookupByLibrary.simpleMessage("Системный прокси"),
|
||||||
|
"action_start": MessageLookupByLibrary.simpleMessage("Старт/Стоп"),
|
||||||
|
"action_tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||||
|
"action_view": MessageLookupByLibrary.simpleMessage("Показать/Скрыть"),
|
||||||
|
"add": MessageLookupByLibrary.simpleMessage("Добавить"),
|
||||||
|
"address": MessageLookupByLibrary.simpleMessage("Адрес"),
|
||||||
|
"addressHelp": MessageLookupByLibrary.simpleMessage("Адрес сервера WebDAV"),
|
||||||
|
"addressTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите действительный адрес WebDAV",
|
||||||
|
),
|
||||||
|
"adminAutoLaunch": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автозапуск с правами администратора",
|
||||||
|
),
|
||||||
|
"adminAutoLaunchDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Запуск с правами администратора при загрузке системы",
|
||||||
|
),
|
||||||
|
"ago": MessageLookupByLibrary.simpleMessage(" назад"),
|
||||||
|
"agree": MessageLookupByLibrary.simpleMessage("Согласен"),
|
||||||
|
"allApps": MessageLookupByLibrary.simpleMessage("Все приложения"),
|
||||||
|
"allowBypass": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Разрешить приложениям обходить VPN",
|
||||||
|
),
|
||||||
|
"allowBypassDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Некоторые приложения могут обходить VPN при включении",
|
||||||
|
),
|
||||||
|
"allowLan": MessageLookupByLibrary.simpleMessage("Разрешить LAN"),
|
||||||
|
"allowLanDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Разрешить доступ к прокси через локальную сеть",
|
||||||
|
),
|
||||||
|
"app": MessageLookupByLibrary.simpleMessage("Приложение"),
|
||||||
|
"appAccessControl": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Контроль доступа приложений",
|
||||||
|
),
|
||||||
|
"appDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обработка настроек, связанных с приложением",
|
||||||
|
),
|
||||||
|
"application": MessageLookupByLibrary.simpleMessage("Приложение"),
|
||||||
|
"applicationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Изменение настроек, связанных с приложением",
|
||||||
|
),
|
||||||
|
"auto": MessageLookupByLibrary.simpleMessage("Авто"),
|
||||||
|
"autoCheckUpdate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автопроверка обновлений",
|
||||||
|
),
|
||||||
|
"autoCheckUpdateDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автоматически проверять обновления при запуске приложения",
|
||||||
|
),
|
||||||
|
"autoCloseConnections": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автоматическое закрытие соединений",
|
||||||
|
),
|
||||||
|
"autoCloseConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автоматически закрывать соединения после смены узла",
|
||||||
|
),
|
||||||
|
"autoLaunch": MessageLookupByLibrary.simpleMessage("Автозапуск"),
|
||||||
|
"autoLaunchDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Следовать автозапуску системы",
|
||||||
|
),
|
||||||
|
"autoRun": MessageLookupByLibrary.simpleMessage("Автозапуск"),
|
||||||
|
"autoRunDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автоматический запуск при открытии приложения",
|
||||||
|
),
|
||||||
|
"autoUpdate": MessageLookupByLibrary.simpleMessage("Автообновление"),
|
||||||
|
"autoUpdateInterval": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Интервал автообновления (минуты)",
|
||||||
|
),
|
||||||
|
"backup": MessageLookupByLibrary.simpleMessage("Резервное копирование"),
|
||||||
|
"backupAndRecovery": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Резервное копирование и восстановление",
|
||||||
|
),
|
||||||
|
"backupAndRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Синхронизация данных через WebDAV или файл",
|
||||||
|
),
|
||||||
|
"backupSuccess": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Резервное копирование успешно",
|
||||||
|
),
|
||||||
|
"bind": MessageLookupByLibrary.simpleMessage("Привязать"),
|
||||||
|
"blacklistMode": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Режим черного списка",
|
||||||
|
),
|
||||||
|
"bypassDomain": MessageLookupByLibrary.simpleMessage("Обход домена"),
|
||||||
|
"bypassDomainDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Действует только при включенном системном прокси",
|
||||||
|
),
|
||||||
|
"cacheCorrupt": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Кэш поврежден. Хотите очистить его?",
|
||||||
|
),
|
||||||
|
"cancel": MessageLookupByLibrary.simpleMessage("Отмена"),
|
||||||
|
"cancelFilterSystemApp": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Отменить фильтрацию системных приложений",
|
||||||
|
),
|
||||||
|
"cancelSelectAll": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Отменить выбор всего",
|
||||||
|
),
|
||||||
|
"checkError": MessageLookupByLibrary.simpleMessage("Ошибка проверки"),
|
||||||
|
"checkUpdate": MessageLookupByLibrary.simpleMessage("Проверить обновления"),
|
||||||
|
"checkUpdateError": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Текущее приложение уже является последней версией",
|
||||||
|
),
|
||||||
|
"checking": MessageLookupByLibrary.simpleMessage("Проверка..."),
|
||||||
|
"clipboardExport": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Экспорт в буфер обмена",
|
||||||
|
),
|
||||||
|
"clipboardImport": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Импорт из буфера обмена",
|
||||||
|
),
|
||||||
|
"columns": MessageLookupByLibrary.simpleMessage("Столбцы"),
|
||||||
|
"compatible": MessageLookupByLibrary.simpleMessage("Режим совместимости"),
|
||||||
|
"compatibleDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Включение приведет к потере части функциональности приложения, но обеспечит полную поддержку Clash.",
|
||||||
|
),
|
||||||
|
"confirm": MessageLookupByLibrary.simpleMessage("Подтвердить"),
|
||||||
|
"connections": MessageLookupByLibrary.simpleMessage("Соединения"),
|
||||||
|
"connectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Просмотр текущих данных о соединениях",
|
||||||
|
),
|
||||||
|
"connectivity": MessageLookupByLibrary.simpleMessage("Связь:"),
|
||||||
|
"copy": MessageLookupByLibrary.simpleMessage("Копировать"),
|
||||||
|
"copyEnvVar": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Копирование переменных окружения",
|
||||||
|
),
|
||||||
|
"copyLink": MessageLookupByLibrary.simpleMessage("Копировать ссылку"),
|
||||||
|
"copySuccess": MessageLookupByLibrary.simpleMessage("Копирование успешно"),
|
||||||
|
"core": MessageLookupByLibrary.simpleMessage("Ядро"),
|
||||||
|
"coreInfo": MessageLookupByLibrary.simpleMessage("Информация о ядре"),
|
||||||
|
"country": MessageLookupByLibrary.simpleMessage("Страна"),
|
||||||
|
"create": MessageLookupByLibrary.simpleMessage("Создать"),
|
||||||
|
"cut": MessageLookupByLibrary.simpleMessage("Вырезать"),
|
||||||
|
"dark": MessageLookupByLibrary.simpleMessage("Темный"),
|
||||||
|
"dashboard": MessageLookupByLibrary.simpleMessage("Панель управления"),
|
||||||
|
"days": MessageLookupByLibrary.simpleMessage("Дней"),
|
||||||
|
"defaultNameserver": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Сервер имен по умолчанию",
|
||||||
|
),
|
||||||
|
"defaultNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Для разрешения DNS-сервера",
|
||||||
|
),
|
||||||
|
"defaultSort": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Сортировка по умолчанию",
|
||||||
|
),
|
||||||
|
"defaultText": MessageLookupByLibrary.simpleMessage("По умолчанию"),
|
||||||
|
"delay": MessageLookupByLibrary.simpleMessage("Задержка"),
|
||||||
|
"delaySort": MessageLookupByLibrary.simpleMessage("Сортировка по задержке"),
|
||||||
|
"delete": MessageLookupByLibrary.simpleMessage("Удалить"),
|
||||||
|
"deleteProfileTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Вы уверены, что хотите удалить текущий профиль?",
|
||||||
|
),
|
||||||
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Многоплатформенный прокси-клиент на основе ClashMeta, простой и удобный в использовании, с открытым исходным кодом и без рекламы.",
|
||||||
|
),
|
||||||
|
"detectionTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Опирается на сторонний API, только для справки",
|
||||||
|
),
|
||||||
|
"direct": MessageLookupByLibrary.simpleMessage("Прямой"),
|
||||||
|
"disclaimer": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Отказ от ответственности",
|
||||||
|
),
|
||||||
|
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Это программное обеспечение используется только в некоммерческих целях, таких как учебные обмены и научные исследования. Запрещено использовать это программное обеспечение в коммерческих целях. Любая коммерческая деятельность, если таковая имеется, не имеет отношения к этому программному обеспечению.",
|
||||||
|
),
|
||||||
|
"discoverNewVersion": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обнаружена новая версия",
|
||||||
|
),
|
||||||
|
"discovery": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обнаружена новая версия",
|
||||||
|
),
|
||||||
|
"dnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обновление настроек, связанных с DNS",
|
||||||
|
),
|
||||||
|
"dnsMode": MessageLookupByLibrary.simpleMessage("Режим DNS"),
|
||||||
|
"doYouWantToPass": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Вы хотите пропустить",
|
||||||
|
),
|
||||||
|
"domain": MessageLookupByLibrary.simpleMessage("Домен"),
|
||||||
|
"download": MessageLookupByLibrary.simpleMessage("Скачивание"),
|
||||||
|
"edit": MessageLookupByLibrary.simpleMessage("Редактировать"),
|
||||||
|
"en": MessageLookupByLibrary.simpleMessage("Английский"),
|
||||||
|
"entries": MessageLookupByLibrary.simpleMessage(" записей"),
|
||||||
|
"exclude": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Скрыть из последних задач",
|
||||||
|
),
|
||||||
|
"excludeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Когда приложение находится в фоновом режиме, оно скрыто из последних задач",
|
||||||
|
),
|
||||||
|
"exit": MessageLookupByLibrary.simpleMessage("Выход"),
|
||||||
|
"expand": MessageLookupByLibrary.simpleMessage("Стандартный"),
|
||||||
|
"expirationTime": MessageLookupByLibrary.simpleMessage("Время истечения"),
|
||||||
|
"exportFile": MessageLookupByLibrary.simpleMessage("Экспорт файла"),
|
||||||
|
"exportLogs": MessageLookupByLibrary.simpleMessage("Экспорт логов"),
|
||||||
|
"exportSuccess": MessageLookupByLibrary.simpleMessage("Экспорт успешен"),
|
||||||
|
"externalController": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Внешний контроллер",
|
||||||
|
),
|
||||||
|
"externalControllerDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"При включении ядро Clash можно контролировать на порту 9090",
|
||||||
|
),
|
||||||
|
"externalLink": MessageLookupByLibrary.simpleMessage("Внешняя ссылка"),
|
||||||
|
"externalResources": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Внешние ресурсы",
|
||||||
|
),
|
||||||
|
"fakeipFilter": MessageLookupByLibrary.simpleMessage("Фильтр Fakeip"),
|
||||||
|
"fakeipRange": MessageLookupByLibrary.simpleMessage("Диапазон Fakeip"),
|
||||||
|
"fallback": MessageLookupByLibrary.simpleMessage("Резервный"),
|
||||||
|
"fallbackDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обычно используется оффшорный DNS",
|
||||||
|
),
|
||||||
|
"fallbackFilter": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Фильтр резервного DNS",
|
||||||
|
),
|
||||||
|
"file": MessageLookupByLibrary.simpleMessage("Файл"),
|
||||||
|
"fileDesc": MessageLookupByLibrary.simpleMessage("Прямая загрузка профиля"),
|
||||||
|
"fileIsUpdate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Файл был изменен. Хотите сохранить изменения?",
|
||||||
|
),
|
||||||
|
"filterSystemApp": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Фильтровать системные приложения",
|
||||||
|
),
|
||||||
|
"findProcessMode": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Режим поиска процесса",
|
||||||
|
),
|
||||||
|
"findProcessModeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Есть риск сбоя после включения",
|
||||||
|
),
|
||||||
|
"fontFamily": MessageLookupByLibrary.simpleMessage("Семейство шрифтов"),
|
||||||
|
"fourColumns": MessageLookupByLibrary.simpleMessage("Четыре столбца"),
|
||||||
|
"general": MessageLookupByLibrary.simpleMessage("Общие"),
|
||||||
|
"generalDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Переопределение общих настроек",
|
||||||
|
),
|
||||||
|
"geoData": MessageLookupByLibrary.simpleMessage("Геоданные"),
|
||||||
|
"geodataLoader": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Режим низкого потребления памяти для геоданных",
|
||||||
|
),
|
||||||
|
"geodataLoaderDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Включение будет использовать загрузчик геоданных с низким потреблением памяти",
|
||||||
|
),
|
||||||
|
"geoipCode": MessageLookupByLibrary.simpleMessage("Код Geoip"),
|
||||||
|
"global": MessageLookupByLibrary.simpleMessage("Глобальный"),
|
||||||
|
"go": MessageLookupByLibrary.simpleMessage("Перейти"),
|
||||||
|
"goDownload": MessageLookupByLibrary.simpleMessage("Перейти к загрузке"),
|
||||||
|
"hasCacheChange": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Хотите сохранить изменения в кэше?",
|
||||||
|
),
|
||||||
|
"hostsDesc": MessageLookupByLibrary.simpleMessage("Добавить Hosts"),
|
||||||
|
"hotkeyConflict": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Конфликт горячих клавиш",
|
||||||
|
),
|
||||||
|
"hotkeyManagement": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Управление горячими клавишами",
|
||||||
|
),
|
||||||
|
"hotkeyManagementDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Использование клавиатуры для управления приложением",
|
||||||
|
),
|
||||||
|
"hours": MessageLookupByLibrary.simpleMessage("Часов"),
|
||||||
|
"icon": MessageLookupByLibrary.simpleMessage("Иконка"),
|
||||||
|
"iconConfiguration": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Конфигурация иконки",
|
||||||
|
),
|
||||||
|
"iconStyle": MessageLookupByLibrary.simpleMessage("Стиль иконки"),
|
||||||
|
"importFromURL": MessageLookupByLibrary.simpleMessage("Импорт из URL"),
|
||||||
|
"infiniteTime": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Долгосрочное действие",
|
||||||
|
),
|
||||||
|
"init": MessageLookupByLibrary.simpleMessage("Инициализация"),
|
||||||
|
"inputCorrectHotkey": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите правильную горячую клавишу",
|
||||||
|
),
|
||||||
|
"intelligentSelected": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Интеллектуальный выбор",
|
||||||
|
),
|
||||||
|
"intranetIP": MessageLookupByLibrary.simpleMessage("Внутренний IP"),
|
||||||
|
"ipcidr": MessageLookupByLibrary.simpleMessage("IPCIDR"),
|
||||||
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"При включении будет возможно получать IPv6 трафик",
|
||||||
|
),
|
||||||
|
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Разрешить входящий IPv6",
|
||||||
|
),
|
||||||
|
"ja": MessageLookupByLibrary.simpleMessage("Японский"),
|
||||||
|
"just": MessageLookupByLibrary.simpleMessage("Только что"),
|
||||||
|
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Интервал поддержания TCP-соединения",
|
||||||
|
),
|
||||||
|
"key": MessageLookupByLibrary.simpleMessage("Ключ"),
|
||||||
|
"language": MessageLookupByLibrary.simpleMessage("Язык"),
|
||||||
|
"layout": MessageLookupByLibrary.simpleMessage("Макет"),
|
||||||
|
"light": MessageLookupByLibrary.simpleMessage("Светлый"),
|
||||||
|
"list": MessageLookupByLibrary.simpleMessage("Список"),
|
||||||
|
"listen": MessageLookupByLibrary.simpleMessage("Слушать"),
|
||||||
|
"local": MessageLookupByLibrary.simpleMessage("Локальный"),
|
||||||
|
"localBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Резервное копирование локальных данных на локальный диск",
|
||||||
|
),
|
||||||
|
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Восстановление данных из файла",
|
||||||
|
),
|
||||||
|
"logLevel": MessageLookupByLibrary.simpleMessage("Уровень логов"),
|
||||||
|
"logcat": MessageLookupByLibrary.simpleMessage("Logcat"),
|
||||||
|
"logcatDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Отключение скроет запись логов",
|
||||||
|
),
|
||||||
|
"logs": MessageLookupByLibrary.simpleMessage("Логи"),
|
||||||
|
"logsDesc": MessageLookupByLibrary.simpleMessage("Записи захвата логов"),
|
||||||
|
"loopback": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Инструмент разблокировки Loopback",
|
||||||
|
),
|
||||||
|
"loopbackDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Используется для разблокировки Loopback UWP",
|
||||||
|
),
|
||||||
|
"loose": MessageLookupByLibrary.simpleMessage("Свободный"),
|
||||||
|
"memoryInfo": MessageLookupByLibrary.simpleMessage("Информация о памяти"),
|
||||||
|
"min": MessageLookupByLibrary.simpleMessage("Мин"),
|
||||||
|
"minimizeOnExit": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Свернуть при выходе",
|
||||||
|
),
|
||||||
|
"minimizeOnExitDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Изменить стандартное событие выхода из системы",
|
||||||
|
),
|
||||||
|
"minutes": MessageLookupByLibrary.simpleMessage("Минут"),
|
||||||
|
"mode": MessageLookupByLibrary.simpleMessage("Режим"),
|
||||||
|
"months": MessageLookupByLibrary.simpleMessage("Месяцев"),
|
||||||
|
"more": MessageLookupByLibrary.simpleMessage("Еще"),
|
||||||
|
"name": MessageLookupByLibrary.simpleMessage("Имя"),
|
||||||
|
"nameSort": MessageLookupByLibrary.simpleMessage("Сортировка по имени"),
|
||||||
|
"nameserver": MessageLookupByLibrary.simpleMessage("Сервер имен"),
|
||||||
|
"nameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Для разрешения домена",
|
||||||
|
),
|
||||||
|
"nameserverPolicy": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Политика сервера имен",
|
||||||
|
),
|
||||||
|
"nameserverPolicyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Указать соответствующую политику сервера имен",
|
||||||
|
),
|
||||||
|
"network": MessageLookupByLibrary.simpleMessage("Сеть"),
|
||||||
|
"networkDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Изменение настроек, связанных с сетью",
|
||||||
|
),
|
||||||
|
"networkDetection": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обнаружение сети",
|
||||||
|
),
|
||||||
|
"networkSpeed": MessageLookupByLibrary.simpleMessage("Скорость сети"),
|
||||||
|
"noData": MessageLookupByLibrary.simpleMessage("Нет данных"),
|
||||||
|
"noHotKey": MessageLookupByLibrary.simpleMessage("Нет горячей клавиши"),
|
||||||
|
"noIcon": MessageLookupByLibrary.simpleMessage("Нет иконки"),
|
||||||
|
"noInfo": MessageLookupByLibrary.simpleMessage("Нет информации"),
|
||||||
|
"noMoreInfoDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Нет дополнительной информации",
|
||||||
|
),
|
||||||
|
"noNetwork": MessageLookupByLibrary.simpleMessage("Нет сети"),
|
||||||
|
"noProxy": MessageLookupByLibrary.simpleMessage("Нет прокси"),
|
||||||
|
"noProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, создайте профиль или добавьте действительный профиль",
|
||||||
|
),
|
||||||
|
"notEmpty": MessageLookupByLibrary.simpleMessage("Не может быть пустым"),
|
||||||
|
"notSelectedTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Текущая группа прокси не может быть выбрана.",
|
||||||
|
),
|
||||||
|
"nullConnectionsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Нет соединений",
|
||||||
|
),
|
||||||
|
"nullCoreInfoDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Не удалось получить информацию о ядре",
|
||||||
|
),
|
||||||
|
"nullLogsDesc": MessageLookupByLibrary.simpleMessage("Нет логов"),
|
||||||
|
"nullProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Нет профиля, пожалуйста, добавьте профиль",
|
||||||
|
),
|
||||||
|
"nullProxies": MessageLookupByLibrary.simpleMessage("Нет прокси"),
|
||||||
|
"nullRequestsDesc": MessageLookupByLibrary.simpleMessage("Нет запросов"),
|
||||||
|
"oneColumn": MessageLookupByLibrary.simpleMessage("Один столбец"),
|
||||||
|
"onlyIcon": MessageLookupByLibrary.simpleMessage("Только иконка"),
|
||||||
|
"onlyOtherApps": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Только сторонние приложения",
|
||||||
|
),
|
||||||
|
"onlyStatisticsProxy": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Только статистика прокси",
|
||||||
|
),
|
||||||
|
"onlyStatisticsProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"При включении будет учитываться только трафик прокси",
|
||||||
|
),
|
||||||
|
"options": MessageLookupByLibrary.simpleMessage("Опции"),
|
||||||
|
"other": MessageLookupByLibrary.simpleMessage("Другое"),
|
||||||
|
"otherContributors": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Другие участники",
|
||||||
|
),
|
||||||
|
"outboundMode": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Режим исходящего трафика",
|
||||||
|
),
|
||||||
|
"override": MessageLookupByLibrary.simpleMessage("Переопределить"),
|
||||||
|
"overrideDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Переопределить конфигурацию, связанную с прокси",
|
||||||
|
),
|
||||||
|
"overrideDns": MessageLookupByLibrary.simpleMessage("Переопределить DNS"),
|
||||||
|
"overrideDnsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Включение переопределит настройки DNS в профиле",
|
||||||
|
),
|
||||||
|
"password": MessageLookupByLibrary.simpleMessage("Пароль"),
|
||||||
|
"passwordTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пароль не может быть пустым",
|
||||||
|
),
|
||||||
|
"paste": MessageLookupByLibrary.simpleMessage("Вставить"),
|
||||||
|
"pleaseBindWebDAV": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, привяжите WebDAV",
|
||||||
|
),
|
||||||
|
"pleaseInputAdminPassword": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите пароль администратора",
|
||||||
|
),
|
||||||
|
"pleaseUploadFile": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, загрузите файл",
|
||||||
|
),
|
||||||
|
"pleaseUploadValidQrcode": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, загрузите действительный QR-код",
|
||||||
|
),
|
||||||
|
"port": MessageLookupByLibrary.simpleMessage("Порт"),
|
||||||
|
"preferH3Desc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Приоритетное использование HTTP/3 для DOH",
|
||||||
|
),
|
||||||
|
"pressKeyboard": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, нажмите клавишу.",
|
||||||
|
),
|
||||||
|
"preview": MessageLookupByLibrary.simpleMessage("Предпросмотр"),
|
||||||
|
"profile": MessageLookupByLibrary.simpleMessage("Профиль"),
|
||||||
|
"profileAutoUpdateIntervalInvalidValidationDesc":
|
||||||
|
MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите действительный формат интервала времени",
|
||||||
|
),
|
||||||
|
"profileAutoUpdateIntervalNullValidationDesc":
|
||||||
|
MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите интервал времени для автообновления",
|
||||||
|
),
|
||||||
|
"profileHasUpdate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Профиль был изменен. Хотите отключить автообновление?",
|
||||||
|
),
|
||||||
|
"profileNameNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите имя профиля",
|
||||||
|
),
|
||||||
|
"profileParseErrorDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"ошибка разбора профиля",
|
||||||
|
),
|
||||||
|
"profileUrlInvalidValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите действительный URL профиля",
|
||||||
|
),
|
||||||
|
"profileUrlNullValidationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Пожалуйста, введите URL профиля",
|
||||||
|
),
|
||||||
|
"profiles": MessageLookupByLibrary.simpleMessage("Профили"),
|
||||||
|
"profilesSort": MessageLookupByLibrary.simpleMessage("Сортировка профилей"),
|
||||||
|
"project": MessageLookupByLibrary.simpleMessage("Проект"),
|
||||||
|
"providers": MessageLookupByLibrary.simpleMessage("Провайдеры"),
|
||||||
|
"proxies": MessageLookupByLibrary.simpleMessage("Прокси"),
|
||||||
|
"proxiesSetting": MessageLookupByLibrary.simpleMessage("Настройка прокси"),
|
||||||
|
"proxyGroup": MessageLookupByLibrary.simpleMessage("Группа прокси"),
|
||||||
|
"proxyNameserver": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Прокси-сервер имен",
|
||||||
|
),
|
||||||
|
"proxyNameserverDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Домен для разрешения прокси-узлов",
|
||||||
|
),
|
||||||
|
"proxyPort": MessageLookupByLibrary.simpleMessage("Порт прокси"),
|
||||||
|
"proxyPortDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Установить порт прослушивания Clash",
|
||||||
|
),
|
||||||
|
"proxyProviders": MessageLookupByLibrary.simpleMessage("Провайдеры прокси"),
|
||||||
|
"pureBlackMode": MessageLookupByLibrary.simpleMessage("Чисто черный режим"),
|
||||||
|
"qrcode": MessageLookupByLibrary.simpleMessage("QR-код"),
|
||||||
|
"qrcodeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Сканируйте QR-код для получения профиля",
|
||||||
|
),
|
||||||
|
"recovery": MessageLookupByLibrary.simpleMessage("Восстановление"),
|
||||||
|
"recoveryAll": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Восстановить все данные",
|
||||||
|
),
|
||||||
|
"recoveryProfiles": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Только восстановление профилей",
|
||||||
|
),
|
||||||
|
"recoverySuccess": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Восстановление успешно",
|
||||||
|
),
|
||||||
|
"regExp": MessageLookupByLibrary.simpleMessage("Регулярное выражение"),
|
||||||
|
"remote": MessageLookupByLibrary.simpleMessage("Удаленный"),
|
||||||
|
"remoteBackupDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Резервное копирование локальных данных на WebDAV",
|
||||||
|
),
|
||||||
|
"remoteRecoveryDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Восстановление данных с WebDAV",
|
||||||
|
),
|
||||||
|
"remove": MessageLookupByLibrary.simpleMessage("Удалить"),
|
||||||
|
"requests": MessageLookupByLibrary.simpleMessage("Запросы"),
|
||||||
|
"requestsDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Просмотр последних записей запросов",
|
||||||
|
),
|
||||||
|
"reset": MessageLookupByLibrary.simpleMessage("Сброс"),
|
||||||
|
"resetTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Убедитесь, что хотите сбросить",
|
||||||
|
),
|
||||||
|
"resources": MessageLookupByLibrary.simpleMessage("Ресурсы"),
|
||||||
|
"resourcesDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Информация, связанная с внешними ресурсами",
|
||||||
|
),
|
||||||
|
"respectRules": MessageLookupByLibrary.simpleMessage("Соблюдение правил"),
|
||||||
|
"respectRulesDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"DNS-соединение следует правилам, необходимо настроить proxy-server-nameserver",
|
||||||
|
),
|
||||||
|
"routeAddress": MessageLookupByLibrary.simpleMessage("Адрес маршрутизации"),
|
||||||
|
"routeAddressDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Настройка адреса прослушивания маршрутизации",
|
||||||
|
),
|
||||||
|
"routeMode": MessageLookupByLibrary.simpleMessage("Режим маршрутизации"),
|
||||||
|
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Обход частных адресов маршрутизации",
|
||||||
|
),
|
||||||
|
"routeMode_config": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Использовать конфигурацию",
|
||||||
|
),
|
||||||
|
"ru": MessageLookupByLibrary.simpleMessage("Русский"),
|
||||||
|
"rule": MessageLookupByLibrary.simpleMessage("Правило"),
|
||||||
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("Провайдеры правил"),
|
||||||
|
"save": MessageLookupByLibrary.simpleMessage("Сохранить"),
|
||||||
|
"search": MessageLookupByLibrary.simpleMessage("Поиск"),
|
||||||
|
"seconds": MessageLookupByLibrary.simpleMessage("Секунд"),
|
||||||
|
"selectAll": MessageLookupByLibrary.simpleMessage("Выбрать все"),
|
||||||
|
"selected": MessageLookupByLibrary.simpleMessage("Выбрано"),
|
||||||
|
"settings": MessageLookupByLibrary.simpleMessage("Настройки"),
|
||||||
|
"show": MessageLookupByLibrary.simpleMessage("Показать"),
|
||||||
|
"shrink": MessageLookupByLibrary.simpleMessage("Сжать"),
|
||||||
|
"silentLaunch": MessageLookupByLibrary.simpleMessage("Тихий запуск"),
|
||||||
|
"silentLaunchDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Запуск в фоновом режиме",
|
||||||
|
),
|
||||||
|
"size": MessageLookupByLibrary.simpleMessage("Размер"),
|
||||||
|
"sort": MessageLookupByLibrary.simpleMessage("Сортировка"),
|
||||||
|
"source": MessageLookupByLibrary.simpleMessage("Источник"),
|
||||||
|
"stackMode": MessageLookupByLibrary.simpleMessage("Режим стека"),
|
||||||
|
"standard": MessageLookupByLibrary.simpleMessage("Стандартный"),
|
||||||
|
"start": MessageLookupByLibrary.simpleMessage("Старт"),
|
||||||
|
"startVpn": MessageLookupByLibrary.simpleMessage("Запуск VPN..."),
|
||||||
|
"status": MessageLookupByLibrary.simpleMessage("Статус"),
|
||||||
|
"statusDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Системный DNS будет использоваться при выключении",
|
||||||
|
),
|
||||||
|
"stop": MessageLookupByLibrary.simpleMessage("Стоп"),
|
||||||
|
"stopVpn": MessageLookupByLibrary.simpleMessage("Остановка VPN..."),
|
||||||
|
"style": MessageLookupByLibrary.simpleMessage("Стиль"),
|
||||||
|
"submit": MessageLookupByLibrary.simpleMessage("Отправить"),
|
||||||
|
"sync": MessageLookupByLibrary.simpleMessage("Синхронизация"),
|
||||||
|
"system": MessageLookupByLibrary.simpleMessage("Система"),
|
||||||
|
"systemFont": MessageLookupByLibrary.simpleMessage("Системный шрифт"),
|
||||||
|
"systemProxy": MessageLookupByLibrary.simpleMessage("Системный прокси"),
|
||||||
|
"systemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Прикрепить HTTP-прокси к VpnService",
|
||||||
|
),
|
||||||
|
"tab": MessageLookupByLibrary.simpleMessage("Вкладка"),
|
||||||
|
"tabAnimation": MessageLookupByLibrary.simpleMessage("Анимация вкладок"),
|
||||||
|
"tabAnimationDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"При включении домашняя вкладка добавит анимацию переключения",
|
||||||
|
),
|
||||||
|
"tcpConcurrent": MessageLookupByLibrary.simpleMessage("TCP параллелизм"),
|
||||||
|
"tcpConcurrentDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Включение позволит использовать параллелизм TCP",
|
||||||
|
),
|
||||||
|
"testUrl": MessageLookupByLibrary.simpleMessage("Тест URL"),
|
||||||
|
"theme": MessageLookupByLibrary.simpleMessage("Тема"),
|
||||||
|
"themeColor": MessageLookupByLibrary.simpleMessage("Цвет темы"),
|
||||||
|
"themeDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Установить темный режим, настроить цвет",
|
||||||
|
),
|
||||||
|
"themeMode": MessageLookupByLibrary.simpleMessage("Режим темы"),
|
||||||
|
"threeColumns": MessageLookupByLibrary.simpleMessage("Три столбца"),
|
||||||
|
"tight": MessageLookupByLibrary.simpleMessage("Плотный"),
|
||||||
|
"time": MessageLookupByLibrary.simpleMessage("Время"),
|
||||||
|
"tip": MessageLookupByLibrary.simpleMessage("подсказка"),
|
||||||
|
"toggle": MessageLookupByLibrary.simpleMessage("Переключить"),
|
||||||
|
"tools": MessageLookupByLibrary.simpleMessage("Инструменты"),
|
||||||
|
"trafficUsage": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Использование трафика",
|
||||||
|
),
|
||||||
|
"tun": MessageLookupByLibrary.simpleMessage("TUN"),
|
||||||
|
"tunDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"действительно только в режиме администратора",
|
||||||
|
),
|
||||||
|
"twoColumns": MessageLookupByLibrary.simpleMessage("Два столбца"),
|
||||||
|
"unableToUpdateCurrentProfileDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"невозможно обновить текущий профиль",
|
||||||
|
),
|
||||||
|
"unifiedDelay": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Унифицированная задержка",
|
||||||
|
),
|
||||||
|
"unifiedDelayDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Убрать дополнительные задержки, такие как рукопожатие",
|
||||||
|
),
|
||||||
|
"unknown": MessageLookupByLibrary.simpleMessage("Неизвестно"),
|
||||||
|
"update": MessageLookupByLibrary.simpleMessage("Обновить"),
|
||||||
|
"upload": MessageLookupByLibrary.simpleMessage("Загрузка"),
|
||||||
|
"url": MessageLookupByLibrary.simpleMessage("URL"),
|
||||||
|
"urlDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Получить профиль через URL",
|
||||||
|
),
|
||||||
|
"useHosts": MessageLookupByLibrary.simpleMessage("Использовать hosts"),
|
||||||
|
"useSystemHosts": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Использовать системные hosts",
|
||||||
|
),
|
||||||
|
"value": MessageLookupByLibrary.simpleMessage("Значение"),
|
||||||
|
"view": MessageLookupByLibrary.simpleMessage("Просмотр"),
|
||||||
|
"vpnDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Изменение настроек, связанных с VPN",
|
||||||
|
),
|
||||||
|
"vpnEnableDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Автоматически направляет весь системный трафик через VpnService",
|
||||||
|
),
|
||||||
|
"vpnSystemProxyDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Прикрепить HTTP-прокси к VpnService",
|
||||||
|
),
|
||||||
|
"vpnTip": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Изменения вступят в силу после перезапуска VPN",
|
||||||
|
),
|
||||||
|
"webDAVConfiguration": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Конфигурация WebDAV",
|
||||||
|
),
|
||||||
|
"whitelistMode": MessageLookupByLibrary.simpleMessage(
|
||||||
|
"Режим белого списка",
|
||||||
|
),
|
||||||
|
"years": MessageLookupByLibrary.simpleMessage("Лет"),
|
||||||
|
"zh_CN": MessageLookupByLibrary.simpleMessage("Упрощенный китайский"),
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -122,7 +122,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"desc": MessageLookupByLibrary.simpleMessage(
|
"desc": MessageLookupByLibrary.simpleMessage(
|
||||||
"基于ClashMeta的多平台代理客户端,简单易用,开源无广告。",
|
"基于ClashMeta的多平台代理客户端,简单易用,开源无广告。",
|
||||||
),
|
),
|
||||||
"detectionTip": MessageLookupByLibrary.simpleMessage("依赖第三方api仅供参考"),
|
"detectionTip": MessageLookupByLibrary.simpleMessage("依赖第三方api,仅供参考"),
|
||||||
"direct": MessageLookupByLibrary.simpleMessage("直连"),
|
"direct": MessageLookupByLibrary.simpleMessage("直连"),
|
||||||
"disclaimer": MessageLookupByLibrary.simpleMessage("免责声明"),
|
"disclaimer": MessageLookupByLibrary.simpleMessage("免责声明"),
|
||||||
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
"disclaimerDesc": MessageLookupByLibrary.simpleMessage(
|
||||||
@@ -192,6 +192,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"ipcidr": MessageLookupByLibrary.simpleMessage("IP/掩码"),
|
"ipcidr": MessageLookupByLibrary.simpleMessage("IP/掩码"),
|
||||||
"ipv6Desc": MessageLookupByLibrary.simpleMessage("开启后将可以接收IPv6流量"),
|
"ipv6Desc": MessageLookupByLibrary.simpleMessage("开启后将可以接收IPv6流量"),
|
||||||
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage("允许IPv6入站"),
|
"ipv6InboundDesc": MessageLookupByLibrary.simpleMessage("允许IPv6入站"),
|
||||||
|
"ja": MessageLookupByLibrary.simpleMessage("日语"),
|
||||||
"just": MessageLookupByLibrary.simpleMessage("刚刚"),
|
"just": MessageLookupByLibrary.simpleMessage("刚刚"),
|
||||||
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage("TCP保持活动间隔"),
|
"keepAliveIntervalDesc": MessageLookupByLibrary.simpleMessage("TCP保持活动间隔"),
|
||||||
"key": MessageLookupByLibrary.simpleMessage("键"),
|
"key": MessageLookupByLibrary.simpleMessage("键"),
|
||||||
@@ -199,6 +200,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"layout": MessageLookupByLibrary.simpleMessage("布局"),
|
"layout": MessageLookupByLibrary.simpleMessage("布局"),
|
||||||
"light": MessageLookupByLibrary.simpleMessage("浅色"),
|
"light": MessageLookupByLibrary.simpleMessage("浅色"),
|
||||||
"list": MessageLookupByLibrary.simpleMessage("列表"),
|
"list": MessageLookupByLibrary.simpleMessage("列表"),
|
||||||
|
"listen": MessageLookupByLibrary.simpleMessage("监听"),
|
||||||
"local": MessageLookupByLibrary.simpleMessage("本地"),
|
"local": MessageLookupByLibrary.simpleMessage("本地"),
|
||||||
"localBackupDesc": MessageLookupByLibrary.simpleMessage("备份数据到本地"),
|
"localBackupDesc": MessageLookupByLibrary.simpleMessage("备份数据到本地"),
|
||||||
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage("通过文件恢复数据"),
|
"localRecoveryDesc": MessageLookupByLibrary.simpleMessage("通过文件恢复数据"),
|
||||||
@@ -304,7 +306,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"proxyPort": MessageLookupByLibrary.simpleMessage("代理端口"),
|
"proxyPort": MessageLookupByLibrary.simpleMessage("代理端口"),
|
||||||
"proxyPortDesc": MessageLookupByLibrary.simpleMessage("设置Clash监听端口"),
|
"proxyPortDesc": MessageLookupByLibrary.simpleMessage("设置Clash监听端口"),
|
||||||
"proxyProviders": MessageLookupByLibrary.simpleMessage("代理提供者"),
|
"proxyProviders": MessageLookupByLibrary.simpleMessage("代理提供者"),
|
||||||
"prueBlackMode": MessageLookupByLibrary.simpleMessage("纯黑模式"),
|
"pureBlackMode": MessageLookupByLibrary.simpleMessage("纯黑模式"),
|
||||||
"qrcode": MessageLookupByLibrary.simpleMessage("二维码"),
|
"qrcode": MessageLookupByLibrary.simpleMessage("二维码"),
|
||||||
"qrcodeDesc": MessageLookupByLibrary.simpleMessage("扫描二维码获取配置文件"),
|
"qrcodeDesc": MessageLookupByLibrary.simpleMessage("扫描二维码获取配置文件"),
|
||||||
"recovery": MessageLookupByLibrary.simpleMessage("恢复"),
|
"recovery": MessageLookupByLibrary.simpleMessage("恢复"),
|
||||||
@@ -331,6 +333,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"routeMode": MessageLookupByLibrary.simpleMessage("路由模式"),
|
"routeMode": MessageLookupByLibrary.simpleMessage("路由模式"),
|
||||||
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage("绕过私有路由地址"),
|
"routeMode_bypassPrivate": MessageLookupByLibrary.simpleMessage("绕过私有路由地址"),
|
||||||
"routeMode_config": MessageLookupByLibrary.simpleMessage("使用配置"),
|
"routeMode_config": MessageLookupByLibrary.simpleMessage("使用配置"),
|
||||||
|
"ru": MessageLookupByLibrary.simpleMessage("俄语"),
|
||||||
"rule": MessageLookupByLibrary.simpleMessage("规则"),
|
"rule": MessageLookupByLibrary.simpleMessage("规则"),
|
||||||
"ruleProviders": MessageLookupByLibrary.simpleMessage("规则提供者"),
|
"ruleProviders": MessageLookupByLibrary.simpleMessage("规则提供者"),
|
||||||
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
"save": MessageLookupByLibrary.simpleMessage("保存"),
|
||||||
|
|||||||
@@ -255,6 +255,16 @@ class AppLocalizations {
|
|||||||
return Intl.message('English', name: 'en', desc: '', args: []);
|
return Intl.message('English', name: 'en', desc: '', args: []);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `Japanese`
|
||||||
|
String get ja {
|
||||||
|
return Intl.message('Japanese', name: 'ja', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `Russian`
|
||||||
|
String get ru {
|
||||||
|
return Intl.message('Russian', name: 'ru', desc: '', args: []);
|
||||||
|
}
|
||||||
|
|
||||||
/// `Simplified Chinese`
|
/// `Simplified Chinese`
|
||||||
String get zh_CN {
|
String get zh_CN {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
@@ -1670,10 +1680,10 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Auto lose connections`
|
/// `Auto close connections`
|
||||||
String get autoCloseConnections {
|
String get autoCloseConnections {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'Auto lose connections',
|
'Auto close connections',
|
||||||
name: 'autoCloseConnections',
|
name: 'autoCloseConnections',
|
||||||
desc: '',
|
desc: '',
|
||||||
args: [],
|
args: [],
|
||||||
@@ -1720,11 +1730,11 @@ class AppLocalizations {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Prue black mode`
|
/// `Pure black mode`
|
||||||
String get prueBlackMode {
|
String get pureBlackMode {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'Prue black mode',
|
'Pure black mode',
|
||||||
name: 'prueBlackMode',
|
name: 'pureBlackMode',
|
||||||
desc: '',
|
desc: '',
|
||||||
args: [],
|
args: [],
|
||||||
);
|
);
|
||||||
@@ -2679,6 +2689,11 @@ class AppLocalizations {
|
|||||||
args: [],
|
args: [],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `Listen`
|
||||||
|
String get listen {
|
||||||
|
return Intl.message('Listen', name: 'listen', desc: '', args: []);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
||||||
@@ -2687,6 +2702,8 @@ class AppLocalizationDelegate extends LocalizationsDelegate<AppLocalizations> {
|
|||||||
List<Locale> get supportedLocales {
|
List<Locale> get supportedLocales {
|
||||||
return const <Locale>[
|
return const <Locale>[
|
||||||
Locale.fromSubtags(languageCode: 'en'),
|
Locale.fromSubtags(languageCode: 'en'),
|
||||||
|
Locale.fromSubtags(languageCode: 'ja'),
|
||||||
|
Locale.fromSubtags(languageCode: 'ru'),
|
||||||
Locale.fromSubtags(languageCode: 'zh', countryCode: 'CN'),
|
Locale.fromSubtags(languageCode: 'zh', countryCode: 'CN'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
|||||||
import '../enum/enum.dart';
|
import '../enum/enum.dart';
|
||||||
|
|
||||||
part 'generated/clash_config.freezed.dart';
|
part 'generated/clash_config.freezed.dart';
|
||||||
|
|
||||||
part 'generated/clash_config.g.dart';
|
part 'generated/clash_config.g.dart';
|
||||||
|
|
||||||
typedef HostsMap = Map<String, String>;
|
typedef HostsMap = Map<String, String>;
|
||||||
@@ -179,6 +178,7 @@ class FallbackFilter with _$FallbackFilter {
|
|||||||
class Dns with _$Dns {
|
class Dns with _$Dns {
|
||||||
const factory Dns({
|
const factory Dns({
|
||||||
@Default(true) bool enable,
|
@Default(true) bool enable,
|
||||||
|
@Default("0.0.0.0:1053") String listen,
|
||||||
@Default(false) @JsonKey(name: "prefer-h3") bool preferH3,
|
@Default(false) @JsonKey(name: "prefer-h3") bool preferH3,
|
||||||
@Default(true) @JsonKey(name: "use-hosts") bool useHosts,
|
@Default(true) @JsonKey(name: "use-hosts") bool useHosts,
|
||||||
@Default(true) @JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
@Default(true) @JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
||||||
@@ -245,7 +245,7 @@ class GeoXUrl with _$GeoXUrl {
|
|||||||
)
|
)
|
||||||
String mmdb,
|
String mmdb,
|
||||||
@Default(
|
@Default(
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
|
||||||
)
|
)
|
||||||
String asn,
|
String asn,
|
||||||
@Default(
|
@Default(
|
||||||
@@ -273,6 +273,17 @@ class GeoXUrl with _$GeoXUrl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class ClashConfigSnippet with _$ClashConfigSnippet {
|
||||||
|
const factory ClashConfigSnippet({
|
||||||
|
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
|
@Default([]) List<String> rule,
|
||||||
|
}) = _ClashConfigSnippet;
|
||||||
|
|
||||||
|
factory ClashConfigSnippet.fromJson(Map<String, Object?> json) =>
|
||||||
|
_$ClashConfigSnippetFromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class ClashConfig with _$ClashConfig {
|
class ClashConfig with _$ClashConfig {
|
||||||
const factory ClashConfig({
|
const factory ClashConfig({
|
||||||
@@ -301,7 +312,7 @@ class ClashConfig with _$ClashConfig {
|
|||||||
@JsonKey(name: "geodata-loader")
|
@JsonKey(name: "geodata-loader")
|
||||||
GeodataLoader geodataLoader,
|
GeodataLoader geodataLoader,
|
||||||
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
@Default([]) @JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
@Default([]) List<String> rules,
|
@Default([]) List<String> rule,
|
||||||
@JsonKey(name: "global-ua") String? globalUa,
|
@JsonKey(name: "global-ua") String? globalUa,
|
||||||
@Default(ExternalControllerStatus.close)
|
@Default(ExternalControllerStatus.close)
|
||||||
@JsonKey(name: "external-controller")
|
@JsonKey(name: "external-controller")
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
// ignore_for_file: invalid_annotation_target
|
// ignore_for_file: invalid_annotation_target
|
||||||
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:fl_clash/enum/enum.dart';
|
import 'package:fl_clash/enum/enum.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@@ -10,7 +8,6 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
|||||||
import 'models.dart';
|
import 'models.dart';
|
||||||
|
|
||||||
part 'generated/config.freezed.dart';
|
part 'generated/config.freezed.dart';
|
||||||
|
|
||||||
part 'generated/config.g.dart';
|
part 'generated/config.g.dart';
|
||||||
|
|
||||||
const defaultBypassDomain = [
|
const defaultBypassDomain = [
|
||||||
@@ -39,15 +36,10 @@ const defaultNetworkProps = NetworkProps();
|
|||||||
const defaultProxiesStyle = ProxiesStyle();
|
const defaultProxiesStyle = ProxiesStyle();
|
||||||
const defaultWindowProps = WindowProps();
|
const defaultWindowProps = WindowProps();
|
||||||
const defaultAccessControl = AccessControl();
|
const defaultAccessControl = AccessControl();
|
||||||
final defaultThemeProps = Platform.isWindows
|
final defaultThemeProps = ThemeProps().copyWith(
|
||||||
? ThemeProps().copyWith(
|
primaryColor: defaultPrimaryColor.value,
|
||||||
fontFamily: FontFamily.miSans,
|
themeMode: ThemeMode.dark,
|
||||||
primaryColor: defaultPrimaryColor.value,
|
);
|
||||||
)
|
|
||||||
: ThemeProps().copyWith(
|
|
||||||
primaryColor: defaultPrimaryColor.value,
|
|
||||||
themeMode: ThemeMode.dark,
|
|
||||||
);
|
|
||||||
|
|
||||||
const List<DashboardWidget> defaultDashboardWidgets = [
|
const List<DashboardWidget> defaultDashboardWidgets = [
|
||||||
DashboardWidget.networkSpeed,
|
DashboardWidget.networkSpeed,
|
||||||
@@ -185,8 +177,7 @@ class ThemeProps with _$ThemeProps {
|
|||||||
const factory ThemeProps({
|
const factory ThemeProps({
|
||||||
int? primaryColor,
|
int? primaryColor,
|
||||||
@Default(ThemeMode.system) ThemeMode themeMode,
|
@Default(ThemeMode.system) ThemeMode themeMode,
|
||||||
@Default(false) bool prueBlack,
|
@Default(false) bool pureBlack,
|
||||||
@Default(FontFamily.system) FontFamily fontFamily,
|
|
||||||
}) = _ThemeProps;
|
}) = _ThemeProps;
|
||||||
|
|
||||||
factory ThemeProps.fromJson(Map<String, Object?> json) =>
|
factory ThemeProps.fromJson(Map<String, Object?> json) =>
|
||||||
@@ -244,5 +235,4 @@ extension ConfigExt on Config {
|
|||||||
Profile? get currentProfile {
|
Profile? get currentProfile {
|
||||||
return profiles.getProfile(currentProfileId);
|
return profiles.getProfile(currentProfileId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1039,6 +1039,7 @@ Dns _$DnsFromJson(Map<String, dynamic> json) {
|
|||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$Dns {
|
mixin _$Dns {
|
||||||
bool get enable => throw _privateConstructorUsedError;
|
bool get enable => throw _privateConstructorUsedError;
|
||||||
|
String get listen => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "prefer-h3")
|
@JsonKey(name: "prefer-h3")
|
||||||
bool get preferH3 => throw _privateConstructorUsedError;
|
bool get preferH3 => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "use-hosts")
|
@JsonKey(name: "use-hosts")
|
||||||
@@ -1082,6 +1083,7 @@ abstract class $DnsCopyWith<$Res> {
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{bool enable,
|
{bool enable,
|
||||||
|
String listen,
|
||||||
@JsonKey(name: "prefer-h3") bool preferH3,
|
@JsonKey(name: "prefer-h3") bool preferH3,
|
||||||
@JsonKey(name: "use-hosts") bool useHosts,
|
@JsonKey(name: "use-hosts") bool useHosts,
|
||||||
@JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
@JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
||||||
@@ -1116,6 +1118,7 @@ class _$DnsCopyWithImpl<$Res, $Val extends Dns> implements $DnsCopyWith<$Res> {
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? enable = null,
|
Object? enable = null,
|
||||||
|
Object? listen = null,
|
||||||
Object? preferH3 = null,
|
Object? preferH3 = null,
|
||||||
Object? useHosts = null,
|
Object? useHosts = null,
|
||||||
Object? useSystemHosts = null,
|
Object? useSystemHosts = null,
|
||||||
@@ -1136,6 +1139,10 @@ class _$DnsCopyWithImpl<$Res, $Val extends Dns> implements $DnsCopyWith<$Res> {
|
|||||||
? _value.enable
|
? _value.enable
|
||||||
: enable // ignore: cast_nullable_to_non_nullable
|
: enable // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
|
listen: null == listen
|
||||||
|
? _value.listen
|
||||||
|
: listen // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
preferH3: null == preferH3
|
preferH3: null == preferH3
|
||||||
? _value.preferH3
|
? _value.preferH3
|
||||||
: preferH3 // ignore: cast_nullable_to_non_nullable
|
: preferH3 // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -1214,6 +1221,7 @@ abstract class _$$DnsImplCopyWith<$Res> implements $DnsCopyWith<$Res> {
|
|||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call(
|
||||||
{bool enable,
|
{bool enable,
|
||||||
|
String listen,
|
||||||
@JsonKey(name: "prefer-h3") bool preferH3,
|
@JsonKey(name: "prefer-h3") bool preferH3,
|
||||||
@JsonKey(name: "use-hosts") bool useHosts,
|
@JsonKey(name: "use-hosts") bool useHosts,
|
||||||
@JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
@JsonKey(name: "use-system-hosts") bool useSystemHosts,
|
||||||
@@ -1246,6 +1254,7 @@ class __$$DnsImplCopyWithImpl<$Res> extends _$DnsCopyWithImpl<$Res, _$DnsImpl>
|
|||||||
@override
|
@override
|
||||||
$Res call({
|
$Res call({
|
||||||
Object? enable = null,
|
Object? enable = null,
|
||||||
|
Object? listen = null,
|
||||||
Object? preferH3 = null,
|
Object? preferH3 = null,
|
||||||
Object? useHosts = null,
|
Object? useHosts = null,
|
||||||
Object? useSystemHosts = null,
|
Object? useSystemHosts = null,
|
||||||
@@ -1266,6 +1275,10 @@ class __$$DnsImplCopyWithImpl<$Res> extends _$DnsCopyWithImpl<$Res, _$DnsImpl>
|
|||||||
? _value.enable
|
? _value.enable
|
||||||
: enable // ignore: cast_nullable_to_non_nullable
|
: enable // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
|
listen: null == listen
|
||||||
|
? _value.listen
|
||||||
|
: listen // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
preferH3: null == preferH3
|
preferH3: null == preferH3
|
||||||
? _value.preferH3
|
? _value.preferH3
|
||||||
: preferH3 // ignore: cast_nullable_to_non_nullable
|
: preferH3 // ignore: cast_nullable_to_non_nullable
|
||||||
@@ -1331,6 +1344,7 @@ class __$$DnsImplCopyWithImpl<$Res> extends _$DnsCopyWithImpl<$Res, _$DnsImpl>
|
|||||||
class _$DnsImpl implements _Dns {
|
class _$DnsImpl implements _Dns {
|
||||||
const _$DnsImpl(
|
const _$DnsImpl(
|
||||||
{this.enable = true,
|
{this.enable = true,
|
||||||
|
this.listen = "0.0.0.0:1053",
|
||||||
@JsonKey(name: "prefer-h3") this.preferH3 = false,
|
@JsonKey(name: "prefer-h3") this.preferH3 = false,
|
||||||
@JsonKey(name: "use-hosts") this.useHosts = true,
|
@JsonKey(name: "use-hosts") this.useHosts = true,
|
||||||
@JsonKey(name: "use-system-hosts") this.useSystemHosts = true,
|
@JsonKey(name: "use-system-hosts") this.useSystemHosts = true,
|
||||||
@@ -1375,6 +1389,9 @@ class _$DnsImpl implements _Dns {
|
|||||||
@JsonKey()
|
@JsonKey()
|
||||||
final bool enable;
|
final bool enable;
|
||||||
@override
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
final String listen;
|
||||||
|
@override
|
||||||
@JsonKey(name: "prefer-h3")
|
@JsonKey(name: "prefer-h3")
|
||||||
final bool preferH3;
|
final bool preferH3;
|
||||||
@override
|
@override
|
||||||
@@ -1457,7 +1474,7 @@ class _$DnsImpl implements _Dns {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Dns(enable: $enable, preferH3: $preferH3, useHosts: $useHosts, useSystemHosts: $useSystemHosts, respectRules: $respectRules, ipv6: $ipv6, defaultNameserver: $defaultNameserver, enhancedMode: $enhancedMode, fakeIpRange: $fakeIpRange, fakeIpFilter: $fakeIpFilter, nameserverPolicy: $nameserverPolicy, nameserver: $nameserver, fallback: $fallback, proxyServerNameserver: $proxyServerNameserver, fallbackFilter: $fallbackFilter)';
|
return 'Dns(enable: $enable, listen: $listen, preferH3: $preferH3, useHosts: $useHosts, useSystemHosts: $useSystemHosts, respectRules: $respectRules, ipv6: $ipv6, defaultNameserver: $defaultNameserver, enhancedMode: $enhancedMode, fakeIpRange: $fakeIpRange, fakeIpFilter: $fakeIpFilter, nameserverPolicy: $nameserverPolicy, nameserver: $nameserver, fallback: $fallback, proxyServerNameserver: $proxyServerNameserver, fallbackFilter: $fallbackFilter)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -1466,6 +1483,7 @@ class _$DnsImpl implements _Dns {
|
|||||||
(other.runtimeType == runtimeType &&
|
(other.runtimeType == runtimeType &&
|
||||||
other is _$DnsImpl &&
|
other is _$DnsImpl &&
|
||||||
(identical(other.enable, enable) || other.enable == enable) &&
|
(identical(other.enable, enable) || other.enable == enable) &&
|
||||||
|
(identical(other.listen, listen) || other.listen == listen) &&
|
||||||
(identical(other.preferH3, preferH3) ||
|
(identical(other.preferH3, preferH3) ||
|
||||||
other.preferH3 == preferH3) &&
|
other.preferH3 == preferH3) &&
|
||||||
(identical(other.useHosts, useHosts) ||
|
(identical(other.useHosts, useHosts) ||
|
||||||
@@ -1499,6 +1517,7 @@ class _$DnsImpl implements _Dns {
|
|||||||
int get hashCode => Object.hash(
|
int get hashCode => Object.hash(
|
||||||
runtimeType,
|
runtimeType,
|
||||||
enable,
|
enable,
|
||||||
|
listen,
|
||||||
preferH3,
|
preferH3,
|
||||||
useHosts,
|
useHosts,
|
||||||
useSystemHosts,
|
useSystemHosts,
|
||||||
@@ -1533,6 +1552,7 @@ class _$DnsImpl implements _Dns {
|
|||||||
abstract class _Dns implements Dns {
|
abstract class _Dns implements Dns {
|
||||||
const factory _Dns(
|
const factory _Dns(
|
||||||
{final bool enable,
|
{final bool enable,
|
||||||
|
final String listen,
|
||||||
@JsonKey(name: "prefer-h3") final bool preferH3,
|
@JsonKey(name: "prefer-h3") final bool preferH3,
|
||||||
@JsonKey(name: "use-hosts") final bool useHosts,
|
@JsonKey(name: "use-hosts") final bool useHosts,
|
||||||
@JsonKey(name: "use-system-hosts") final bool useSystemHosts,
|
@JsonKey(name: "use-system-hosts") final bool useSystemHosts,
|
||||||
@@ -1556,6 +1576,8 @@ abstract class _Dns implements Dns {
|
|||||||
@override
|
@override
|
||||||
bool get enable;
|
bool get enable;
|
||||||
@override
|
@override
|
||||||
|
String get listen;
|
||||||
|
@override
|
||||||
@JsonKey(name: "prefer-h3")
|
@JsonKey(name: "prefer-h3")
|
||||||
bool get preferH3;
|
bool get preferH3;
|
||||||
@override
|
@override
|
||||||
@@ -1728,7 +1750,7 @@ class _$GeoXUrlImpl implements _GeoXUrl {
|
|||||||
{this.mmdb =
|
{this.mmdb =
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||||
this.asn =
|
this.asn =
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
|
||||||
this.geoip =
|
this.geoip =
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
|
||||||
this.geosite =
|
this.geosite =
|
||||||
@@ -1812,6 +1834,202 @@ abstract class _GeoXUrl implements GeoXUrl {
|
|||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClashConfigSnippet _$ClashConfigSnippetFromJson(Map<String, dynamic> json) {
|
||||||
|
return _ClashConfigSnippet.fromJson(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$ClashConfigSnippet {
|
||||||
|
@JsonKey(name: "proxy-groups")
|
||||||
|
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
||||||
|
List<String> get rule => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Serializes this ClashConfigSnippet to a JSON map.
|
||||||
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of ClashConfigSnippet
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$ClashConfigSnippetCopyWith<ClashConfigSnippet> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $ClashConfigSnippetCopyWith<$Res> {
|
||||||
|
factory $ClashConfigSnippetCopyWith(
|
||||||
|
ClashConfigSnippet value, $Res Function(ClashConfigSnippet) then) =
|
||||||
|
_$ClashConfigSnippetCopyWithImpl<$Res, ClashConfigSnippet>;
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
|
List<String> rule});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$ClashConfigSnippetCopyWithImpl<$Res, $Val extends ClashConfigSnippet>
|
||||||
|
implements $ClashConfigSnippetCopyWith<$Res> {
|
||||||
|
_$ClashConfigSnippetCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of ClashConfigSnippet
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? proxyGroups = null,
|
||||||
|
Object? rule = null,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
proxyGroups: null == proxyGroups
|
||||||
|
? _value.proxyGroups
|
||||||
|
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<ProxyGroup>,
|
||||||
|
rule: null == rule
|
||||||
|
? _value.rule
|
||||||
|
: rule // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$ClashConfigSnippetImplCopyWith<$Res>
|
||||||
|
implements $ClashConfigSnippetCopyWith<$Res> {
|
||||||
|
factory _$$ClashConfigSnippetImplCopyWith(_$ClashConfigSnippetImpl value,
|
||||||
|
$Res Function(_$ClashConfigSnippetImpl) then) =
|
||||||
|
__$$ClashConfigSnippetImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call(
|
||||||
|
{@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
|
List<String> rule});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$ClashConfigSnippetImplCopyWithImpl<$Res>
|
||||||
|
extends _$ClashConfigSnippetCopyWithImpl<$Res, _$ClashConfigSnippetImpl>
|
||||||
|
implements _$$ClashConfigSnippetImplCopyWith<$Res> {
|
||||||
|
__$$ClashConfigSnippetImplCopyWithImpl(_$ClashConfigSnippetImpl _value,
|
||||||
|
$Res Function(_$ClashConfigSnippetImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of ClashConfigSnippet
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? proxyGroups = null,
|
||||||
|
Object? rule = null,
|
||||||
|
}) {
|
||||||
|
return _then(_$ClashConfigSnippetImpl(
|
||||||
|
proxyGroups: null == proxyGroups
|
||||||
|
? _value._proxyGroups
|
||||||
|
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<ProxyGroup>,
|
||||||
|
rule: null == rule
|
||||||
|
? _value._rule
|
||||||
|
: rule // ignore: cast_nullable_to_non_nullable
|
||||||
|
as List<String>,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
@JsonSerializable()
|
||||||
|
class _$ClashConfigSnippetImpl implements _ClashConfigSnippet {
|
||||||
|
const _$ClashConfigSnippetImpl(
|
||||||
|
{@JsonKey(name: "proxy-groups")
|
||||||
|
final List<ProxyGroup> proxyGroups = const [],
|
||||||
|
final List<String> rule = const []})
|
||||||
|
: _proxyGroups = proxyGroups,
|
||||||
|
_rule = rule;
|
||||||
|
|
||||||
|
factory _$ClashConfigSnippetImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$$ClashConfigSnippetImplFromJson(json);
|
||||||
|
|
||||||
|
final List<ProxyGroup> _proxyGroups;
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "proxy-groups")
|
||||||
|
List<ProxyGroup> get proxyGroups {
|
||||||
|
if (_proxyGroups is EqualUnmodifiableListView) return _proxyGroups;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_proxyGroups);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<String> _rule;
|
||||||
|
@override
|
||||||
|
@JsonKey()
|
||||||
|
List<String> get rule {
|
||||||
|
if (_rule is EqualUnmodifiableListView) return _rule;
|
||||||
|
// ignore: implicit_dynamic_type
|
||||||
|
return EqualUnmodifiableListView(_rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'ClashConfigSnippet(proxyGroups: $proxyGroups, rule: $rule)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$ClashConfigSnippetImpl &&
|
||||||
|
const DeepCollectionEquality()
|
||||||
|
.equals(other._proxyGroups, _proxyGroups) &&
|
||||||
|
const DeepCollectionEquality().equals(other._rule, _rule));
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType,
|
||||||
|
const DeepCollectionEquality().hash(_proxyGroups),
|
||||||
|
const DeepCollectionEquality().hash(_rule));
|
||||||
|
|
||||||
|
/// Create a copy of ClashConfigSnippet
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$ClashConfigSnippetImplCopyWith<_$ClashConfigSnippetImpl> get copyWith =>
|
||||||
|
__$$ClashConfigSnippetImplCopyWithImpl<_$ClashConfigSnippetImpl>(
|
||||||
|
this, _$identity);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return _$$ClashConfigSnippetImplToJson(
|
||||||
|
this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _ClashConfigSnippet implements ClashConfigSnippet {
|
||||||
|
const factory _ClashConfigSnippet(
|
||||||
|
{@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
||||||
|
final List<String> rule}) = _$ClashConfigSnippetImpl;
|
||||||
|
|
||||||
|
factory _ClashConfigSnippet.fromJson(Map<String, dynamic> json) =
|
||||||
|
_$ClashConfigSnippetImpl.fromJson;
|
||||||
|
|
||||||
|
@override
|
||||||
|
@JsonKey(name: "proxy-groups")
|
||||||
|
List<ProxyGroup> get proxyGroups;
|
||||||
|
@override
|
||||||
|
List<String> get rule;
|
||||||
|
|
||||||
|
/// Create a copy of ClashConfigSnippet
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$ClashConfigSnippetImplCopyWith<_$ClashConfigSnippetImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
ClashConfig _$ClashConfigFromJson(Map<String, dynamic> json) {
|
ClashConfig _$ClashConfigFromJson(Map<String, dynamic> json) {
|
||||||
return _ClashConfig.fromJson(json);
|
return _ClashConfig.fromJson(json);
|
||||||
}
|
}
|
||||||
@@ -1844,7 +2062,7 @@ mixin _$ClashConfig {
|
|||||||
GeodataLoader get geodataLoader => throw _privateConstructorUsedError;
|
GeodataLoader get geodataLoader => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "proxy-groups")
|
@JsonKey(name: "proxy-groups")
|
||||||
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
List<ProxyGroup> get proxyGroups => throw _privateConstructorUsedError;
|
||||||
List<String> get rules => throw _privateConstructorUsedError;
|
List<String> get rule => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "global-ua")
|
@JsonKey(name: "global-ua")
|
||||||
String? get globalUa => throw _privateConstructorUsedError;
|
String? get globalUa => throw _privateConstructorUsedError;
|
||||||
@JsonKey(name: "external-controller")
|
@JsonKey(name: "external-controller")
|
||||||
@@ -1885,7 +2103,7 @@ abstract class $ClashConfigCopyWith<$Res> {
|
|||||||
GeoXUrl geoXUrl,
|
GeoXUrl geoXUrl,
|
||||||
@JsonKey(name: "geodata-loader") GeodataLoader geodataLoader,
|
@JsonKey(name: "geodata-loader") GeodataLoader geodataLoader,
|
||||||
@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
List<String> rules,
|
List<String> rule,
|
||||||
@JsonKey(name: "global-ua") String? globalUa,
|
@JsonKey(name: "global-ua") String? globalUa,
|
||||||
@JsonKey(name: "external-controller")
|
@JsonKey(name: "external-controller")
|
||||||
ExternalControllerStatus externalController,
|
ExternalControllerStatus externalController,
|
||||||
@@ -1925,7 +2143,7 @@ class _$ClashConfigCopyWithImpl<$Res, $Val extends ClashConfig>
|
|||||||
Object? geoXUrl = null,
|
Object? geoXUrl = null,
|
||||||
Object? geodataLoader = null,
|
Object? geodataLoader = null,
|
||||||
Object? proxyGroups = null,
|
Object? proxyGroups = null,
|
||||||
Object? rules = null,
|
Object? rule = null,
|
||||||
Object? globalUa = freezed,
|
Object? globalUa = freezed,
|
||||||
Object? externalController = null,
|
Object? externalController = null,
|
||||||
Object? hosts = null,
|
Object? hosts = null,
|
||||||
@@ -1987,9 +2205,9 @@ class _$ClashConfigCopyWithImpl<$Res, $Val extends ClashConfig>
|
|||||||
? _value.proxyGroups
|
? _value.proxyGroups
|
||||||
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||||
as List<ProxyGroup>,
|
as List<ProxyGroup>,
|
||||||
rules: null == rules
|
rule: null == rule
|
||||||
? _value.rules
|
? _value.rule
|
||||||
: rules // ignore: cast_nullable_to_non_nullable
|
: rule // ignore: cast_nullable_to_non_nullable
|
||||||
as List<String>,
|
as List<String>,
|
||||||
globalUa: freezed == globalUa
|
globalUa: freezed == globalUa
|
||||||
? _value.globalUa
|
? _value.globalUa
|
||||||
@@ -2062,7 +2280,7 @@ abstract class _$$ClashConfigImplCopyWith<$Res>
|
|||||||
GeoXUrl geoXUrl,
|
GeoXUrl geoXUrl,
|
||||||
@JsonKey(name: "geodata-loader") GeodataLoader geodataLoader,
|
@JsonKey(name: "geodata-loader") GeodataLoader geodataLoader,
|
||||||
@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
@JsonKey(name: "proxy-groups") List<ProxyGroup> proxyGroups,
|
||||||
List<String> rules,
|
List<String> rule,
|
||||||
@JsonKey(name: "global-ua") String? globalUa,
|
@JsonKey(name: "global-ua") String? globalUa,
|
||||||
@JsonKey(name: "external-controller")
|
@JsonKey(name: "external-controller")
|
||||||
ExternalControllerStatus externalController,
|
ExternalControllerStatus externalController,
|
||||||
@@ -2103,7 +2321,7 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
|||||||
Object? geoXUrl = null,
|
Object? geoXUrl = null,
|
||||||
Object? geodataLoader = null,
|
Object? geodataLoader = null,
|
||||||
Object? proxyGroups = null,
|
Object? proxyGroups = null,
|
||||||
Object? rules = null,
|
Object? rule = null,
|
||||||
Object? globalUa = freezed,
|
Object? globalUa = freezed,
|
||||||
Object? externalController = null,
|
Object? externalController = null,
|
||||||
Object? hosts = null,
|
Object? hosts = null,
|
||||||
@@ -2165,9 +2383,9 @@ class __$$ClashConfigImplCopyWithImpl<$Res>
|
|||||||
? _value._proxyGroups
|
? _value._proxyGroups
|
||||||
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
: proxyGroups // ignore: cast_nullable_to_non_nullable
|
||||||
as List<ProxyGroup>,
|
as List<ProxyGroup>,
|
||||||
rules: null == rules
|
rule: null == rule
|
||||||
? _value._rules
|
? _value._rule
|
||||||
: rules // ignore: cast_nullable_to_non_nullable
|
: rule // ignore: cast_nullable_to_non_nullable
|
||||||
as List<String>,
|
as List<String>,
|
||||||
globalUa: freezed == globalUa
|
globalUa: freezed == globalUa
|
||||||
? _value.globalUa
|
? _value.globalUa
|
||||||
@@ -2208,13 +2426,13 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
this.geodataLoader = GeodataLoader.memconservative,
|
this.geodataLoader = GeodataLoader.memconservative,
|
||||||
@JsonKey(name: "proxy-groups")
|
@JsonKey(name: "proxy-groups")
|
||||||
final List<ProxyGroup> proxyGroups = const [],
|
final List<ProxyGroup> proxyGroups = const [],
|
||||||
final List<String> rules = const [],
|
final List<String> rule = const [],
|
||||||
@JsonKey(name: "global-ua") this.globalUa,
|
@JsonKey(name: "global-ua") this.globalUa,
|
||||||
@JsonKey(name: "external-controller")
|
@JsonKey(name: "external-controller")
|
||||||
this.externalController = ExternalControllerStatus.close,
|
this.externalController = ExternalControllerStatus.close,
|
||||||
final Map<String, String> hosts = const {}})
|
final Map<String, String> hosts = const {}})
|
||||||
: _proxyGroups = proxyGroups,
|
: _proxyGroups = proxyGroups,
|
||||||
_rules = rules,
|
_rule = rule,
|
||||||
_hosts = hosts;
|
_hosts = hosts;
|
||||||
|
|
||||||
factory _$ClashConfigImpl.fromJson(Map<String, dynamic> json) =>
|
factory _$ClashConfigImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
@@ -2268,13 +2486,13 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
return EqualUnmodifiableListView(_proxyGroups);
|
return EqualUnmodifiableListView(_proxyGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<String> _rules;
|
final List<String> _rule;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
List<String> get rules {
|
List<String> get rule {
|
||||||
if (_rules is EqualUnmodifiableListView) return _rules;
|
if (_rule is EqualUnmodifiableListView) return _rule;
|
||||||
// ignore: implicit_dynamic_type
|
// ignore: implicit_dynamic_type
|
||||||
return EqualUnmodifiableListView(_rules);
|
return EqualUnmodifiableListView(_rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -2294,7 +2512,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'ClashConfig(mixedPort: $mixedPort, mode: $mode, allowLan: $allowLan, logLevel: $logLevel, ipv6: $ipv6, findProcessMode: $findProcessMode, keepAliveInterval: $keepAliveInterval, unifiedDelay: $unifiedDelay, tcpConcurrent: $tcpConcurrent, tun: $tun, dns: $dns, geoXUrl: $geoXUrl, geodataLoader: $geodataLoader, proxyGroups: $proxyGroups, rules: $rules, globalUa: $globalUa, externalController: $externalController, hosts: $hosts)';
|
return 'ClashConfig(mixedPort: $mixedPort, mode: $mode, allowLan: $allowLan, logLevel: $logLevel, ipv6: $ipv6, findProcessMode: $findProcessMode, keepAliveInterval: $keepAliveInterval, unifiedDelay: $unifiedDelay, tcpConcurrent: $tcpConcurrent, tun: $tun, dns: $dns, geoXUrl: $geoXUrl, geodataLoader: $geodataLoader, proxyGroups: $proxyGroups, rule: $rule, globalUa: $globalUa, externalController: $externalController, hosts: $hosts)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -2325,7 +2543,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
other.geodataLoader == geodataLoader) &&
|
other.geodataLoader == geodataLoader) &&
|
||||||
const DeepCollectionEquality()
|
const DeepCollectionEquality()
|
||||||
.equals(other._proxyGroups, _proxyGroups) &&
|
.equals(other._proxyGroups, _proxyGroups) &&
|
||||||
const DeepCollectionEquality().equals(other._rules, _rules) &&
|
const DeepCollectionEquality().equals(other._rule, _rule) &&
|
||||||
(identical(other.globalUa, globalUa) ||
|
(identical(other.globalUa, globalUa) ||
|
||||||
other.globalUa == globalUa) &&
|
other.globalUa == globalUa) &&
|
||||||
(identical(other.externalController, externalController) ||
|
(identical(other.externalController, externalController) ||
|
||||||
@@ -2351,7 +2569,7 @@ class _$ClashConfigImpl implements _ClashConfig {
|
|||||||
geoXUrl,
|
geoXUrl,
|
||||||
geodataLoader,
|
geodataLoader,
|
||||||
const DeepCollectionEquality().hash(_proxyGroups),
|
const DeepCollectionEquality().hash(_proxyGroups),
|
||||||
const DeepCollectionEquality().hash(_rules),
|
const DeepCollectionEquality().hash(_rule),
|
||||||
globalUa,
|
globalUa,
|
||||||
externalController,
|
externalController,
|
||||||
const DeepCollectionEquality().hash(_hosts));
|
const DeepCollectionEquality().hash(_hosts));
|
||||||
@@ -2390,7 +2608,7 @@ abstract class _ClashConfig implements ClashConfig {
|
|||||||
final GeoXUrl geoXUrl,
|
final GeoXUrl geoXUrl,
|
||||||
@JsonKey(name: "geodata-loader") final GeodataLoader geodataLoader,
|
@JsonKey(name: "geodata-loader") final GeodataLoader geodataLoader,
|
||||||
@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
@JsonKey(name: "proxy-groups") final List<ProxyGroup> proxyGroups,
|
||||||
final List<String> rules,
|
final List<String> rule,
|
||||||
@JsonKey(name: "global-ua") final String? globalUa,
|
@JsonKey(name: "global-ua") final String? globalUa,
|
||||||
@JsonKey(name: "external-controller")
|
@JsonKey(name: "external-controller")
|
||||||
final ExternalControllerStatus externalController,
|
final ExternalControllerStatus externalController,
|
||||||
@@ -2440,7 +2658,7 @@ abstract class _ClashConfig implements ClashConfig {
|
|||||||
@JsonKey(name: "proxy-groups")
|
@JsonKey(name: "proxy-groups")
|
||||||
List<ProxyGroup> get proxyGroups;
|
List<ProxyGroup> get proxyGroups;
|
||||||
@override
|
@override
|
||||||
List<String> get rules;
|
List<String> get rule;
|
||||||
@override
|
@override
|
||||||
@JsonKey(name: "global-ua")
|
@JsonKey(name: "global-ua")
|
||||||
String? get globalUa;
|
String? get globalUa;
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ Map<String, dynamic> _$$FallbackFilterImplToJson(
|
|||||||
|
|
||||||
_$DnsImpl _$$DnsImplFromJson(Map<String, dynamic> json) => _$DnsImpl(
|
_$DnsImpl _$$DnsImplFromJson(Map<String, dynamic> json) => _$DnsImpl(
|
||||||
enable: json['enable'] as bool? ?? true,
|
enable: json['enable'] as bool? ?? true,
|
||||||
|
listen: json['listen'] as String? ?? "0.0.0.0:1053",
|
||||||
preferH3: json['prefer-h3'] as bool? ?? false,
|
preferH3: json['prefer-h3'] as bool? ?? false,
|
||||||
useHosts: json['use-hosts'] as bool? ?? true,
|
useHosts: json['use-hosts'] as bool? ?? true,
|
||||||
useSystemHosts: json['use-system-hosts'] as bool? ?? true,
|
useSystemHosts: json['use-system-hosts'] as bool? ?? true,
|
||||||
@@ -161,6 +162,7 @@ _$DnsImpl _$$DnsImplFromJson(Map<String, dynamic> json) => _$DnsImpl(
|
|||||||
|
|
||||||
Map<String, dynamic> _$$DnsImplToJson(_$DnsImpl instance) => <String, dynamic>{
|
Map<String, dynamic> _$$DnsImplToJson(_$DnsImpl instance) => <String, dynamic>{
|
||||||
'enable': instance.enable,
|
'enable': instance.enable,
|
||||||
|
'listen': instance.listen,
|
||||||
'prefer-h3': instance.preferH3,
|
'prefer-h3': instance.preferH3,
|
||||||
'use-hosts': instance.useHosts,
|
'use-hosts': instance.useHosts,
|
||||||
'use-system-hosts': instance.useSystemHosts,
|
'use-system-hosts': instance.useSystemHosts,
|
||||||
@@ -189,7 +191,7 @@ _$GeoXUrlImpl _$$GeoXUrlImplFromJson(Map<String, dynamic> json) =>
|
|||||||
mmdb: json['mmdb'] as String? ??
|
mmdb: json['mmdb'] as String? ??
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
||||||
asn: json['asn'] as String? ??
|
asn: json['asn'] as String? ??
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.metadb",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb",
|
||||||
geoip: json['geoip'] as String? ??
|
geoip: json['geoip'] as String? ??
|
||||||
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
|
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat",
|
||||||
geosite: json['geosite'] as String? ??
|
geosite: json['geosite'] as String? ??
|
||||||
@@ -204,6 +206,25 @@ Map<String, dynamic> _$$GeoXUrlImplToJson(_$GeoXUrlImpl instance) =>
|
|||||||
'geosite': instance.geosite,
|
'geosite': instance.geosite,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_$ClashConfigSnippetImpl _$$ClashConfigSnippetImplFromJson(
|
||||||
|
Map<String, dynamic> json) =>
|
||||||
|
_$ClashConfigSnippetImpl(
|
||||||
|
proxyGroups: (json['proxy-groups'] as List<dynamic>?)
|
||||||
|
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
||||||
|
.toList() ??
|
||||||
|
const [],
|
||||||
|
rule:
|
||||||
|
(json['rule'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||||
|
const [],
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<String, dynamic> _$$ClashConfigSnippetImplToJson(
|
||||||
|
_$ClashConfigSnippetImpl instance) =>
|
||||||
|
<String, dynamic>{
|
||||||
|
'proxy-groups': instance.proxyGroups,
|
||||||
|
'rule': instance.rule,
|
||||||
|
};
|
||||||
|
|
||||||
_$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
_$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
||||||
_$ClashConfigImpl(
|
_$ClashConfigImpl(
|
||||||
mixedPort: (json['mixed-port'] as num?)?.toInt() ?? defaultMixedPort,
|
mixedPort: (json['mixed-port'] as num?)?.toInt() ?? defaultMixedPort,
|
||||||
@@ -236,8 +257,8 @@ _$ClashConfigImpl _$$ClashConfigImplFromJson(Map<String, dynamic> json) =>
|
|||||||
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
?.map((e) => ProxyGroup.fromJson(e as Map<String, dynamic>))
|
||||||
.toList() ??
|
.toList() ??
|
||||||
const [],
|
const [],
|
||||||
rules:
|
rule:
|
||||||
(json['rules'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
(json['rule'] as List<dynamic>?)?.map((e) => e as String).toList() ??
|
||||||
const [],
|
const [],
|
||||||
globalUa: json['global-ua'] as String?,
|
globalUa: json['global-ua'] as String?,
|
||||||
externalController: $enumDecodeNullable(
|
externalController: $enumDecodeNullable(
|
||||||
@@ -265,7 +286,7 @@ Map<String, dynamic> _$$ClashConfigImplToJson(_$ClashConfigImpl instance) =>
|
|||||||
'geox-url': instance.geoXUrl,
|
'geox-url': instance.geoXUrl,
|
||||||
'geodata-loader': _$GeodataLoaderEnumMap[instance.geodataLoader]!,
|
'geodata-loader': _$GeodataLoaderEnumMap[instance.geodataLoader]!,
|
||||||
'proxy-groups': instance.proxyGroups,
|
'proxy-groups': instance.proxyGroups,
|
||||||
'rules': instance.rules,
|
'rule': instance.rule,
|
||||||
'global-ua': instance.globalUa,
|
'global-ua': instance.globalUa,
|
||||||
'external-controller':
|
'external-controller':
|
||||||
_$ExternalControllerStatusEnumMap[instance.externalController]!,
|
_$ExternalControllerStatusEnumMap[instance.externalController]!,
|
||||||
|
|||||||
@@ -1725,8 +1725,7 @@ ThemeProps _$ThemePropsFromJson(Map<String, dynamic> json) {
|
|||||||
mixin _$ThemeProps {
|
mixin _$ThemeProps {
|
||||||
int? get primaryColor => throw _privateConstructorUsedError;
|
int? get primaryColor => throw _privateConstructorUsedError;
|
||||||
ThemeMode get themeMode => throw _privateConstructorUsedError;
|
ThemeMode get themeMode => throw _privateConstructorUsedError;
|
||||||
bool get prueBlack => throw _privateConstructorUsedError;
|
bool get pureBlack => throw _privateConstructorUsedError;
|
||||||
FontFamily get fontFamily => throw _privateConstructorUsedError;
|
|
||||||
|
|
||||||
/// Serializes this ThemeProps to a JSON map.
|
/// Serializes this ThemeProps to a JSON map.
|
||||||
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
|
||||||
@@ -1744,11 +1743,7 @@ abstract class $ThemePropsCopyWith<$Res> {
|
|||||||
ThemeProps value, $Res Function(ThemeProps) then) =
|
ThemeProps value, $Res Function(ThemeProps) then) =
|
||||||
_$ThemePropsCopyWithImpl<$Res, ThemeProps>;
|
_$ThemePropsCopyWithImpl<$Res, ThemeProps>;
|
||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call({int? primaryColor, ThemeMode themeMode, bool pureBlack});
|
||||||
{int? primaryColor,
|
|
||||||
ThemeMode themeMode,
|
|
||||||
bool prueBlack,
|
|
||||||
FontFamily fontFamily});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -1768,8 +1763,7 @@ class _$ThemePropsCopyWithImpl<$Res, $Val extends ThemeProps>
|
|||||||
$Res call({
|
$Res call({
|
||||||
Object? primaryColor = freezed,
|
Object? primaryColor = freezed,
|
||||||
Object? themeMode = null,
|
Object? themeMode = null,
|
||||||
Object? prueBlack = null,
|
Object? pureBlack = null,
|
||||||
Object? fontFamily = null,
|
|
||||||
}) {
|
}) {
|
||||||
return _then(_value.copyWith(
|
return _then(_value.copyWith(
|
||||||
primaryColor: freezed == primaryColor
|
primaryColor: freezed == primaryColor
|
||||||
@@ -1780,14 +1774,10 @@ class _$ThemePropsCopyWithImpl<$Res, $Val extends ThemeProps>
|
|||||||
? _value.themeMode
|
? _value.themeMode
|
||||||
: themeMode // ignore: cast_nullable_to_non_nullable
|
: themeMode // ignore: cast_nullable_to_non_nullable
|
||||||
as ThemeMode,
|
as ThemeMode,
|
||||||
prueBlack: null == prueBlack
|
pureBlack: null == pureBlack
|
||||||
? _value.prueBlack
|
? _value.pureBlack
|
||||||
: prueBlack // ignore: cast_nullable_to_non_nullable
|
: pureBlack // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
fontFamily: null == fontFamily
|
|
||||||
? _value.fontFamily
|
|
||||||
: fontFamily // ignore: cast_nullable_to_non_nullable
|
|
||||||
as FontFamily,
|
|
||||||
) as $Val);
|
) as $Val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1800,11 +1790,7 @@ abstract class _$$ThemePropsImplCopyWith<$Res>
|
|||||||
__$$ThemePropsImplCopyWithImpl<$Res>;
|
__$$ThemePropsImplCopyWithImpl<$Res>;
|
||||||
@override
|
@override
|
||||||
@useResult
|
@useResult
|
||||||
$Res call(
|
$Res call({int? primaryColor, ThemeMode themeMode, bool pureBlack});
|
||||||
{int? primaryColor,
|
|
||||||
ThemeMode themeMode,
|
|
||||||
bool prueBlack,
|
|
||||||
FontFamily fontFamily});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
@@ -1822,8 +1808,7 @@ class __$$ThemePropsImplCopyWithImpl<$Res>
|
|||||||
$Res call({
|
$Res call({
|
||||||
Object? primaryColor = freezed,
|
Object? primaryColor = freezed,
|
||||||
Object? themeMode = null,
|
Object? themeMode = null,
|
||||||
Object? prueBlack = null,
|
Object? pureBlack = null,
|
||||||
Object? fontFamily = null,
|
|
||||||
}) {
|
}) {
|
||||||
return _then(_$ThemePropsImpl(
|
return _then(_$ThemePropsImpl(
|
||||||
primaryColor: freezed == primaryColor
|
primaryColor: freezed == primaryColor
|
||||||
@@ -1834,14 +1819,10 @@ class __$$ThemePropsImplCopyWithImpl<$Res>
|
|||||||
? _value.themeMode
|
? _value.themeMode
|
||||||
: themeMode // ignore: cast_nullable_to_non_nullable
|
: themeMode // ignore: cast_nullable_to_non_nullable
|
||||||
as ThemeMode,
|
as ThemeMode,
|
||||||
prueBlack: null == prueBlack
|
pureBlack: null == pureBlack
|
||||||
? _value.prueBlack
|
? _value.pureBlack
|
||||||
: prueBlack // ignore: cast_nullable_to_non_nullable
|
: pureBlack // ignore: cast_nullable_to_non_nullable
|
||||||
as bool,
|
as bool,
|
||||||
fontFamily: null == fontFamily
|
|
||||||
? _value.fontFamily
|
|
||||||
: fontFamily // ignore: cast_nullable_to_non_nullable
|
|
||||||
as FontFamily,
|
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1852,8 +1833,7 @@ class _$ThemePropsImpl implements _ThemeProps {
|
|||||||
const _$ThemePropsImpl(
|
const _$ThemePropsImpl(
|
||||||
{this.primaryColor,
|
{this.primaryColor,
|
||||||
this.themeMode = ThemeMode.system,
|
this.themeMode = ThemeMode.system,
|
||||||
this.prueBlack = false,
|
this.pureBlack = false});
|
||||||
this.fontFamily = FontFamily.system});
|
|
||||||
|
|
||||||
factory _$ThemePropsImpl.fromJson(Map<String, dynamic> json) =>
|
factory _$ThemePropsImpl.fromJson(Map<String, dynamic> json) =>
|
||||||
_$$ThemePropsImplFromJson(json);
|
_$$ThemePropsImplFromJson(json);
|
||||||
@@ -1865,14 +1845,11 @@ class _$ThemePropsImpl implements _ThemeProps {
|
|||||||
final ThemeMode themeMode;
|
final ThemeMode themeMode;
|
||||||
@override
|
@override
|
||||||
@JsonKey()
|
@JsonKey()
|
||||||
final bool prueBlack;
|
final bool pureBlack;
|
||||||
@override
|
|
||||||
@JsonKey()
|
|
||||||
final FontFamily fontFamily;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'ThemeProps(primaryColor: $primaryColor, themeMode: $themeMode, prueBlack: $prueBlack, fontFamily: $fontFamily)';
|
return 'ThemeProps(primaryColor: $primaryColor, themeMode: $themeMode, pureBlack: $pureBlack)';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -1884,16 +1861,14 @@ class _$ThemePropsImpl implements _ThemeProps {
|
|||||||
other.primaryColor == primaryColor) &&
|
other.primaryColor == primaryColor) &&
|
||||||
(identical(other.themeMode, themeMode) ||
|
(identical(other.themeMode, themeMode) ||
|
||||||
other.themeMode == themeMode) &&
|
other.themeMode == themeMode) &&
|
||||||
(identical(other.prueBlack, prueBlack) ||
|
(identical(other.pureBlack, pureBlack) ||
|
||||||
other.prueBlack == prueBlack) &&
|
other.pureBlack == pureBlack));
|
||||||
(identical(other.fontFamily, fontFamily) ||
|
|
||||||
other.fontFamily == fontFamily));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonKey(includeFromJson: false, includeToJson: false)
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
@override
|
@override
|
||||||
int get hashCode =>
|
int get hashCode =>
|
||||||
Object.hash(runtimeType, primaryColor, themeMode, prueBlack, fontFamily);
|
Object.hash(runtimeType, primaryColor, themeMode, pureBlack);
|
||||||
|
|
||||||
/// Create a copy of ThemeProps
|
/// Create a copy of ThemeProps
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
@@ -1915,8 +1890,7 @@ abstract class _ThemeProps implements ThemeProps {
|
|||||||
const factory _ThemeProps(
|
const factory _ThemeProps(
|
||||||
{final int? primaryColor,
|
{final int? primaryColor,
|
||||||
final ThemeMode themeMode,
|
final ThemeMode themeMode,
|
||||||
final bool prueBlack,
|
final bool pureBlack}) = _$ThemePropsImpl;
|
||||||
final FontFamily fontFamily}) = _$ThemePropsImpl;
|
|
||||||
|
|
||||||
factory _ThemeProps.fromJson(Map<String, dynamic> json) =
|
factory _ThemeProps.fromJson(Map<String, dynamic> json) =
|
||||||
_$ThemePropsImpl.fromJson;
|
_$ThemePropsImpl.fromJson;
|
||||||
@@ -1926,9 +1900,7 @@ abstract class _ThemeProps implements ThemeProps {
|
|||||||
@override
|
@override
|
||||||
ThemeMode get themeMode;
|
ThemeMode get themeMode;
|
||||||
@override
|
@override
|
||||||
bool get prueBlack;
|
bool get pureBlack;
|
||||||
@override
|
|
||||||
FontFamily get fontFamily;
|
|
||||||
|
|
||||||
/// Create a copy of ThemeProps
|
/// Create a copy of ThemeProps
|
||||||
/// with the given fields replaced by the non-null parameter values.
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
|||||||
@@ -224,18 +224,14 @@ _$ThemePropsImpl _$$ThemePropsImplFromJson(Map<String, dynamic> json) =>
|
|||||||
primaryColor: (json['primaryColor'] as num?)?.toInt(),
|
primaryColor: (json['primaryColor'] as num?)?.toInt(),
|
||||||
themeMode: $enumDecodeNullable(_$ThemeModeEnumMap, json['themeMode']) ??
|
themeMode: $enumDecodeNullable(_$ThemeModeEnumMap, json['themeMode']) ??
|
||||||
ThemeMode.system,
|
ThemeMode.system,
|
||||||
prueBlack: json['prueBlack'] as bool? ?? false,
|
pureBlack: json['pureBlack'] as bool? ?? false,
|
||||||
fontFamily:
|
|
||||||
$enumDecodeNullable(_$FontFamilyEnumMap, json['fontFamily']) ??
|
|
||||||
FontFamily.system,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> _$$ThemePropsImplToJson(_$ThemePropsImpl instance) =>
|
Map<String, dynamic> _$$ThemePropsImplToJson(_$ThemePropsImpl instance) =>
|
||||||
<String, dynamic>{
|
<String, dynamic>{
|
||||||
'primaryColor': instance.primaryColor,
|
'primaryColor': instance.primaryColor,
|
||||||
'themeMode': _$ThemeModeEnumMap[instance.themeMode]!,
|
'themeMode': _$ThemeModeEnumMap[instance.themeMode]!,
|
||||||
'prueBlack': instance.prueBlack,
|
'pureBlack': instance.pureBlack,
|
||||||
'fontFamily': _$FontFamilyEnumMap[instance.fontFamily]!,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const _$ThemeModeEnumMap = {
|
const _$ThemeModeEnumMap = {
|
||||||
@@ -244,13 +240,6 @@ const _$ThemeModeEnumMap = {
|
|||||||
ThemeMode.dark: 'dark',
|
ThemeMode.dark: 'dark',
|
||||||
};
|
};
|
||||||
|
|
||||||
const _$FontFamilyEnumMap = {
|
|
||||||
FontFamily.system: 'system',
|
|
||||||
FontFamily.miSans: 'miSans',
|
|
||||||
FontFamily.twEmoji: 'twEmoji',
|
|
||||||
FontFamily.icon: 'icon',
|
|
||||||
};
|
|
||||||
|
|
||||||
_$ConfigImpl _$$ConfigImplFromJson(Map<String, dynamic> json) => _$ConfigImpl(
|
_$ConfigImpl _$$ConfigImplFromJson(Map<String, dynamic> json) => _$ConfigImpl(
|
||||||
appSetting: json['appSetting'] == null
|
appSetting: json['appSetting'] == null
|
||||||
? defaultAppSettingProps
|
? defaultAppSettingProps
|
||||||
|
|||||||
@@ -14,6 +14,153 @@ T _$identity<T>(T value) => value;
|
|||||||
final _privateConstructorUsedError = UnsupportedError(
|
final _privateConstructorUsedError = UnsupportedError(
|
||||||
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$VM2<A, B> {
|
||||||
|
A get a => throw _privateConstructorUsedError;
|
||||||
|
B get b => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of VM2
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$VM2CopyWith<A, B, VM2<A, B>> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $VM2CopyWith<A, B, $Res> {
|
||||||
|
factory $VM2CopyWith(VM2<A, B> value, $Res Function(VM2<A, B>) then) =
|
||||||
|
_$VM2CopyWithImpl<A, B, $Res, VM2<A, B>>;
|
||||||
|
@useResult
|
||||||
|
$Res call({A a, B b});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$VM2CopyWithImpl<A, B, $Res, $Val extends VM2<A, B>>
|
||||||
|
implements $VM2CopyWith<A, B, $Res> {
|
||||||
|
_$VM2CopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of VM2
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? a = freezed,
|
||||||
|
Object? b = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
a: freezed == a
|
||||||
|
? _value.a
|
||||||
|
: a // ignore: cast_nullable_to_non_nullable
|
||||||
|
as A,
|
||||||
|
b: freezed == b
|
||||||
|
? _value.b
|
||||||
|
: b // ignore: cast_nullable_to_non_nullable
|
||||||
|
as B,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$VM2ImplCopyWith<A, B, $Res>
|
||||||
|
implements $VM2CopyWith<A, B, $Res> {
|
||||||
|
factory _$$VM2ImplCopyWith(
|
||||||
|
_$VM2Impl<A, B> value, $Res Function(_$VM2Impl<A, B>) then) =
|
||||||
|
__$$VM2ImplCopyWithImpl<A, B, $Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({A a, B b});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$VM2ImplCopyWithImpl<A, B, $Res>
|
||||||
|
extends _$VM2CopyWithImpl<A, B, $Res, _$VM2Impl<A, B>>
|
||||||
|
implements _$$VM2ImplCopyWith<A, B, $Res> {
|
||||||
|
__$$VM2ImplCopyWithImpl(
|
||||||
|
_$VM2Impl<A, B> _value, $Res Function(_$VM2Impl<A, B>) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of VM2
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? a = freezed,
|
||||||
|
Object? b = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_$VM2Impl<A, B>(
|
||||||
|
a: freezed == a
|
||||||
|
? _value.a
|
||||||
|
: a // ignore: cast_nullable_to_non_nullable
|
||||||
|
as A,
|
||||||
|
b: freezed == b
|
||||||
|
? _value.b
|
||||||
|
: b // ignore: cast_nullable_to_non_nullable
|
||||||
|
as B,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$VM2Impl<A, B> implements _VM2<A, B> {
|
||||||
|
const _$VM2Impl({required this.a, required this.b});
|
||||||
|
|
||||||
|
@override
|
||||||
|
final A a;
|
||||||
|
@override
|
||||||
|
final B b;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'VM2<$A, $B>(a: $a, b: $b)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$VM2Impl<A, B> &&
|
||||||
|
const DeepCollectionEquality().equals(other.a, a) &&
|
||||||
|
const DeepCollectionEquality().equals(other.b, b));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(
|
||||||
|
runtimeType,
|
||||||
|
const DeepCollectionEquality().hash(a),
|
||||||
|
const DeepCollectionEquality().hash(b));
|
||||||
|
|
||||||
|
/// Create a copy of VM2
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$VM2ImplCopyWith<A, B, _$VM2Impl<A, B>> get copyWith =>
|
||||||
|
__$$VM2ImplCopyWithImpl<A, B, _$VM2Impl<A, B>>(this, _$identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _VM2<A, B> implements VM2<A, B> {
|
||||||
|
const factory _VM2({required final A a, required final B b}) =
|
||||||
|
_$VM2Impl<A, B>;
|
||||||
|
|
||||||
|
@override
|
||||||
|
A get a;
|
||||||
|
@override
|
||||||
|
B get b;
|
||||||
|
|
||||||
|
/// Create a copy of VM2
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$VM2ImplCopyWith<A, B, _$VM2Impl<A, B>> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$StartButtonSelectorState {
|
mixin _$StartButtonSelectorState {
|
||||||
bool get isInit => throw _privateConstructorUsedError;
|
bool get isInit => throw _privateConstructorUsedError;
|
||||||
@@ -3325,6 +3472,154 @@ abstract class _DashboardState implements DashboardState {
|
|||||||
throw _privateConstructorUsedError;
|
throw _privateConstructorUsedError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
mixin _$ProxyCardState {
|
||||||
|
String get proxyName => throw _privateConstructorUsedError;
|
||||||
|
String? get testUrl => throw _privateConstructorUsedError;
|
||||||
|
|
||||||
|
/// Create a copy of ProxyCardState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
$ProxyCardStateCopyWith<ProxyCardState> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class $ProxyCardStateCopyWith<$Res> {
|
||||||
|
factory $ProxyCardStateCopyWith(
|
||||||
|
ProxyCardState value, $Res Function(ProxyCardState) then) =
|
||||||
|
_$ProxyCardStateCopyWithImpl<$Res, ProxyCardState>;
|
||||||
|
@useResult
|
||||||
|
$Res call({String proxyName, String? testUrl});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class _$ProxyCardStateCopyWithImpl<$Res, $Val extends ProxyCardState>
|
||||||
|
implements $ProxyCardStateCopyWith<$Res> {
|
||||||
|
_$ProxyCardStateCopyWithImpl(this._value, this._then);
|
||||||
|
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Val _value;
|
||||||
|
// ignore: unused_field
|
||||||
|
final $Res Function($Val) _then;
|
||||||
|
|
||||||
|
/// Create a copy of ProxyCardState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? proxyName = null,
|
||||||
|
Object? testUrl = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_value.copyWith(
|
||||||
|
proxyName: null == proxyName
|
||||||
|
? _value.proxyName
|
||||||
|
: proxyName // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
testUrl: freezed == testUrl
|
||||||
|
? _value.testUrl
|
||||||
|
: testUrl // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
) as $Val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
abstract class _$$ProxyCardStateImplCopyWith<$Res>
|
||||||
|
implements $ProxyCardStateCopyWith<$Res> {
|
||||||
|
factory _$$ProxyCardStateImplCopyWith(_$ProxyCardStateImpl value,
|
||||||
|
$Res Function(_$ProxyCardStateImpl) then) =
|
||||||
|
__$$ProxyCardStateImplCopyWithImpl<$Res>;
|
||||||
|
@override
|
||||||
|
@useResult
|
||||||
|
$Res call({String proxyName, String? testUrl});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
class __$$ProxyCardStateImplCopyWithImpl<$Res>
|
||||||
|
extends _$ProxyCardStateCopyWithImpl<$Res, _$ProxyCardStateImpl>
|
||||||
|
implements _$$ProxyCardStateImplCopyWith<$Res> {
|
||||||
|
__$$ProxyCardStateImplCopyWithImpl(
|
||||||
|
_$ProxyCardStateImpl _value, $Res Function(_$ProxyCardStateImpl) _then)
|
||||||
|
: super(_value, _then);
|
||||||
|
|
||||||
|
/// Create a copy of ProxyCardState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
@override
|
||||||
|
$Res call({
|
||||||
|
Object? proxyName = null,
|
||||||
|
Object? testUrl = freezed,
|
||||||
|
}) {
|
||||||
|
return _then(_$ProxyCardStateImpl(
|
||||||
|
proxyName: null == proxyName
|
||||||
|
? _value.proxyName
|
||||||
|
: proxyName // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String,
|
||||||
|
testUrl: freezed == testUrl
|
||||||
|
? _value.testUrl
|
||||||
|
: testUrl // ignore: cast_nullable_to_non_nullable
|
||||||
|
as String?,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @nodoc
|
||||||
|
|
||||||
|
class _$ProxyCardStateImpl implements _ProxyCardState {
|
||||||
|
const _$ProxyCardStateImpl({required this.proxyName, this.testUrl});
|
||||||
|
|
||||||
|
@override
|
||||||
|
final String proxyName;
|
||||||
|
@override
|
||||||
|
final String? testUrl;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'ProxyCardState(proxyName: $proxyName, testUrl: $testUrl)';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) {
|
||||||
|
return identical(this, other) ||
|
||||||
|
(other.runtimeType == runtimeType &&
|
||||||
|
other is _$ProxyCardStateImpl &&
|
||||||
|
(identical(other.proxyName, proxyName) ||
|
||||||
|
other.proxyName == proxyName) &&
|
||||||
|
(identical(other.testUrl, testUrl) || other.testUrl == testUrl));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => Object.hash(runtimeType, proxyName, testUrl);
|
||||||
|
|
||||||
|
/// Create a copy of ProxyCardState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
@override
|
||||||
|
@pragma('vm:prefer-inline')
|
||||||
|
_$$ProxyCardStateImplCopyWith<_$ProxyCardStateImpl> get copyWith =>
|
||||||
|
__$$ProxyCardStateImplCopyWithImpl<_$ProxyCardStateImpl>(
|
||||||
|
this, _$identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class _ProxyCardState implements ProxyCardState {
|
||||||
|
const factory _ProxyCardState(
|
||||||
|
{required final String proxyName,
|
||||||
|
final String? testUrl}) = _$ProxyCardStateImpl;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get proxyName;
|
||||||
|
@override
|
||||||
|
String? get testUrl;
|
||||||
|
|
||||||
|
/// Create a copy of ProxyCardState
|
||||||
|
/// with the given fields replaced by the non-null parameter values.
|
||||||
|
@override
|
||||||
|
@JsonKey(includeFromJson: false, includeToJson: false)
|
||||||
|
_$$ProxyCardStateImplCopyWith<_$ProxyCardStateImpl> get copyWith =>
|
||||||
|
throw _privateConstructorUsedError;
|
||||||
|
}
|
||||||
|
|
||||||
/// @nodoc
|
/// @nodoc
|
||||||
mixin _$VpnState {
|
mixin _$VpnState {
|
||||||
TunStack get stack => throw _privateConstructorUsedError;
|
TunStack get stack => throw _privateConstructorUsedError;
|
||||||
|
|||||||
@@ -7,6 +7,15 @@ import 'package:freezed_annotation/freezed_annotation.dart';
|
|||||||
|
|
||||||
part 'generated/selector.freezed.dart';
|
part 'generated/selector.freezed.dart';
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class VM2<A, B> with _$VM2<A, B> {
|
||||||
|
const factory VM2({
|
||||||
|
required A a,
|
||||||
|
required B b,
|
||||||
|
}) = _VM2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class StartButtonSelectorState with _$StartButtonSelectorState {
|
class StartButtonSelectorState with _$StartButtonSelectorState {
|
||||||
const factory StartButtonSelectorState({
|
const factory StartButtonSelectorState({
|
||||||
@@ -134,18 +143,19 @@ extension PackageListSelectorStateExt on PackageListSelectorState {
|
|||||||
return packages
|
return packages
|
||||||
.where((item) => isFilterSystemApp ? item.isSystem == false : true)
|
.where((item) => isFilterSystemApp ? item.isSystem == false : true)
|
||||||
.sorted(
|
.sorted(
|
||||||
(a, b) {
|
(a, b) {
|
||||||
return switch (sort) {
|
return switch (sort) {
|
||||||
AccessSortType.none => 0,
|
AccessSortType.none => 0,
|
||||||
AccessSortType.name => other.sortByChar(
|
AccessSortType.name =>
|
||||||
other.getPinyin(a.label),
|
other.sortByChar(
|
||||||
other.getPinyin(b.label),
|
other.getPinyin(a.label),
|
||||||
),
|
other.getPinyin(b.label),
|
||||||
|
),
|
||||||
AccessSortType.time => b.lastUpdateTime.compareTo(a.lastUpdateTime),
|
AccessSortType.time => b.lastUpdateTime.compareTo(a.lastUpdateTime),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
).sorted(
|
).sorted(
|
||||||
(a, b) {
|
(a, b) {
|
||||||
final isSelectA = selectedList.contains(a.packageName);
|
final isSelectA = selectedList.contains(a.packageName);
|
||||||
final isSelectB = selectedList.contains(b.packageName);
|
final isSelectB = selectedList.contains(b.packageName);
|
||||||
if (isSelectA && isSelectB) return 0;
|
if (isSelectA && isSelectB) return 0;
|
||||||
@@ -200,6 +210,14 @@ class DashboardState with _$DashboardState {
|
|||||||
}) = _DashboardState;
|
}) = _DashboardState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@freezed
|
||||||
|
class ProxyCardState with _$ProxyCardState {
|
||||||
|
const factory ProxyCardState({
|
||||||
|
required String proxyName,
|
||||||
|
String? testUrl,
|
||||||
|
}) = _ProxyCardState;
|
||||||
|
}
|
||||||
|
|
||||||
@freezed
|
@freezed
|
||||||
class VpnState with _$VpnState {
|
class VpnState with _$VpnState {
|
||||||
const factory VpnState({
|
const factory VpnState({
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class HomePage extends StatelessWidget {
|
|||||||
final navigationItems = state.navigationItems;
|
final navigationItems = state.navigationItems;
|
||||||
final pageLabel = state.pageLabel;
|
final pageLabel = state.pageLabel;
|
||||||
final index = navigationItems.lastIndexWhere(
|
final index = navigationItems.lastIndexWhere(
|
||||||
(element) => element.label == pageLabel,
|
(element) => element.label == pageLabel,
|
||||||
);
|
);
|
||||||
final currentIndex = index == -1 ? 0 : index;
|
final currentIndex = index == -1 ? 0 : index;
|
||||||
final navigationBar = CommonNavigationBar(
|
final navigationBar = CommonNavigationBar(
|
||||||
@@ -32,9 +32,9 @@ class HomePage extends StatelessWidget {
|
|||||||
currentIndex: currentIndex,
|
currentIndex: currentIndex,
|
||||||
);
|
);
|
||||||
final bottomNavigationBar =
|
final bottomNavigationBar =
|
||||||
viewMode == ViewMode.mobile ? navigationBar : null;
|
viewMode == ViewMode.mobile ? navigationBar : null;
|
||||||
final sideNavigationBar =
|
final sideNavigationBar =
|
||||||
viewMode != ViewMode.mobile ? navigationBar : null;
|
viewMode != ViewMode.mobile ? navigationBar : null;
|
||||||
return CommonScaffold(
|
return CommonScaffold(
|
||||||
key: globalState.homeScaffoldKey,
|
key: globalState.homeScaffoldKey,
|
||||||
title: Intl.message(
|
title: Intl.message(
|
||||||
@@ -62,7 +62,7 @@ class _HomePageViewState extends ConsumerState<_HomePageView> {
|
|||||||
_updatePageController(List<NavigationItem> navigationItems) {
|
_updatePageController(List<NavigationItem> navigationItems) {
|
||||||
final pageLabel = globalState.appState.pageLabel;
|
final pageLabel = globalState.appState.pageLabel;
|
||||||
final index = navigationItems.lastIndexWhere(
|
final index = navigationItems.lastIndexWhere(
|
||||||
(element) => element.label == pageLabel,
|
(element) => element.label == pageLabel,
|
||||||
);
|
);
|
||||||
final pageIndex = index == -1 ? 0 : index;
|
final pageIndex = index == -1 ? 0 : index;
|
||||||
if (globalState.pageController != null) {
|
if (globalState.pageController != null) {
|
||||||
@@ -155,17 +155,20 @@ class CommonNavigationBar extends ConsumerWidget {
|
|||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
_updateSafeMessageOffset(context);
|
_updateSafeMessageOffset(context);
|
||||||
if (viewMode == ViewMode.mobile) {
|
if (viewMode == ViewMode.mobile) {
|
||||||
return NavigationBar(
|
return NavigationBarTheme(
|
||||||
destinations: navigationItems
|
data: _NavigationBarDefaultsM3(context),
|
||||||
.map(
|
child: NavigationBar(
|
||||||
(e) => NavigationDestination(
|
destinations: navigationItems
|
||||||
icon: e.icon,
|
.map(
|
||||||
label: Intl.message(e.label.name),
|
(e) => NavigationDestination(
|
||||||
),
|
icon: e.icon,
|
||||||
)
|
label: Intl.message(e.label.name),
|
||||||
.toList(),
|
),
|
||||||
onDestinationSelected: globalState.appController.toPage,
|
)
|
||||||
selectedIndex: currentIndex,
|
.toList(),
|
||||||
|
onDestinationSelected: globalState.appController.toPage,
|
||||||
|
selectedIndex: currentIndex,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
final showLabel = ref.watch(appSettingProvider).showLabel;
|
final showLabel = ref.watch(appSettingProvider).showLabel;
|
||||||
@@ -185,22 +188,22 @@ class CommonNavigationBar extends ConsumerWidget {
|
|||||||
color: context.colorScheme.onSurfaceVariant,
|
color: context.colorScheme.onSurfaceVariant,
|
||||||
),
|
),
|
||||||
selectedLabelTextStyle:
|
selectedLabelTextStyle:
|
||||||
context.textTheme.labelLarge!.copyWith(
|
context.textTheme.labelLarge!.copyWith(
|
||||||
color: context.colorScheme.onSurface,
|
color: context.colorScheme.onSurface,
|
||||||
),
|
),
|
||||||
unselectedLabelTextStyle:
|
unselectedLabelTextStyle:
|
||||||
context.textTheme.labelLarge!.copyWith(
|
context.textTheme.labelLarge!.copyWith(
|
||||||
color: context.colorScheme.onSurface,
|
color: context.colorScheme.onSurface,
|
||||||
),
|
),
|
||||||
destinations: navigationItems
|
destinations: navigationItems
|
||||||
.map(
|
.map(
|
||||||
(e) => NavigationRailDestination(
|
(e) => NavigationRailDestination(
|
||||||
icon: e.icon,
|
icon: e.icon,
|
||||||
label: Text(
|
label: Text(
|
||||||
Intl.message(e.label.name),
|
Intl.message(e.label.name),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.toList(),
|
.toList(),
|
||||||
onDestinationSelected: globalState.appController.toPage,
|
onDestinationSelected: globalState.appController.toPage,
|
||||||
extended: false,
|
extended: false,
|
||||||
@@ -219,9 +222,9 @@ class CommonNavigationBar extends ConsumerWidget {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
ref.read(appSettingProvider.notifier).updateState(
|
ref.read(appSettingProvider.notifier).updateState(
|
||||||
(state) => state.copyWith(
|
(state) => state.copyWith(
|
||||||
showLabel: !state.showLabel,
|
showLabel: !state.showLabel,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.menu),
|
icon: const Icon(Icons.menu),
|
||||||
),
|
),
|
||||||
@@ -233,3 +236,59 @@ class CommonNavigationBar extends ConsumerWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class _NavigationBarDefaultsM3 extends NavigationBarThemeData {
|
||||||
|
_NavigationBarDefaultsM3(this.context)
|
||||||
|
: super(
|
||||||
|
height: 80.0,
|
||||||
|
elevation: 3.0,
|
||||||
|
labelBehavior: NavigationDestinationLabelBehavior.alwaysShow,
|
||||||
|
);
|
||||||
|
|
||||||
|
final BuildContext context;
|
||||||
|
late final ColorScheme _colors = Theme.of(context).colorScheme;
|
||||||
|
late final TextTheme _textTheme = Theme.of(context).textTheme;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Color? get backgroundColor => _colors.surfaceContainer;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Color? get shadowColor => Colors.transparent;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Color? get surfaceTintColor => Colors.transparent;
|
||||||
|
|
||||||
|
@override
|
||||||
|
WidgetStateProperty<IconThemeData?>? get iconTheme {
|
||||||
|
return WidgetStateProperty.resolveWith((Set<WidgetState> states) {
|
||||||
|
return IconThemeData(
|
||||||
|
size: 24.0,
|
||||||
|
color: states.contains(WidgetState.disabled)
|
||||||
|
? _colors.onSurfaceVariant.withOpacity(0.38)
|
||||||
|
: states.contains(WidgetState.selected)
|
||||||
|
? _colors.onSecondaryContainer
|
||||||
|
: _colors.onSurfaceVariant,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Color? get indicatorColor => _colors.secondaryContainer;
|
||||||
|
|
||||||
|
@override
|
||||||
|
ShapeBorder? get indicatorShape => const StadiumBorder();
|
||||||
|
|
||||||
|
@override
|
||||||
|
WidgetStateProperty<TextStyle?>? get labelTextStyle {
|
||||||
|
return WidgetStateProperty.resolveWith((Set<WidgetState> states) {
|
||||||
|
final TextStyle style = _textTheme.labelMedium!;
|
||||||
|
return style.apply(
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
color: states.contains(WidgetState.disabled)
|
||||||
|
? _colors.onSurfaceVariant.withOpacity(0.38)
|
||||||
|
: states.contains(WidgetState.selected)
|
||||||
|
? _colors.onSurface
|
||||||
|
: _colors.onSurfaceVariant);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
|
|||||||
|
|
||||||
part 'generated/app.g.dart';
|
part 'generated/app.g.dart';
|
||||||
|
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
class Logs extends _$Logs with AutoDisposeNotifierMixin {
|
class Logs extends _$Logs with AutoDisposeNotifierMixin {
|
||||||
@override
|
@override
|
||||||
@@ -336,4 +335,3 @@ class DelayDataSource extends _$DelayDataSource with AutoDisposeNotifierMixin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ final currentGroupsStateProvider = AutoDisposeProvider<GroupsState>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef CurrentGroupsStateRef = AutoDisposeProviderRef<GroupsState>;
|
typedef CurrentGroupsStateRef = AutoDisposeProviderRef<GroupsState>;
|
||||||
String _$navigationsStateHash() => r'3c57f9161625f0376679cfe8b1cce0beadd709a7';
|
String _$navigationsStateHash() => r'802ae70cc8b7d7f5620b340911da89d74960bfbd';
|
||||||
|
|
||||||
/// See also [navigationsState].
|
/// See also [navigationsState].
|
||||||
@ProviderFor(navigationsState)
|
@ProviderFor(navigationsState)
|
||||||
@@ -95,7 +95,7 @@ final clashConfigStateProvider = AutoDisposeProvider<ClashConfigState>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef ClashConfigStateRef = AutoDisposeProviderRef<ClashConfigState>;
|
typedef ClashConfigStateRef = AutoDisposeProviderRef<ClashConfigState>;
|
||||||
String _$proxyStateHash() => r'418464d2ab29bb701ff001ca80396526fd2c8d3a';
|
String _$proxyStateHash() => r'22478fb593aaca11dfe2cf64472013190475a5bc';
|
||||||
|
|
||||||
/// See also [proxyState].
|
/// See also [proxyState].
|
||||||
@ProviderFor(proxyState)
|
@ProviderFor(proxyState)
|
||||||
@@ -111,7 +111,7 @@ final proxyStateProvider = AutoDisposeProvider<ProxyState>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef ProxyStateRef = AutoDisposeProviderRef<ProxyState>;
|
typedef ProxyStateRef = AutoDisposeProviderRef<ProxyState>;
|
||||||
String _$trayStateHash() => r'06ff742a92893667a30bc6a25d13594d83dd74fc';
|
String _$trayStateHash() => r'39ff84c50ad9c9cc666fa2538fe13ec0d7236b2e';
|
||||||
|
|
||||||
/// See also [trayState].
|
/// See also [trayState].
|
||||||
@ProviderFor(trayState)
|
@ProviderFor(trayState)
|
||||||
@@ -292,7 +292,7 @@ final groupNamesStateProvider = AutoDisposeProvider<GroupNamesState>.internal(
|
|||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef GroupNamesStateRef = AutoDisposeProviderRef<GroupNamesState>;
|
typedef GroupNamesStateRef = AutoDisposeProviderRef<GroupNamesState>;
|
||||||
String _$proxyGroupSelectorStateHash() =>
|
String _$proxyGroupSelectorStateHash() =>
|
||||||
r'b76f5ad536469e11a4ffa6a262dd4df61d280823';
|
r'5bc86d13286c6c859f0b874235a281122cc612ba';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
@@ -766,7 +766,7 @@ class _GetRealTestUrlProviderElement extends AutoDisposeProviderElement<String>
|
|||||||
String? get testUrl => (origin as GetRealTestUrlProvider).testUrl;
|
String? get testUrl => (origin as GetRealTestUrlProvider).testUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$getDelayHash() => r'dbc584d16f24abbc548d4c560ef50d172db23818';
|
String _$getDelayHash() => r'b5920ac7de0aaadb8ff63fac993bd90ff87cd25a';
|
||||||
|
|
||||||
/// See also [getDelay].
|
/// See also [getDelay].
|
||||||
@ProviderFor(getDelay)
|
@ProviderFor(getDelay)
|
||||||
@@ -1108,29 +1108,29 @@ final getProxiesColumnsProvider = AutoDisposeProvider<int>.internal(
|
|||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
typedef GetProxiesColumnsRef = AutoDisposeProviderRef<int>;
|
typedef GetProxiesColumnsRef = AutoDisposeProviderRef<int>;
|
||||||
String _$getRealProxyNameHash() => r'47be6d115aa170f9bff610ec2cf7669e168bf472';
|
String _$getProxyCardStateHash() => r'0f131148cb5ed60c9c4c4f31fbe32f114ac346bb';
|
||||||
|
|
||||||
/// See also [getRealProxyName].
|
/// See also [getProxyCardState].
|
||||||
@ProviderFor(getRealProxyName)
|
@ProviderFor(getProxyCardState)
|
||||||
const getRealProxyNameProvider = GetRealProxyNameFamily();
|
const getProxyCardStateProvider = GetProxyCardStateFamily();
|
||||||
|
|
||||||
/// See also [getRealProxyName].
|
/// See also [getProxyCardState].
|
||||||
class GetRealProxyNameFamily extends Family<String> {
|
class GetProxyCardStateFamily extends Family<ProxyCardState> {
|
||||||
/// See also [getRealProxyName].
|
/// See also [getProxyCardState].
|
||||||
const GetRealProxyNameFamily();
|
const GetProxyCardStateFamily();
|
||||||
|
|
||||||
/// See also [getRealProxyName].
|
/// See also [getProxyCardState].
|
||||||
GetRealProxyNameProvider call(
|
GetProxyCardStateProvider call(
|
||||||
String proxyName,
|
String proxyName,
|
||||||
) {
|
) {
|
||||||
return GetRealProxyNameProvider(
|
return GetProxyCardStateProvider(
|
||||||
proxyName,
|
proxyName,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
GetRealProxyNameProvider getProviderOverride(
|
GetProxyCardStateProvider getProviderOverride(
|
||||||
covariant GetRealProxyNameProvider provider,
|
covariant GetProxyCardStateProvider provider,
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
provider.proxyName,
|
provider.proxyName,
|
||||||
@@ -1149,32 +1149,32 @@ class GetRealProxyNameFamily extends Family<String> {
|
|||||||
_allTransitiveDependencies;
|
_allTransitiveDependencies;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String? get name => r'getRealProxyNameProvider';
|
String? get name => r'getProxyCardStateProvider';
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See also [getRealProxyName].
|
/// See also [getProxyCardState].
|
||||||
class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
class GetProxyCardStateProvider extends AutoDisposeProvider<ProxyCardState> {
|
||||||
/// See also [getRealProxyName].
|
/// See also [getProxyCardState].
|
||||||
GetRealProxyNameProvider(
|
GetProxyCardStateProvider(
|
||||||
String proxyName,
|
String proxyName,
|
||||||
) : this._internal(
|
) : this._internal(
|
||||||
(ref) => getRealProxyName(
|
(ref) => getProxyCardState(
|
||||||
ref as GetRealProxyNameRef,
|
ref as GetProxyCardStateRef,
|
||||||
proxyName,
|
proxyName,
|
||||||
),
|
),
|
||||||
from: getRealProxyNameProvider,
|
from: getProxyCardStateProvider,
|
||||||
name: r'getRealProxyNameProvider',
|
name: r'getProxyCardStateProvider',
|
||||||
debugGetCreateSourceHash:
|
debugGetCreateSourceHash:
|
||||||
const bool.fromEnvironment('dart.vm.product')
|
const bool.fromEnvironment('dart.vm.product')
|
||||||
? null
|
? null
|
||||||
: _$getRealProxyNameHash,
|
: _$getProxyCardStateHash,
|
||||||
dependencies: GetRealProxyNameFamily._dependencies,
|
dependencies: GetProxyCardStateFamily._dependencies,
|
||||||
allTransitiveDependencies:
|
allTransitiveDependencies:
|
||||||
GetRealProxyNameFamily._allTransitiveDependencies,
|
GetProxyCardStateFamily._allTransitiveDependencies,
|
||||||
proxyName: proxyName,
|
proxyName: proxyName,
|
||||||
);
|
);
|
||||||
|
|
||||||
GetRealProxyNameProvider._internal(
|
GetProxyCardStateProvider._internal(
|
||||||
super._createNotifier, {
|
super._createNotifier, {
|
||||||
required super.name,
|
required super.name,
|
||||||
required super.dependencies,
|
required super.dependencies,
|
||||||
@@ -1188,12 +1188,12 @@ class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Override overrideWith(
|
Override overrideWith(
|
||||||
String Function(GetRealProxyNameRef provider) create,
|
ProxyCardState Function(GetProxyCardStateRef provider) create,
|
||||||
) {
|
) {
|
||||||
return ProviderOverride(
|
return ProviderOverride(
|
||||||
origin: this,
|
origin: this,
|
||||||
override: GetRealProxyNameProvider._internal(
|
override: GetProxyCardStateProvider._internal(
|
||||||
(ref) => create(ref as GetRealProxyNameRef),
|
(ref) => create(ref as GetProxyCardStateRef),
|
||||||
from: from,
|
from: from,
|
||||||
name: null,
|
name: null,
|
||||||
dependencies: null,
|
dependencies: null,
|
||||||
@@ -1205,13 +1205,13 @@ class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
AutoDisposeProviderElement<String> createElement() {
|
AutoDisposeProviderElement<ProxyCardState> createElement() {
|
||||||
return _GetRealProxyNameProviderElement(this);
|
return _GetProxyCardStateProviderElement(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is GetRealProxyNameProvider && other.proxyName == proxyName;
|
return other is GetProxyCardStateProvider && other.proxyName == proxyName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -1225,17 +1225,18 @@ class GetRealProxyNameProvider extends AutoDisposeProvider<String> {
|
|||||||
|
|
||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
mixin GetRealProxyNameRef on AutoDisposeProviderRef<String> {
|
mixin GetProxyCardStateRef on AutoDisposeProviderRef<ProxyCardState> {
|
||||||
/// The parameter `proxyName` of this provider.
|
/// The parameter `proxyName` of this provider.
|
||||||
String get proxyName;
|
String get proxyName;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GetRealProxyNameProviderElement
|
class _GetProxyCardStateProviderElement
|
||||||
extends AutoDisposeProviderElement<String> with GetRealProxyNameRef {
|
extends AutoDisposeProviderElement<ProxyCardState>
|
||||||
_GetRealProxyNameProviderElement(super.provider);
|
with GetProxyCardStateRef {
|
||||||
|
_GetProxyCardStateProviderElement(super.provider);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get proxyName => (origin as GetRealProxyNameProvider).proxyName;
|
String get proxyName => (origin as GetProxyCardStateProvider).proxyName;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$getProxyNameHash() => r'204a477ea18c8e1eeef55b3efd3d47e45b0d2350';
|
String _$getProxyNameHash() => r'204a477ea18c8e1eeef55b3efd3d47e45b0d2350';
|
||||||
@@ -1500,7 +1501,7 @@ class _GetSelectedProxyNameProviderElement
|
|||||||
String get groupName => (origin as GetSelectedProxyNameProvider).groupName;
|
String get groupName => (origin as GetSelectedProxyNameProvider).groupName;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$getProxyDescHash() => r'7c06402957387c35d9dc515ca109f8f7dbb481b0';
|
String _$getProxyDescHash() => r'c173fe2393d9c4f5d5d17480e69f9126bb76a17d';
|
||||||
|
|
||||||
/// See also [getProxyDesc].
|
/// See also [getProxyDesc].
|
||||||
@ProviderFor(getProxyDesc)
|
@ProviderFor(getProxyDesc)
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ GroupsState currentGroupsState(Ref ref) {
|
|||||||
@riverpod
|
@riverpod
|
||||||
NavigationItemsState navigationsState(Ref ref) {
|
NavigationItemsState navigationsState(Ref ref) {
|
||||||
final openLogs = ref.watch(appSettingProvider).openLogs;
|
final openLogs = ref.watch(appSettingProvider).openLogs;
|
||||||
final hasProxies = ref.watch(currentGroupsStateProvider.select((state)=>state.value.isNotEmpty));
|
final hasProxies = ref.watch(
|
||||||
|
currentGroupsStateProvider.select((state) => state.value.isNotEmpty));
|
||||||
return NavigationItemsState(
|
return NavigationItemsState(
|
||||||
value: navigation.getItems(
|
value: navigation.getItems(
|
||||||
openLogs: openLogs,
|
openLogs: openLogs,
|
||||||
@@ -79,22 +80,27 @@ ClashConfigState clashConfigState(Ref ref) {
|
|||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
ProxyState proxyState(Ref ref) {
|
ProxyState proxyState(Ref ref) {
|
||||||
final isStart = ref.watch(runTimeProvider.select((state)=>state != null));
|
final isStart = ref.watch(runTimeProvider.select((state) => state != null));
|
||||||
final networkProps = ref.watch(networkSettingProvider);
|
final vm2 = ref.watch(networkSettingProvider.select(
|
||||||
|
(state) => VM2(
|
||||||
|
a: state.systemProxy,
|
||||||
|
b: state.bypassDomain,
|
||||||
|
),
|
||||||
|
));
|
||||||
final mixedPort = ref.watch(
|
final mixedPort = ref.watch(
|
||||||
patchClashConfigProvider.select((state) => state.mixedPort),
|
patchClashConfigProvider.select((state) => state.mixedPort),
|
||||||
);
|
);
|
||||||
return ProxyState(
|
return ProxyState(
|
||||||
isStart: isStart,
|
isStart: isStart,
|
||||||
systemProxy: networkProps.systemProxy,
|
systemProxy: vm2.a,
|
||||||
bassDomain: networkProps.bypassDomain,
|
bassDomain: vm2.b,
|
||||||
port: mixedPort,
|
port: mixedPort,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
TrayState trayState(Ref ref) {
|
TrayState trayState(Ref ref) {
|
||||||
final isStart = ref.watch(runTimeProvider.select((state)=>state != null));
|
final isStart = ref.watch(runTimeProvider.select((state) => state != null));
|
||||||
final networkProps = ref.watch(networkSettingProvider);
|
final networkProps = ref.watch(networkSettingProvider);
|
||||||
final clashConfig = ref.watch(
|
final clashConfig = ref.watch(
|
||||||
patchClashConfigProvider,
|
patchClashConfigProvider,
|
||||||
@@ -114,7 +120,7 @@ TrayState trayState(Ref ref) {
|
|||||||
return TrayState(
|
return TrayState(
|
||||||
mode: clashConfig.mode,
|
mode: clashConfig.mode,
|
||||||
port: clashConfig.mixedPort,
|
port: clashConfig.mixedPort,
|
||||||
autoLaunch: appSetting.autoRun,
|
autoLaunch: appSetting.autoLaunch,
|
||||||
systemProxy: networkProps.systemProxy,
|
systemProxy: networkProps.systemProxy,
|
||||||
tunEnable: clashConfig.tun.enable,
|
tunEnable: clashConfig.tun.enable,
|
||||||
isStart: isStart,
|
isStart: isStart,
|
||||||
@@ -255,9 +261,6 @@ GroupNamesState groupNamesState(Ref ref) {
|
|||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
ProxyGroupSelectorState proxyGroupSelectorState(Ref ref, String groupName) {
|
ProxyGroupSelectorState proxyGroupSelectorState(Ref ref, String groupName) {
|
||||||
final testUrl = ref.watch(appSettingProvider.select(
|
|
||||||
(state) => state.testUrl,
|
|
||||||
));
|
|
||||||
final proxiesStyle = ref.watch(
|
final proxiesStyle = ref.watch(
|
||||||
proxiesStyleSettingProvider,
|
proxiesStyleSettingProvider,
|
||||||
);
|
);
|
||||||
@@ -269,7 +272,7 @@ ProxyGroupSelectorState proxyGroupSelectorState(Ref ref, String groupName) {
|
|||||||
final sortNum = ref.watch(sortNumProvider);
|
final sortNum = ref.watch(sortNumProvider);
|
||||||
final columns = ref.watch(getProxiesColumnsProvider);
|
final columns = ref.watch(getProxiesColumnsProvider);
|
||||||
return ProxyGroupSelectorState(
|
return ProxyGroupSelectorState(
|
||||||
testUrl: testUrl,
|
testUrl: group?.testUrl,
|
||||||
proxiesSortType: proxiesStyle.sortType,
|
proxiesSortType: proxiesStyle.sortType,
|
||||||
proxyCardType: proxiesStyle.cardType,
|
proxyCardType: proxiesStyle.cardType,
|
||||||
sortNum: sortNum,
|
sortNum: sortNum,
|
||||||
@@ -338,11 +341,21 @@ int? getDelay(
|
|||||||
String? testUrl,
|
String? testUrl,
|
||||||
}) {
|
}) {
|
||||||
final currentTestUrl = ref.watch(getRealTestUrlProvider(testUrl));
|
final currentTestUrl = ref.watch(getRealTestUrlProvider(testUrl));
|
||||||
return ref.watch(
|
final proxyCardState = ref.watch(
|
||||||
delayDataSourceProvider.select(
|
getProxyCardStateProvider(
|
||||||
(state) => state[currentTestUrl]?[proxyName],
|
proxyName,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
final delay = ref.watch(
|
||||||
|
delayDataSourceProvider.select(
|
||||||
|
(state) {
|
||||||
|
final delayMap =
|
||||||
|
state[proxyCardState.testUrl.getSafeValue(currentTestUrl)];
|
||||||
|
return delayMap?[proxyCardState.proxyName];
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return delay;
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
@@ -392,30 +405,34 @@ int getProxiesColumns(Ref ref) {
|
|||||||
return other.getProxiesColumns(viewWidth, proxiesLayout);
|
return other.getProxiesColumns(viewWidth, proxiesLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _getRealProxyName(
|
ProxyCardState _getProxyCardState(
|
||||||
List<Group> groups,
|
List<Group> groups,
|
||||||
SelectedMap selectedMap,
|
SelectedMap selectedMap,
|
||||||
String proxyName,
|
ProxyCardState proxyDelayState,
|
||||||
) {
|
) {
|
||||||
if (proxyName.isEmpty) return proxyName;
|
if (proxyDelayState.proxyName.isEmpty) return proxyDelayState;
|
||||||
final index = groups.indexWhere((element) => element.name == proxyName);
|
final index =
|
||||||
if (index == -1) return proxyName;
|
groups.indexWhere((element) => element.name == proxyDelayState.proxyName);
|
||||||
|
if (index == -1) return proxyDelayState;
|
||||||
final group = groups[index];
|
final group = groups[index];
|
||||||
final currentSelectedName =
|
final currentSelectedName = group
|
||||||
group.getCurrentSelectedName(selectedMap[proxyName] ?? '');
|
.getCurrentSelectedName(selectedMap[proxyDelayState.proxyName] ?? '');
|
||||||
if (currentSelectedName.isEmpty) return proxyName;
|
return _getProxyCardState(
|
||||||
return _getRealProxyName(
|
|
||||||
groups,
|
groups,
|
||||||
selectedMap,
|
selectedMap,
|
||||||
proxyName,
|
proxyDelayState.copyWith(
|
||||||
|
proxyName: currentSelectedName,
|
||||||
|
testUrl: group.testUrl,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
String getRealProxyName(Ref ref, String proxyName) {
|
ProxyCardState getProxyCardState(Ref ref, String proxyName) {
|
||||||
final groups = ref.watch(groupsProvider);
|
final groups = ref.watch(groupsProvider);
|
||||||
final selectedMap = ref.watch(selectedMapProvider);
|
final selectedMap = ref.watch(selectedMapProvider);
|
||||||
return _getRealProxyName(groups, selectedMap, proxyName);
|
return _getProxyCardState(
|
||||||
|
groups, selectedMap, ProxyCardState(proxyName: proxyName));
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
@@ -445,6 +462,7 @@ String getProxyDesc(Ref ref, Proxy proxy) {
|
|||||||
final groups = ref.watch(groupsProvider);
|
final groups = ref.watch(groupsProvider);
|
||||||
final index = groups.indexWhere((element) => element.name == proxy.name);
|
final index = groups.indexWhere((element) => element.name == proxy.name);
|
||||||
if (index == -1) return proxy.type;
|
if (index == -1) return proxy.type;
|
||||||
return "${proxy.type}(${groups[index].now ?? '*'})";
|
final state = ref.watch(getProxyCardStateProvider(proxy.name));
|
||||||
|
return "${proxy.type}(${state.proxyName.isNotEmpty ? state.proxyName : '*'})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:fl_clash/common/common.dart';
|
import 'package:fl_clash/common/common.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
@@ -18,6 +19,17 @@ class DonutChartData {
|
|||||||
String toString() {
|
String toString() {
|
||||||
return 'DonutChartData{_value: $_value}';
|
return 'DonutChartData{_value: $_value}';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool operator ==(Object other) =>
|
||||||
|
identical(this, other) ||
|
||||||
|
other is DonutChartData &&
|
||||||
|
runtimeType == other.runtimeType &&
|
||||||
|
_value == other._value &&
|
||||||
|
color == other.color;
|
||||||
|
|
||||||
|
@override
|
||||||
|
int get hashCode => _value.hashCode ^ color.hashCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
class DonutChart extends StatefulWidget {
|
class DonutChart extends StatefulWidget {
|
||||||
|
|||||||
@@ -320,7 +320,6 @@ class ListPage<T> extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
print("daad===>$items");
|
|
||||||
return FloatLayout(
|
return FloatLayout(
|
||||||
floatingWidget: FloatWrapper(
|
floatingWidget: FloatWrapper(
|
||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
|
|||||||
@@ -186,48 +186,46 @@ class CommonScaffoldState extends State<CommonScaffold> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final body = SafeArea(
|
final body = Column(
|
||||||
child: Column(
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
children: [
|
||||||
children: [
|
ValueListenableBuilder(
|
||||||
ValueListenableBuilder(
|
valueListenable: _keywordsNotifier,
|
||||||
valueListenable: _keywordsNotifier,
|
builder: (_, keywords, __) {
|
||||||
builder: (_, keywords, __) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
if (_onKeywordsUpdate != null) {
|
||||||
if (_onKeywordsUpdate != null) {
|
_onKeywordsUpdate!(keywords);
|
||||||
_onKeywordsUpdate!(keywords);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (keywords.isEmpty) {
|
|
||||||
return SizedBox();
|
|
||||||
}
|
}
|
||||||
return Padding(
|
});
|
||||||
padding: const EdgeInsets.symmetric(
|
if (keywords.isEmpty) {
|
||||||
horizontal: 16,
|
return SizedBox();
|
||||||
vertical: 16,
|
}
|
||||||
),
|
return Padding(
|
||||||
child: Wrap(
|
padding: const EdgeInsets.symmetric(
|
||||||
runSpacing: 8,
|
horizontal: 16,
|
||||||
spacing: 8,
|
vertical: 16,
|
||||||
children: [
|
),
|
||||||
for (final keyword in keywords)
|
child: Wrap(
|
||||||
CommonChip(
|
runSpacing: 8,
|
||||||
label: keyword,
|
spacing: 8,
|
||||||
type: ChipType.delete,
|
children: [
|
||||||
onPressed: () {
|
for (final keyword in keywords)
|
||||||
_deleteKeyword(keyword);
|
CommonChip(
|
||||||
},
|
label: keyword,
|
||||||
),
|
type: ChipType.delete,
|
||||||
],
|
onPressed: () {
|
||||||
),
|
_deleteKeyword(keyword);
|
||||||
);
|
},
|
||||||
},
|
),
|
||||||
),
|
],
|
||||||
Expanded(
|
),
|
||||||
child: widget.body,
|
);
|
||||||
),
|
},
|
||||||
],
|
),
|
||||||
),
|
Expanded(
|
||||||
|
child: widget.body,
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
final scaffold = Scaffold(
|
final scaffold = Scaffold(
|
||||||
appBar: PreferredSize(
|
appBar: PreferredSize(
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class WaveView extends StatefulWidget {
|
class WaveView extends StatefulWidget {
|
||||||
@@ -40,23 +41,25 @@ class _WaveViewState extends State<WaveView>
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return LayoutBuilder(builder: (_, container) {
|
return LayoutBuilder(builder: (_, constraints) {
|
||||||
return AnimatedBuilder(
|
return RepaintBoundary(
|
||||||
animation: _controller,
|
child: AnimatedBuilder(
|
||||||
builder: (context, child) {
|
animation: _controller,
|
||||||
return CustomPaint(
|
builder: (context, child) {
|
||||||
painter: WavePainter(
|
return CustomPaint(
|
||||||
animationValue: _controller.value,
|
painter: WavePainter(
|
||||||
waveAmplitude: widget.waveAmplitude,
|
animationValue: _controller.value,
|
||||||
waveFrequency: widget.waveFrequency,
|
waveAmplitude: widget.waveAmplitude,
|
||||||
waveColor: widget.waveColor,
|
waveFrequency: widget.waveFrequency,
|
||||||
),
|
waveColor: widget.waveColor,
|
||||||
size: Size(
|
),
|
||||||
container.maxHeight,
|
size: Size(
|
||||||
container.maxHeight,
|
constraints.maxWidth,
|
||||||
),
|
constraints.maxHeight,
|
||||||
);
|
),
|
||||||
},
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -68,41 +71,60 @@ class WavePainter extends CustomPainter {
|
|||||||
final double waveFrequency;
|
final double waveFrequency;
|
||||||
final Color waveColor;
|
final Color waveColor;
|
||||||
|
|
||||||
|
late Paint _paint;
|
||||||
|
final Path _path = Path();
|
||||||
|
Color _lastColor;
|
||||||
|
|
||||||
WavePainter({
|
WavePainter({
|
||||||
required this.animationValue,
|
required this.animationValue,
|
||||||
required this.waveAmplitude,
|
required this.waveAmplitude,
|
||||||
required this.waveFrequency,
|
required this.waveFrequency,
|
||||||
required this.waveColor,
|
required this.waveColor,
|
||||||
});
|
}) : _lastColor = waveColor {
|
||||||
|
_paint = Paint()
|
||||||
|
..color = waveColor
|
||||||
|
..style = PaintingStyle.fill;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void paint(Canvas canvas, Size size) {
|
void paint(Canvas canvas, Size size) {
|
||||||
final paint = Paint()
|
if (waveColor != _lastColor) {
|
||||||
..color = waveColor
|
_paint = Paint()
|
||||||
..style = PaintingStyle.fill;
|
..color = waveColor
|
||||||
|
..style = PaintingStyle.fill;
|
||||||
final path = Path();
|
_lastColor = waveColor;
|
||||||
|
|
||||||
final baseHeight = size.height / 3;
|
|
||||||
|
|
||||||
path.moveTo(0, baseHeight);
|
|
||||||
|
|
||||||
for (double x = 0; x <= size.width; x++) {
|
|
||||||
final y = waveAmplitude *
|
|
||||||
sin((x / size.width * 2 * pi * waveFrequency) +
|
|
||||||
(animationValue * 2 * pi));
|
|
||||||
path.lineTo(x, baseHeight + y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
path.lineTo(size.width, size.height);
|
_path.reset();
|
||||||
path.lineTo(0, size.height);
|
|
||||||
path.close();
|
|
||||||
|
|
||||||
canvas.drawPath(path, paint);
|
final baseHeight = size.height / 3;
|
||||||
|
final phase = animationValue * 2 * pi;
|
||||||
|
final widthFactor = 2 * pi * waveFrequency / size.width;
|
||||||
|
|
||||||
|
_path.moveTo(0, baseHeight);
|
||||||
|
|
||||||
|
for (double x = 0; x <= size.width; x += size.width / 20) {
|
||||||
|
final y = waveAmplitude * sin(x * widthFactor + phase);
|
||||||
|
_path.lineTo(x, baseHeight + y);
|
||||||
|
}
|
||||||
|
|
||||||
|
_path.lineTo(
|
||||||
|
size.width,
|
||||||
|
baseHeight + waveAmplitude * sin(size.width * widthFactor + phase),
|
||||||
|
);
|
||||||
|
|
||||||
|
_path.lineTo(size.width, size.height);
|
||||||
|
_path.lineTo(0, size.height);
|
||||||
|
_path.close();
|
||||||
|
|
||||||
|
canvas.drawPath(_path, _paint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool shouldRepaint(covariant CustomPainter oldDelegate) {
|
bool shouldRepaint(covariant WavePainter oldDelegate) {
|
||||||
return true;
|
return oldDelegate.animationValue != animationValue ||
|
||||||
|
oldDelegate.waveAmplitude != waveAmplitude ||
|
||||||
|
oldDelegate.waveFrequency != waveFrequency ||
|
||||||
|
oldDelegate.waveColor != waveColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
ignoresPersistentStateOnLaunch = "NO"
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
debugDocumentVersioning = "YES"
|
debugDocumentVersioning = "YES"
|
||||||
debugServiceExtension = "internal"
|
debugServiceExtension = "internal"
|
||||||
|
enableGPUValidationMode = "1"
|
||||||
allowLocationSimulation = "YES">
|
allowLocationSimulation = "YES">
|
||||||
<BuildableProductRunnable
|
<BuildableProductRunnable
|
||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
|
|||||||
106
pubspec.lock
106
pubspec.lock
@@ -5,23 +5,23 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: _fe_analyzer_shared
|
name: _fe_analyzer_shared
|
||||||
sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834
|
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "72.0.0"
|
version: "76.0.0"
|
||||||
_macros:
|
_macros:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: dart
|
description: dart
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.3.2"
|
version: "0.3.3"
|
||||||
analyzer:
|
analyzer:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: analyzer
|
name: analyzer
|
||||||
sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139
|
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.7.0"
|
version: "6.11.0"
|
||||||
analyzer_plugin:
|
analyzer_plugin:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -66,18 +66,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: async
|
name: async
|
||||||
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
|
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.11.0"
|
version: "2.12.0"
|
||||||
boolean_selector:
|
boolean_selector:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: boolean_selector
|
name: boolean_selector
|
||||||
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
|
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.2"
|
||||||
build:
|
build:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -170,10 +170,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: characters
|
name: characters
|
||||||
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
|
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.0"
|
version: "1.4.0"
|
||||||
checked_yaml:
|
checked_yaml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -202,10 +202,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: clock
|
name: clock
|
||||||
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
|
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.1"
|
version: "1.1.2"
|
||||||
code_builder:
|
code_builder:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -218,10 +218,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: collection
|
name: collection
|
||||||
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
|
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.18.0"
|
version: "1.19.1"
|
||||||
connectivity_plus:
|
connectivity_plus:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -290,10 +290,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: custom_lint_visitor
|
name: custom_lint_visitor
|
||||||
sha256: "8aeb3b6ae2bb765e7716b93d1d10e8356d04e0ff6d7592de6ee04e0dd7d6587d"
|
sha256: bfe9b7a09c4775a587b58d10ebb871d4fe618237639b1e84d5ec62d7dfef25f9
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.0.0+6.7.0"
|
version: "1.0.0+6.11.0"
|
||||||
dart_style:
|
dart_style:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -338,10 +338,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: dio
|
name: dio
|
||||||
sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260"
|
sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.7.0"
|
version: "5.8.0+1"
|
||||||
dio_web_adapter:
|
dio_web_adapter:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -378,10 +378,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: fake_async
|
name: fake_async
|
||||||
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
|
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.3.1"
|
version: "1.3.2"
|
||||||
ffi:
|
ffi:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -538,6 +538,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
|
google_fonts:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: google_fonts
|
||||||
|
sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "6.2.1"
|
||||||
graphs:
|
graphs:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -758,18 +766,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker
|
name: leak_tracker
|
||||||
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
|
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.5"
|
version: "10.0.8"
|
||||||
leak_tracker_flutter_testing:
|
leak_tracker_flutter_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: leak_tracker_flutter_testing
|
name: leak_tracker_flutter_testing
|
||||||
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
|
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.5"
|
version: "3.0.9"
|
||||||
leak_tracker_testing:
|
leak_tracker_testing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -806,18 +814,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: macros
|
name: macros
|
||||||
sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536"
|
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.2-main.4"
|
version: "0.1.3-main.0"
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: matcher
|
name: matcher
|
||||||
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
|
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.12.16+1"
|
version: "0.12.17"
|
||||||
material_color_utilities:
|
material_color_utilities:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -838,10 +846,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: meta
|
name: meta
|
||||||
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
|
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.15.0"
|
version: "1.16.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -902,10 +910,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: path
|
name: path
|
||||||
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
|
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.0"
|
version: "1.9.1"
|
||||||
path_provider:
|
path_provider:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -1213,7 +1221,7 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.99"
|
version: "0.0.0"
|
||||||
source_gen:
|
source_gen:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1234,10 +1242,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: source_span
|
name: source_span
|
||||||
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
|
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.10.0"
|
version: "1.10.1"
|
||||||
sprintf:
|
sprintf:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1290,10 +1298,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stack_trace
|
name: stack_trace
|
||||||
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
|
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.11.1"
|
version: "1.12.1"
|
||||||
state_notifier:
|
state_notifier:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1306,10 +1314,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: stream_channel
|
name: stream_channel
|
||||||
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
|
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.4"
|
||||||
stream_transform:
|
stream_transform:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1322,10 +1330,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
|
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.4.1"
|
||||||
synchronized:
|
synchronized:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1338,18 +1346,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: term_glyph
|
name: term_glyph
|
||||||
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
|
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.1"
|
version: "1.2.2"
|
||||||
test_api:
|
test_api:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: test_api
|
name: test_api
|
||||||
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
|
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.2"
|
version: "0.7.4"
|
||||||
timing:
|
timing:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1466,10 +1474,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: vm_service
|
name: vm_service
|
||||||
sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d"
|
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "14.2.5"
|
version: "14.3.1"
|
||||||
watcher:
|
watcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -1582,5 +1590,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.2.1"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.5.0 <4.0.0"
|
dart: ">=3.7.0-0 <4.0.0"
|
||||||
flutter: ">=3.24.0"
|
flutter: ">=3.24.0"
|
||||||
|
|||||||
11
pubspec.yaml
11
pubspec.yaml
@@ -1,7 +1,7 @@
|
|||||||
name: fl_clash
|
name: fl_clash
|
||||||
description: A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.
|
description: A multi-platform proxy client based on ClashMeta, simple and easy to use, open-source and ad-free.
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
version: 0.8.78+202503052
|
version: 0.8.80+202503101
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.1.0 <4.0.0'
|
sdk: '>=3.1.0 <4.0.0'
|
||||||
|
|
||||||
@@ -10,11 +10,10 @@ dependencies:
|
|||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
intl: ^0.19.0
|
intl: any
|
||||||
path_provider: ^2.1.0
|
path_provider: ^2.1.0
|
||||||
path: ^1.9.0
|
path: ^1.9.0
|
||||||
shared_preferences: ^2.5.1
|
shared_preferences: ^2.5.1
|
||||||
# provider: ^6.0.5
|
|
||||||
window_manager: ^0.4.3
|
window_manager: ^0.4.3
|
||||||
dynamic_color: ^1.7.0
|
dynamic_color: ^1.7.0
|
||||||
proxy:
|
proxy:
|
||||||
@@ -36,7 +35,7 @@ dependencies:
|
|||||||
freezed_annotation: ^2.4.1
|
freezed_annotation: ^2.4.1
|
||||||
image_picker: ^1.1.2
|
image_picker: ^1.1.2
|
||||||
webdav_client: ^1.2.2
|
webdav_client: ^1.2.2
|
||||||
dio: ^5.4.3+1
|
dio: ^5.8.0+1
|
||||||
win32: ^5.5.1
|
win32: ^5.5.1
|
||||||
ffi: ^2.1.2
|
ffi: ^2.1.2
|
||||||
re_editor: ^0.6.0
|
re_editor: ^0.6.0
|
||||||
@@ -55,6 +54,7 @@ dependencies:
|
|||||||
flutter_riverpod: ^2.6.1
|
flutter_riverpod: ^2.6.1
|
||||||
riverpod_annotation: ^2.6.1
|
riverpod_annotation: ^2.6.1
|
||||||
riverpod: ^2.6.1
|
riverpod: ^2.6.1
|
||||||
|
google_fonts: ^6.2.1
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
@@ -79,9 +79,6 @@ flutter:
|
|||||||
- family: Twemoji
|
- family: Twemoji
|
||||||
fonts:
|
fonts:
|
||||||
- asset: assets/fonts/Twemoji.Mozilla.ttf
|
- asset: assets/fonts/Twemoji.Mozilla.ttf
|
||||||
- family: MiSans
|
|
||||||
fonts:
|
|
||||||
- asset: assets/fonts/MiSans-Regular.ttf
|
|
||||||
- family: Icons
|
- family: Icons
|
||||||
fonts:
|
fonts:
|
||||||
- asset: assets/fonts/Icons.ttf
|
- asset: assets/fonts/Icons.ttf
|
||||||
|
|||||||
@@ -1,60 +0,0 @@
|
|||||||
// ignore_for_file: avoid_print
|
|
||||||
|
|
||||||
import 'dart:async';
|
|
||||||
import 'dart:convert';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:typed_data';
|
|
||||||
|
|
||||||
Future<void> main() async {
|
|
||||||
// final cmdList = [];
|
|
||||||
// final ignoreHosts = "\"ass\"";
|
|
||||||
// cmdList.add(
|
|
||||||
// ["gsettings", "set", "org.gnome.system.proxy", "port", ignoreHosts],
|
|
||||||
// );
|
|
||||||
// print(cmdList.first);
|
|
||||||
final internetAddress = InternetAddress(
|
|
||||||
"/tmp/FlClashSocket.sock",
|
|
||||||
type: InternetAddressType.unix,
|
|
||||||
);
|
|
||||||
|
|
||||||
final socket = await Socket.connect(internetAddress, 0);
|
|
||||||
socket
|
|
||||||
.transform(
|
|
||||||
StreamTransformer<Uint8List, String>.fromHandlers(
|
|
||||||
handleData: (Uint8List data, EventSink<String> sink) {
|
|
||||||
sink.add(utf8.decode(data));
|
|
||||||
},
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.transform(LineSplitter())
|
|
||||||
.listen((res) {
|
|
||||||
print(res);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
startService() async {
|
|
||||||
try {
|
|
||||||
// 创建服务器
|
|
||||||
final server = await HttpServer.bind("127.0.0.1", 10001);
|
|
||||||
print('服务器正在监听 ${server.address.address}:${server.port}');
|
|
||||||
|
|
||||||
// 监听请求
|
|
||||||
await for (HttpRequest request in server) {
|
|
||||||
handleRequest(request);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
print('服务器错误: $e');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleRequest(HttpRequest request) {
|
|
||||||
print(request.headers);
|
|
||||||
// 处理请求
|
|
||||||
request.response
|
|
||||||
..statusCode = HttpStatus.ok
|
|
||||||
..headers.contentType = ContentType.html
|
|
||||||
..write('<html><body><h1>Hello, Dart Server!</h1></body></html>');
|
|
||||||
|
|
||||||
// 完成响应
|
|
||||||
request.response.close();
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user