Merge branch 'main' into zh-cn-i18n-patch-2

This commit is contained in:
Hiddify
2024-02-20 10:30:51 +03:30
committed by GitHub
15 changed files with 72 additions and 47 deletions

View File

@@ -92,9 +92,6 @@ jobs:
make ${{ matrix.platform }}-prepare
tree
- name: Test
run: flutter test
- name: Setup Android Signing Properties
if: startsWith(matrix.platform,'android')
run: |

View File

@@ -1,6 +1,6 @@
# Changelog
## Unreleased
## [0.16.0.dev] - 2023-2-18
### New Features and Improvements
@@ -16,6 +16,7 @@
- Changed in-app icons (using [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons))
- Redesigned navigation flow, separating config options
- Added haptic feedback
- Added detailed subscription info in profile edit page
- Added Chinese Taiwan language. [PR#410](https://github.com/hiddify/hiddify-next/pull/410) by [junlin03](https://github.com/junlin03) and [PR#491](https://github.com/hiddify/hiddify-next/pull/491) by [kouhe3](https://github.com/kouhe3)
- Added Japanese Readme. [PR#371](https://github.com/hiddify/hiddify-next/pull/371) by [Ikko Eltociear Ashimine](https://github.com/eltociear)
@@ -277,6 +278,7 @@
- Fixed localization mistakes in Russian. [PR#95](https://github.com/hiddify/hiddify-next/pull/95) by [solokot](https://github.com/solokot)
- Fixed localization mistakes in Russian. [PR#74](https://github.com/hiddify/hiddify-next/pull/74) by [Elshad Guseynov](https://github.com/lifeindarkside)
[0.16.0.dev]: https://github.com/hiddify/hiddify-next/releases/tag/v0.16.0.dev
[0.14.1.dev]: https://github.com/hiddify/hiddify-next/releases/tag/v0.14.1.dev
[0.14.0.dev]: https://github.com/hiddify/hiddify-next/releases/tag/v0.14.0.dev
[0.13.6]: https://github.com/hiddify/hiddify-next/releases/tag/v0.13.6

View File

@@ -1,7 +1,7 @@
{
"general": {
"reset": "Renicio",
"appTitle": "Hiddify",
"reset": "Renicio",
"toggle": {
"enabled": "Activado",
"disabled": "Desactivado"
@@ -211,6 +211,10 @@
"warp": "WARP Options",
"misc": "Opciones varias"
},
"warpConsent": {
"title": "Consentimiento WARP de Cloudflare",
"description(rich)": "Cloudflare WARP es un proveedor de VPN WireGuard gratuito. Al habilitar esta opción, acepta los ${tos(Términos de servicio)} y ${privacy(Política de privacidad)} de Cloudflare WARP."
},
"pageTitle": "Opciones de configuración",
"logLevel": "Registro del Nivel",
"resolveDestination": "Resolver Destino",
@@ -258,11 +262,7 @@
"warpLicenseKey": "License Key",
"warpCleanIp": "Clean IP",
"warpPort": "Port",
"warpNoise": "Noise",
"warpConsent": {
"title": "Consentimiento WARP de Cloudflare",
"description(rich)": "Cloudflare WARP es un proveedor de VPN WireGuard gratuito. Al habilitar esta opción, acepta los ${tos(Términos de servicio)} y ${privacy(Política de privacidad)} de Cloudflare WARP."
}
"warpNoise": "Noise"
},
"geoAssets": {
"pageTitle": "Activos de enrutamiento",

View File

@@ -211,6 +211,10 @@
"warp": "WARP Options",
"misc": "تنظیمات متفرقه"
},
"warpConsent": {
"title": "رضایت Cloudflare WARP",
"description(rich)": "Cloudflare WARP یک ارائه دهنده رایگان WireGuard VPN است. با فعال کردن این گزینه، با ${tos(شرایط خدمات)} و ${privacy(خط‌مشی رازداری)} Cloudflare WARP موافقت می‌کنید."
},
"pageTitle": "تنظیمات کانفیگ",
"logLevel": "سطح لاگ",
"resolveDestination": "جایگذاری IP مقصد",
@@ -258,11 +262,7 @@
"warpLicenseKey": "License Key",
"warpCleanIp": "Clean IP",
"warpPort": "Port",
"warpNoise": "Noise",
"warpConsent": {
"title": "رضایت Cloudflare WARP",
"description(rich)": "Cloudflare WARP یک ارائه دهنده رایگان WireGuard VPN است. با فعال کردن این گزینه، با ${tos(شرایط خدمات)} و ${privacy(خط‌مشی رازداری)} Cloudflare WARP موافقت می‌کنید."
}
"warpNoise": "Noise"
},
"geoAssets": {
"pageTitle": "فایل‌های مسیریابی",

View File

@@ -211,6 +211,10 @@
"warp": "WARP Options",
"misc": "Разные параметры"
},
"warpConsent": {
"title": "Согласие Cloudflare WARP",
"description(rich)": "Cloudflare WARP — бесплатный провайдер WireGuard VPN. Включая эту опцию, вы соглашаетесь с ${tos(Условиями обслуживания)} и ${privacy(Политикой конфиденциальности)} Cloudflare WARP."
},
"pageTitle": "Параметры конфигурации",
"logLevel": "Подробность журналирования",
"resolveDestination": "Определять назначение",
@@ -258,11 +262,7 @@
"warpLicenseKey": "License Key",
"warpCleanIp": "Clean IP",
"warpPort": "Port",
"warpNoise": "Noise",
"warpConsent": {
"title": "Согласие Cloudflare WARP",
"description(rich)": "Cloudflare WARP — бесплатный провайдер WireGuard VPN. Включая эту опцию, вы соглашаетесь с ${tos(Условиями обслуживания)} и ${privacy(Политикой конфиденциальности)} Cloudflare WARP."
}
"warpNoise": "Noise"
},
"geoAssets": {
"pageTitle": "Активы маршрутизации",

View File

@@ -211,6 +211,10 @@
"warp": "WARP Options",
"misc": "Çeşitli Seçenekler"
},
"warpConsent": {
"title": "Cloudflare WARP Onayı",
"description(rich)": "Cloudflare WARP ücretsiz bir WireGuard VPN sağlayıcısıdır. Bu seçeneği etkinleştirerek Cloudflare WARP'ın ${tos(Hizmet Şartları)} ve ${privacy(Gizlilik Politikası)}'nı kabul etmiş olursunuz."
},
"pageTitle": "Yapılandırma Seçenekleri",
"logLevel": "Log Seviyesi",
"resolveDestination": "Hedefi Çöz",
@@ -258,11 +262,7 @@
"warpLicenseKey": "License Key",
"warpCleanIp": "Clean IP",
"warpPort": "Port",
"warpNoise": "Noise",
"warpConsent": {
"title": "Cloudflare WARP Onayı",
"description(rich)": "Cloudflare WARP ücretsiz bir WireGuard VPN sağlayıcısıdır. Bu seçeneği etkinleştirerek Cloudflare WARP'ın ${tos(Hizmet Şartları)} ve ${privacy(Gizlilik Politikası)}'nı kabul etmiş olursunuz."
}
"warpNoise": "Noise"
},
"geoAssets": {
"pageTitle": "Varlıkları Yönlendirme",

View File

@@ -57,8 +57,8 @@
"remainingTrafficSemanticLabel": "已使用 ${consumed} 流量,共 ${total} 流量。",
"expired": "已过期",
"noTraffic": "超出配额",
"upload": "上",
"download": "下",
"upload": "上",
"download": "下",
"total": "总流量",
"expireDate": "到期时间"
},
@@ -129,18 +129,18 @@
"emptyProxiesMsg": "没有可用的代理",
"delayTestTooltip": "测试延迟",
"sortTooltip": "对代理进行排序",
"checkIp": "查看IP",
"unknownIp": "未知IP",
"checkIp": "检测IP地址",
"unknownIp": "未知IP",
"sortOptions": {
"unsorted": "默认",
"name": "按字母顺序",
"delay": "按延迟顺序"
},
"activeProxySemanticLabel": "活代理",
"activeProxySemanticLabel": "活跃的代理",
"delaySemantics": {
"result": "延迟: ${delay}ms",
"timeout": "测试延迟超时",
"testing": "延迟: 测试中..."
"result": "延迟:${delay}ms",
"timeout": "延迟测试超时",
"testing": "正在测试延迟"
},
"ipInfoSemantics": {
"address": "IP地址",
@@ -148,7 +148,7 @@
},
"statsSemantics": {
"speed": "速度",
"totalTransferred": "已转发流量"
"totalTransferred": "总传输量"
}
},
"logs": {
@@ -194,7 +194,7 @@
"ignoreBatteryOptimizationsMsg": "消除限制以获得最佳 VPN 性能",
"dynamicNotification": "在通知中显示速度",
"hapticFeedback": "触觉反馈",
"autoIpCheck": "自动检查IP"
"autoIpCheck": "自动检查连接的 IP"
},
"advanced": {
"sectionTitle": "高级选项",
@@ -224,7 +224,8 @@
"serviceModes": {
"proxy": "仅代理",
"systemProxy": "系统代理",
"tun": "VPN"
"tun": "VPN",
"tunService": "VPN服务"
},
"section": {
"route": "路由选项",
@@ -240,8 +241,8 @@
"title": "Cloudflare WARP 同意",
"description(rich)": "Cloudflare WARP 是免费的 WireGuard VPN 提供商。启用此选项即表示您同意 Cloudflare WARP 的 ${tos(服务条款)} 和 ${privacy(隐私政策)}"
},
"generateWarpConfig": "生成WARP配置",
"missingWarpConfig": "缺失WARP配置",
"generateWarpConfig": "生成WARP配置文件",
"missingWarpConfig": "WARP配置缺失",
"pageTitle": "配置选项",
"logLevel": "日志级别",
"resolveDestination": "解析目标地址",

View File

@@ -1 +1 @@
core.version=0.15.15
core.version=0.16.0

View File

@@ -751,7 +751,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1515;
CURRENT_PROJECT_VERSION = 1600;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
EXCLUDED_ARCHS = armv7;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -770,7 +770,7 @@
"@executable_path/libcore/",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 0.15.15;
MARKETING_VERSION = 0.16.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
OTHER_LDFLAGS = "-lresolv";
@@ -802,7 +802,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1515;
CURRENT_PROJECT_VERSION = 1600;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
EXCLUDED_ARCHS = armv7;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -821,7 +821,7 @@
"@executable_path/libcore/",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 0.15.15;
MARKETING_VERSION = 0.16.0;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "-lresolv";
@@ -851,7 +851,7 @@
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = SingBoxPacketTunnel/SingBoxPacketTunnel.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1515;
CURRENT_PROJECT_VERSION = 1600;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
EXCLUDED_ARCHS = armv7;
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -870,7 +870,7 @@
"@executable_path/libcore/",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 0.15.15;
MARKETING_VERSION = 0.16.0;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "-lresolv";

View File

@@ -32,4 +32,10 @@ class HapticService extends _$HapticService {
await HapticFeedback.mediumImpact();
}
}
Future<void> heavyImpact() async {
if (state) {
await HapticFeedback.heavyImpact();
}
}
}

View File

@@ -25,6 +25,17 @@ class ConnectionNotifier extends _$ConnectionNotifier with AppLogger {
}).run();
}
ref.listenSelf(
(previous, next) async {
if (previous == next) return;
if (previous case AsyncData(:final value) when !value.isConnected) {
if (next case AsyncData(value: final Connected _)) {
await ref.read(hapticServiceProvider.notifier).heavyImpact();
}
}
},
);
ref.listen(
activeProfileProvider.select((value) => value.asData?.value),
(previous, next) async {

View File

@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:flutter/services.dart';
import 'package:fpdart/fpdart.dart';
import 'package:hiddify/core/haptic/haptic_service.dart';
import 'package:hiddify/features/profile/data/profile_data_providers.dart';
import 'package:hiddify/features/profile/data/profile_repository.dart';
import 'package:hiddify/features/profile/model/profile_entity.dart';
@@ -46,6 +47,7 @@ class ProfilesOverviewNotifier extends _$ProfilesOverviewNotifier
Future<Unit> selectActiveProfile(String id) async {
loggy.debug('changing active profile to: [$id]');
await ref.read(hapticServiceProvider.notifier).lightImpact();
return _profilesRepo.setAsActive(id).getOrElse((err) {
loggy.warning('failed to set [$id] as active profile', err);
throw err;

View File

@@ -1,5 +1,6 @@
import 'package:circle_flags/circle_flags.dart';
import 'package:flutter/material.dart';
import 'package:hiddify/core/haptic/haptic_service.dart';
import 'package:hiddify/core/localization/translations.dart';
import 'package:hiddify/core/utils/ip_utils.dart';
import 'package:hiddify/utils/riverpod_utils.dart';
@@ -7,6 +8,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
final _showIp = StateProvider.autoDispose((ref) {
ref.disposeDelay(const Duration(seconds: 20));
ref.listenSelf((previous, next) {
if (previous == false && next == true) {
ref.read(hapticServiceProvider.notifier).mediumImpact();
}
});
return false;
});

Submodule libcore updated: 6672cd8104...6c65b73981

View File

@@ -1,7 +1,7 @@
name: hiddify
description: Cross Platform Multi Protocol Proxy Frontend.
publish_to: "none"
version: 0.15.15+1515
version: 0.16.0+1600
environment:
sdk: ">=3.2.0 <4.0.0"