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 make ${{ matrix.platform }}-prepare
tree tree
- name: Test
run: flutter test
- name: Setup Android Signing Properties - name: Setup Android Signing Properties
if: startsWith(matrix.platform,'android') if: startsWith(matrix.platform,'android')
run: | run: |

View File

@@ -1,6 +1,6 @@
# Changelog # Changelog
## Unreleased ## [0.16.0.dev] - 2023-2-18
### New Features and Improvements ### New Features and Improvements
@@ -16,6 +16,7 @@
- Changed in-app icons (using [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons)) - Changed in-app icons (using [Fluent UI System Icons](https://github.com/microsoft/fluentui-system-icons))
- Redesigned navigation flow, separating config options - Redesigned navigation flow, separating config options
- Added haptic feedback - 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 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) - 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#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) - 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.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.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 [0.13.6]: https://github.com/hiddify/hiddify-next/releases/tag/v0.13.6

View File

@@ -1,7 +1,7 @@
{ {
"general": { "general": {
"reset": "Renicio",
"appTitle": "Hiddify", "appTitle": "Hiddify",
"reset": "Renicio",
"toggle": { "toggle": {
"enabled": "Activado", "enabled": "Activado",
"disabled": "Desactivado" "disabled": "Desactivado"
@@ -211,6 +211,10 @@
"warp": "WARP Options", "warp": "WARP Options",
"misc": "Opciones varias" "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", "pageTitle": "Opciones de configuración",
"logLevel": "Registro del Nivel", "logLevel": "Registro del Nivel",
"resolveDestination": "Resolver Destino", "resolveDestination": "Resolver Destino",
@@ -258,11 +262,7 @@
"warpLicenseKey": "License Key", "warpLicenseKey": "License Key",
"warpCleanIp": "Clean IP", "warpCleanIp": "Clean IP",
"warpPort": "Port", "warpPort": "Port",
"warpNoise": "Noise", "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."
}
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "Activos de enrutamiento", "pageTitle": "Activos de enrutamiento",

View File

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

View File

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

View File

@@ -211,6 +211,10 @@
"warp": "WARP Options", "warp": "WARP Options",
"misc": "Çeşitli Seçenekler" "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", "pageTitle": "Yapılandırma Seçenekleri",
"logLevel": "Log Seviyesi", "logLevel": "Log Seviyesi",
"resolveDestination": "Hedefi Çöz", "resolveDestination": "Hedefi Çöz",
@@ -258,11 +262,7 @@
"warpLicenseKey": "License Key", "warpLicenseKey": "License Key",
"warpCleanIp": "Clean IP", "warpCleanIp": "Clean IP",
"warpPort": "Port", "warpPort": "Port",
"warpNoise": "Noise", "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."
}
}, },
"geoAssets": { "geoAssets": {
"pageTitle": "Varlıkları Yönlendirme", "pageTitle": "Varlıkları Yönlendirme",

View File

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

View File

@@ -32,4 +32,10 @@ class HapticService extends _$HapticService {
await HapticFeedback.mediumImpact(); 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(); }).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( ref.listen(
activeProfileProvider.select((value) => value.asData?.value), activeProfileProvider.select((value) => value.asData?.value),
(previous, next) async { (previous, next) async {

View File

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

View File

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

Submodule libcore updated: 6672cd8104...6c65b73981

View File

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