aslan新功能

This commit is contained in:
zhangxianbiao 2026-07-10 20:31:52 +08:00
parent de0a45b682
commit ee53279985
469 changed files with 93962 additions and 2587 deletions

139
AGENTS.md Normal file
View File

@ -0,0 +1,139 @@
# AGENTS.md
本文档为 Codex (Codex.ai/code) 在此代码库中工作时提供指导。
## 项目概览
这是一个名为 "Aslan" 的 Flutter 应用程序(项目 `atu`),是一个具有实时音频/视频、聊天、礼物和家族功能的社交语音聊天应用。它采用清晰架构分层core、data、domain、presentation。
**主要依赖**
- **实时通信**Agora RTC (`agora_rtc_engine`)、腾讯云聊天 (`tencent_cloud_chat_sdk`)
- **状态管理**Provider (`provider`)
- **路由**Fluro (`fluro`)
- **网络请求**Dio (`dio`) 带有自定义拦截器
- **本地包**:修改版本的 `webview_flutter``tancent_vap``on_audio_query``flutter_foreground_task` 包含在 `local_packages/` 中。在更新 pub 依赖前请始终检查这些目录。
## 常用开发任务
### 运行应用
```bash
# 运行应用
flutter run
```
### 构建
- **Android**`flutter build apk``flutter build appbundle`
- **iOS**`flutter build ios`
### 测试
- 运行单元/部件测试:`flutter test`
- 单个测试文件:`flutter test test/widget_test.dart`
### 代码检查和分析
- 静态分析:`flutter analyze`
- 代码格式化:`flutter format .`
### 管理依赖
- 获取包:`flutter pub get`
- 升级包:`flutter pub upgrade`
- 检查过时包:`flutter pub outdated`
### iOS 特定设置
- 更新 Flutter 插件后在 `ios/` 中运行 `pod install`
- Podfile 包含自定义权限标志(相机、麦克风、相册、通知已启用;其他已禁用)。按需调整。
## 架构
### 层级结构
- **`lib/core/`**:常量、工具、共享组件、路由。
- `constants/`:应用全局配置 (`GlobalConfig`)、颜色、屏幕尺寸。
- `routes/`Fluro 路由设置 (`Routes.dart`, `router_init.dart`)。
- `compontent/`:可复用的 UI 组件(自定义应用栏、图片、按钮、对话框)。
- `utils/`:工具类(设备 ID、键盘、深度链接
- **`lib/domain/`**:业务逻辑。
- `entities/`:数据模型。
- `repositories/`:仓库接口。
- `use_cases/`:业务逻辑类(文本格式化器、标签选择器等)。
- **`lib/data/`**:数据层实现。
- `datasources/remote/net/`HTTP 客户端 (`http.dart`, `api.dart`),带有自定义拦截器用于头部、超时、日志。
- `datasources/local/`:本地存储 (`StorageManager`)、用户管理 (`UserManager`)、前台服务助手。
- `datasources/repositories/`:仓库实现。
- `models/`:数据传输对象和枚举。
- **`lib/presentation/`**UI 层。
- `pages/`:基于功能页面的目录(登录、房间、聊天、家族等)。
- `providers/`:状态管理的 ChangeNotifier 提供者(认证、用户、房间、礼物等)。
### 状态管理
- 使用 `provider` 包和 `ChangeNotifier`
- 提供者在 `main.dart` (`MyAppWithProviders`) 中注册。部分提供者为懒加载。
- 关键提供者:`AuthProvider``UserProvider``RoomProvider``RtcProvider``RtmProvider``GiftProvider``LocaleProvider``ThemeProvider`
### 路由
- 使用 `fluro` 进行导航。
- 路由定义在 `lib/core/routes/Routes.dart` 和各功能的模块化 `IRouterProvider` 实现 (`*_route.dart`)。
- 导航工具:`fluro_navigator.dart` 中的 `NavigatorUtils`
### 网络层
- 基础 URL 配置在 `GlobalConfig.apiHost`
- 自定义 `Http` 类继承 `BaseHttp`,带有用于头部、日志、超时的拦截器。
- 请求头包含设备信息、语言、令牌。
- 响应包装在 `ResponseData` 中,包含 `status``errorCode``body` 字段。
### 配置
- **配置架构**: 使用 `AppConfig` 系统管理应用配置
- **全局配置**: `lib/core/constants/global_config.dart``AppConfig.current` 获取配置值
- **配置内容**: API主机、腾讯IM App ID、Agora RTC App ID、功能开关、审核模式标志等
- **业务逻辑差异化**: 使用策略模式(`BusinessLogicStrategy`)实现页面差异化
- `BaseBusinessLogicStrategy`: 原始应用默认实现
- `Variant1BusinessLogicStrategy`: 马甲包差异化实现
- 页面通过 `GlobalConfig.businessLogicStrategy` 访问策略方法
- 已差异化页面: 首页、登录页、家族页、探索页、个人主页、管理编辑和搜索页
### UI 适配
- 使用 `flutter_screenutil` 进行响应式设计。
- 设计尺寸为 375×667定义在 `lib/core/constants/screen.dart`)。
- 使用 `ScreenUtil().setWidth()``ScreenUtil().setHeight()``ScreenUtil().setSp()` 处理尺寸和字体大小。
### 本地化
- `assets/l10n/` 中的 JSON 文件支持英语、中文、阿拉伯语、土耳其语、孟加拉语。
- `ATAppLocalizations` 类加载翻译;使用 `ATAppLocalizations.of(context)!.keyName`
### 资源
- 图片按功能组织在 `images/` 中(启动页、登录、房间、个人等)。
- 字体在 `fonts/` 中(自定义字体 `MyCustomFont`)。
## 重要说明
### 本地包
项目在 `local_packages/` 中包含多个插件的修改版本:
- `webview_flutter-4.13.0`
- `tancent_vap-1.0.0+1`(腾讯视频动画播放器)
- `on_audio_query-2.9.0`
- `flutter_foreground_task-9.1.0`
更新依赖时,请检查这些本地包的更改是否需要保留。除非有意替换,否则避免用 pub.dev 版本覆盖它们。
### iOS 权限
`ios/Podfile` 设置预处理器标志来禁用未使用的权限(日历、联系人、提醒事项等),仅启用相机、麦克风、相册、通知。如需额外权限,请修改 `GCC_PREPROCESSOR_DEFINITIONS` 块。
### 审核模式
`GlobalConfig.isReview` 控制应用是否处于审核模式(例如用于 App Store 审核)。这可能会影响功能可用性。
### 实时功能
- Agora RTC 用于语音/视频房间。
- 腾讯 IM 用于聊天消息。
- 确保 `GlobalConfig` 中设置了正确的 App ID。
### 错误报告
- 使用 Firebase Crashlytics 进行崩溃报告。
- 未捕获的错误通过 `runZonedGuarded``FlutterError.onError` 捕获。
- 网络错误通过日志记录并通过 toast 显示。
## 故障排除
- **Pod install 错误**:检查 `ios/Podfile` 语法;确保 Flutter 插件兼容。
- **本地包错误**:验证 `pubspec.yaml` 中的路径指向正确的本地包目录。
- **网络请求失败**:确认 `GlobalConfig.apiHost` 可达;检查 `ApiInterceptor` 中的头部。
- **状态未更新**:验证提供者是否在需要时不是懒加载状态;检查 `notifyListeners()` 调用。

View File

@ -9,6 +9,7 @@ plugins {
android {
namespace = "com.chat.auu"
compileSdk = 36
ndkVersion = "28.2.13676358"
bundle {
@ -25,12 +26,6 @@ android {
keyPassword = "abc2025"
}
getByName("debug") {
storeFile = file("./atu_debug.jks")
storePassword = "abc2025"
keyAlias = "atu"
keyPassword = "abc2025"
}
}
compileOptions {
@ -77,7 +72,7 @@ android {
}
getByName("debug") {
isMinifyEnabled = false
signingConfig = signingConfigs["debug"]
signingConfig = signingConfigs["release"]
}
}
}

View File

@ -1,3 +1,7 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
# This builtInKotlin flag was added automatically by Flutter migrator
android.builtInKotlin=false
# This newDsl flag was added automatically by Flutter migrator
android.newDsl=false

View File

@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip

View File

@ -21,8 +21,8 @@ pluginManagement {
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
id("com.android.application") version "8.11.1" apply false
id("org.jetbrains.kotlin.android") version "2.2.20" apply false
}
include(":app")

View File

@ -325,6 +325,14 @@
"inRoom": "في الغرفة",
"inRocket": "في الصاروخ",
"roomRocketHelpTips": "1. إرسال الهدايا في الغرفة يزيد من طاقة الصاروخ. *هدية واحدة من العملات الذهبية = نقطة طاقة صاروخية واحدة؛ الهدايا المحظوظة تزيد من طاقة الصاروخ بنسبة 4% من قيمة العملة الذهبية للهدية.\n2. بعد اكتمال شحن الطاقة، يمكنك إطلاق الصاروخ. سيتم توزيع المكافآت تلقائيًا بعد إطلاق الصاروخ.\n3. تقدم فئات الصواريخ المختلفة مكافآت مختلفة.\n4. عند إطلاق الصاروخ، يمكن لجميع المستخدمين في الغرفة المطالبة بمكافأة الصاروخ.\n5. سيتم تحديث طاقة الصاروخ في الساعة 0:00 كل يوم.",
"roomRocketRecordAction": "السجل",
"roomRocketRewardTop1": "الأول",
"roomRocketRewardSetOff": "الإطلاق",
"roomRocketRewardInRoom": "في الغرفة",
"roomRocketResetCountdown": "23 ساعة و59 دقيقة و59 ثانية حتى إعادة التعيين",
"roomRocketRecordRoom": "الغرفة",
"roomRocketRecordReward": "المكافأة",
"roomRocketRecordLast35Days": "عرض سجلات آخر 35 يومًا فقط",
"searchCouponHint": "ابحث عن كوبون",
"search": "بحث",
"checkInSuccessful": "تسجيل الوصول ناجح",
@ -352,7 +360,7 @@
"goToUpload": "اذهب لتحميل",
"rechargeAgency": "وكالة الشحن",
"logout": "تسجيل الخروج",
"adminCenter": "مركز الإدارة",
"adminCenter": "مركز العمل",
"explore": "استكشاف",
"micManagement": "إدارة الميكروفون",
"followList": "قائمة المتابعة",
@ -756,4 +764,4 @@
"systemDefault": "النظام الافتراضي",
"pleaseGetOnTheMicFirst": "من فضلك استخدم الميكروفون أولاً.",
"duration2": "المدة:{1}"
}
}

View File

@ -389,6 +389,14 @@
"get": "পান করুন",
"inRocket": "রকেটে",
"roomRocketHelpTips": "1. রুমে উপহার পাঠান রকেট শক্তি বাড়ায়। *1 সোনা কয়েন উপহার = 1 রকেট শক্তি পয়েন্ট; ভাগ্যশালী উপহার রকেট শক্তি উপহারের সোনা কয়েন মানের 4% পরিমাণে বাড়ায়।\n2. রকেট শক্তি সম্পূর্ণভাবে পূর্ণ হলে, রুম রকেট চালু করতে পারে। চালু করার পর পুরস্কার স্বয়ংক্রিয়ভাবে বিতরণ করা হবে।\n3. বিভিন্ন রকেট স্তর বিভিন্ন পুরস্কার প্রদান করে।\n4. রকেট চালু হলে, রুমের সমস্ত ব্যবহারকারী রকেট পুরস্কার দাবি করতে পারে।5. রকেট শক্তি প্রতিদিন 00:00 এ শূন্য হয়ে যায়।",
"roomRocketRecordAction": "রেকর্ড",
"roomRocketRewardTop1": "শীর্ষ 1",
"roomRocketRewardSetOff": "চালু",
"roomRocketRewardInRoom": "রুমে",
"roomRocketResetCountdown": "রিসেট হতে ২৩ ঘণ্টা, ৫৯ মিনিট ও ৫৯ সেকেন্ড বাকি",
"roomRocketRecordRoom": "রুম",
"roomRocketRecordReward": "পুরস্কার",
"roomRocketRecordLast35Days": "শুধু গত ৩৫ দিনের রেকর্ড দেখান",
"couponRecord": "কুপন ব্যবহার রেকর্ড",
"inRoom": "রুমে",
"searchCouponHint": "কুপন সার্চ করুন",
@ -493,7 +501,7 @@
"bdCenter": "BD সেন্টার",
"renewVip": "VIP পুনর্নবীকরণ করুন",
"rechargeAgency": "রিচার্জ এজেন্সি",
"adminCenter": "অ্যাডমিন সেন্টার",
"adminCenter": "ওয়ার্ক সেন্টার",
"goldList": "সোনা তালিকা",
"followList": "ফলো তালিকা",
"fansList": "ফ্যান তালিকা",
@ -765,4 +773,4 @@
"systemDefault": "সিস্টেম ডিফল্ট",
"pleaseGetOnTheMicFirst": "কৃপয়া প্রথমে মাইক্রোফোনে যান।",
"duration2": "সময়:{1}"
}
}

View File

@ -343,6 +343,14 @@
"get": "Get",
"inRocket": "In the rocket",
"roomRocketHelpTips": "1. Sending gifts in the room increases rocket energy. *1 gold coin gift = 1 rocket energy point; lucky gifts increase rocket energy by 4% of the gift's gold coin value.\n2. Once the rocket energy is fully charged, the room can launch the rocket. Rewards will be automatically distributed after launch.\n3. Different rocket levels offer different rewards.\n4. When the rocket launches, all users in the room can claim the rocket reward.5. Rocket energy is reset at 00:00 every day.",
"roomRocketRecordAction": "Record",
"roomRocketRewardTop1": "Top1",
"roomRocketRewardSetOff": "Set off",
"roomRocketRewardInRoom": "In the room",
"roomRocketResetCountdown": "23 hours, 59 minutes, and 59 seconds until reset",
"roomRocketRecordRoom": "Room",
"roomRocketRecordReward": "Reward",
"roomRocketRecordLast35Days": "Show only records from the last 35 days",
"couponRecord": "Coupon usage record",
"inRoom": "In Room",
"searchCouponHint": "Search Coupon",
@ -447,7 +455,7 @@
"bdCenter": "BD Center",
"renewVip": "Renew VIP",
"rechargeAgency": "Recharge Agency",
"adminCenter": "Admin Center",
"adminCenter": "Work Center",
"goldList": "Gold List",
"followList": "Follow List",
"fansList": "Fans List",
@ -766,4 +774,4 @@
"systemDefault": "System Default",
"pleaseGetOnTheMicFirst": "Please get on the mic first.",
"duration2": "Duration:{1}"
}
}

777
assets/l10n/intl_fil.json Normal file
View File

@ -0,0 +1,777 @@
{
"signInWithGoogle": "Mag-sign in gamit ang Google",
"or": "O kaya",
"signInWithYourAccount": "Mag-sign in gamit ang iyong account",
"signInWithApple": "Mag-sign in gamit ang Apple",
"loginRepresentsAgreementTo": "Ang pag-login ay kumakatawan sa kasunduan sa",
"termsofService": "Mga tuntunin ng serbisyo",
"privaceyPolicy": "Patakaran sa Privacy",
"tips": "Mga tip",
"dailyTasksTips": "Tandaan: Handa nang harapin ang mga gawain? Hanapin ang mga ito sa iyong mga paboritong kuwarto.",
"searchNoDataTips": "Ipasok ang kwarto o user lD na gusto mong hanapin.",
"youHaveNotHadVIPYet": "Wala ka pang VIP, halika at subukan ito",
"games": "Mga laro",
"vipAccelerating": "{1} Bumibilis",
"mine": "sa akin",
"luckGiftRuleTips": "Magbigay ng masuwerteng regalo at manalo ng hanggang 1000 beses sa reward na gintong barya! Ang mga gumagamit na tumatanggap ng mga masuwerteng regalo ay maaaring tamasahin ang mga sumusunod na benepisyo: \n(1) Para sa mga user na tumatanggap ng mga masuwerteng regalo: +4% ang halaga ng karanasan sa charm batay sa halaga ng regalo. (2) Kung ang tatanggap ay isang host: +4% na halaga ng target na suweldo ng host batay sa halaga ng regalo.",
"badge": "Badge",
"vipRippleTheme": "VIP Ripple Theme",
"glory": "kaluwalhatian",
"badgeHonor": "Badge/Glory",
"party": "Party",
"other": "Iba pa",
"gifProfileUpload": "Pag-upload ng Profile ng GIF",
"levelMedal": "Antas na Medalya",
"levelIcon": "Icon ng Antas",
"maliciousHarassment": "Malisyosong panliligalig",
"event": "Kaganapan",
"roomEdit": "Pag-edit ng Kwarto",
"cancelRoomPassword": "Sigurado ka bang gusto mong tanggalin ang password ng kwarto?",
"roomMemberFee": "Bayad sa Miyembro ng Kwarto",
"roomTheme2": "Tema ng Kwarto",
"blockedList2": "Naka-block na Listahan",
"roomPassword": "Password ng kwarto",
"numberOfMic": "Bilang ng Mic",
"pleaseEnterContent": "Mangyaring magpasok ng nilalaman",
"profilePhoto": "Larawan sa Profile",
"aboutMe": "Tungkol sa akin",
"myRoom": "kwarto ko",
"noHistoricalRecordsAvailable": "Walang magagamit na mga makasaysayang talaan.",
"inviteNewUsersToEarnCoins": "Mag-imbita ng mga bagong user na kumita ng mga barya",
"crateMyRoom": "Lumikha ng aking silid",
"vipSpecialGiftTassel": "VIP Espesyal na tassel ng regalo",
"vipEntranceEffect": "Epekto ng VIP Entrance",
"casualInteraction": "Kaswal na Pakikipag-ugnayan",
"haveGamePlayingTips": "Mayroon kang isang laro na isinasagawa. Mangyaring lumabas sa kasalukuyang laro. Sigurado ka bang gusto mong lumabas?",
"historicalTour": "Makasaysayang Paglilibot",
"gameCenter": "Game Center",
"returnToVoiceChat": "Bumalik sa voice chat?",
"exitGameMode": "Lumabas sa Game Mode",
"enterTheRoom": "Pumasok sa kwarto",
"invite": "Mag-imbita",
"inviteGoRoomTips": "Laging nandito para sa iyo, umulan man o umaraw. Bumaba at mag-hi!",
"confirmInviteThisUserToTheRoom": "Kumpirmahin na imbitahan ang user na ito(ID:{1}) sa kwarto?",
"honor": "karangalan",
"clearCacheSuccessfully": "Matagumpay na i-clear ang cache",
"sent": "Ipinadala",
"keep": "Panatilihin",
"open": "Bukas",
"deleteAccountTips2": "*Kung magbago ang isip mo, maaari kang mag-log in muli sa iyong kasalukuyang account sa loob ng pitong araw, at awtomatiko naming ire-restore ang iyong account. Kung walang pagpapanumbalik na magaganap sa loob ng pitong araw, ang account ay permanenteng tatanggalin",
"deleteAccountTips": "Mayroon kang ganap na mga karapatang pang-administratibo sa account na ito. Kung balak mong tanggalin ang account, mangyaring magkaroon ng kamalayan sa mga sumusunod na panganib na nauugnay sa operasyong ito:\n1. Kapag ang account ay matagumpay na natanggal, hindi ka na makakapag-login sa iyong kasalukuyang account. Ang pagtanggal ng account ay isang permanenteng pagkilos.\n2. Matapos matagumpay na matanggal ang account, hindi mo na mababawi ang anumang data ng account. Ang lahat ng impormasyon (kabilang ang mga silid, kaibigan), virtual na pera, mga regalo, at mga virtual na item ay permanenteng tatanggalin at hindi na maibabalik.\n3. Panahon ng paglamig: Kung hindi mo ibabalik ang account, hindi mo maa-access ang pahina ng pagbili, pahina ng pag-withdraw, o anumang iba pang mga pahina sa app.\n4. Sa panahon ng paglamig o pagkatapos matanggal ang account, ang pahina ng profile ay magsasaad na ito ay tinanggal. Upang maprotektahan ang iyong account mula sa paghahanap o pag-access ng iba, ang iyong personal na impormasyon ay aalisin mula sa mga system na nauugnay sa mga pang-araw-araw na function. Kapag ang pagtanggal ng account ay nagsasangkot ng pambansang seguridad, sibil o kriminal na paglilitis, o ang proteksyon ng mga lehitimong karapatan at interes ng mga ikatlong partido, inilalaan ng opisyal ang karapatang tanggihan ang kahilingan sa pagtanggal ng account ng user.\nKung sigurado ka na gusto mong tanggalin ang lahat ng personal na data mula sa iyong kasalukuyang account, paki-click ang \"Delete Account.\"",
"accountDeletionNotice": "Abiso sa Pagtanggal ng Account:",
"thisUserHasBeenBlacklisted": "Ang user na ito ay nai-blacklist.",
"trend": "Uso",
"like": "Parang",
"more": "Higit pa",
"discard": "Itapon",
"catchFirstComment": "Abangan ang unang komento",
"reply": "Sumagot",
"posting": "Pagpo-post",
"dynamic": "Dynamic",
"multiple": "Maramihan",
"successfullyAddedToTheDynamicBlacklist": "Matagumpay na naidagdag sa dynamic na blacklist!",
"successfullyRemovedFromTheBlacklist": "Matagumpay na naalis sa blacklist!",
"successfullyRemovedFromTheDynamicBlacklist": "Matagumpay na naalis mula sa dynamic na blacklist!",
"successfullyAddedToTheBlacklist": "Matagumpay na naidagdag sa blacklist!",
"youAreCurrentlyCPRelationshipPleaseDissolve": "Kasalukuyan kang nasa isang CP relationship.\nPaki-dissolve muna.",
"areYouSureToCancelBlacklist": "Sigurado ka bang kanselahin ang blacklist?",
"areYouSureYouWantToBlockThisUser": "Sigurado ka bang gusto mong i-block ang user na ito?",
"areYouSureYouWantToDynamicBlockThisUser": "Sigurado ka bang magdagdag ng dynamic na blacklist?",
"removeFromBlacklist": "Alisin sa blacklist",
"moveToBlacklist": "Ilipat sa blacklist",
"userBlacklist": "Blacklist ng user",
"specialEffectsManagement": "Pamamahala ng mga espesyal na epekto",
"wishingYouHappinessEveryDay": "Nais kang kaligayahan araw-araw.",
"newMessage": "Bagong mensahe",
"createRoomSuccsess": "Gumawa ng room succsess!",
"contactUs": "Kontakin Ako",
"systemAnnouncementTips1": "Bantayan laban sa pandaraya:",
"systemAnnouncementTips": "I-verify ang impormasyon sa pamamagitan lamang ng mga opisyal na channel. Huwag kailanman mag-download ng software ng third-party, magbahagi ng personal na data, o maglipat ng pera batay sa mga panlabas na kahilingan. Ang mga opisyal na ID ng kawani ay 10000, 10003, at 10086 lamang. Para sa anumang hinala, huminto at mag-ulat sa pamamagitan ng",
"systemAnnouncement": "System Announcement",
"doNotClickUnfamiliarTips": "Huwag i-click ang mga hindi pamilyar na link, dahil maaari nilang ilantad ang iyong personal na impormasyon. Huwag kailanman ibahagi ang iyong ID o mga detalye ng bank card sa sinuman.",
"atTag": "@Tag",
"sayHi2": "Say Hi",
"canSendMsgTips": "Kailangang sundan ng magkabilang panig ang isa't isa bago sila makapagpadala ng mga pribadong mensahe.",
"msgSendRedEnvelopeTips": "*Sisingilin ang 10% na bayad sa serbisyo sa mga pulang sobre, at ang mga tatanggap ay makakatanggap lamang ng 90% ng halaga ng pulang sobre. Ang antas ng kayamanan ng nagpadala ay dapat na mas mataas kaysa sa Antas 10.",
"leavFamilyTips": "Sigurado ka bang gusto mong umalis sa iyong kasalukuyang clan? Kakailanganin mong maghintay ng 1 araw para makasali muli sa isang clan.",
"leavingTheFamily": "Iniwan ang pamilya",
"familyNotifcations": "Mga Abiso ng Pamilya",
"familyNews": "Balitang Pampamilya",
"reapply": "Mag-apply muli",
"cancelRequestFamilyMsg": "Ang iyong kahilingang sumali sa pamilya 【{1}'s family】 ay sinusuri, sigurado ka bang kanselahin ang kahilingan?",
"cancelRequest": "Kanselahin ang Kahilingan",
"pending": "Nakabinbin",
"familyAnnouncement": "Anunsyo ng Pamilya",
"enterFamilyAnnouncement": "Pakilagay ang anunsyo ng pamilya.",
"disbandTheFamily": "Buwagin ang pamilya",
"editFamily": "I-edit ang Pamilya",
"supporter": "Tagasuporta",
"rechargeSuccessful": "Matagumpay na Mag-recharge",
"transactionReceived": "Natanggap ang Transaksyon",
"createFamilySuccess": "Lumikha ng tagumpay ng pamilya.",
"numberOfSign": "Bilang ng tanda: {1}",
"hostWeeklyRank": "Host Lingguhang Ranggo",
"supporterWeeklyRank": "Lingguhang Ranggo ng Tagasuporta",
"memberList": "Listahan ng Miyembro",
"treasureChest": "Kaban ng Kayamanan",
"xxfamily": "pamilya ni {1}.",
"applicationRecord": "Record ng Application",
"createFamily": "Lumikha ng Pamilya",
"familyName": "Pangalan ng pamilya",
"createAFamily": "Lumikha ng isang pamilya",
"searchFamilyIdHint": "Pakilagay ang ID ng may-ari ng pamilya",
"enterFamilyInfo": "Pakipakilala sandali ang iyong pamilya!",
"enterFamilyName": "Pakilagay ang pangalan ng iyong pamilya.",
"familyInfo": "Panimula ng pamilya",
"joinFamily": "Sumali sa isang pamilya",
"appUpdateTip": "Ang app ay may bagong bersyon ({1}), mangyaring pumunta at i-download ito?",
"ownerIncomeCoins": "Kita ng may-ari:{1} mga barya",
"game": "Laro",
"skip2": "Laktawan",
"coins4": "mga barya",
"currentVip": "Kasalukuyang VIP",
"weekStart": "Linggo-Pagsisimula",
"forMoreRewardsPleaseCheckTheTaskCenter": "Para sa higit pang mga reward, pakitingnan ang task center",
"kingQuuen": "King-Quuen",
"ramadan": "Ramadan",
"updateNow": "Update Ngayon",
"allGames": "Lahat ng Laro",
"fishClass": "Klase ng Isda",
"greedyClass": "Matakaw na Klase",
"raceSeries": "Serye ng Lahi",
"slotsClass": "Klase ng Slots",
"others": "Iba",
"hotGames": "Mainit na Laro",
"chatBox": "Chat box",
"termsOfServicePrivacyPolicyTips": "Sa pamamagitan ng pagpapatuloy sumasang-ayon ka sa Mga Tuntunin ng Serbisyo at Patakaran sa Privacy",
"and": "at",
"pleaseSelectTheTypeContent": "Mangyaring piliin ang uri ng nakakasakit na nilalaman.",
"wearHonor": "Magsuot ng karangalan",
"illegalInformation": "Ilegal na impormasyon",
"inappropriateContent": "Hindi naaangkop na nilalaman",
"personalAttack": "Personal na pag-atake",
"confirm": "Kumpirmahin",
"spam": "Spam",
"countdownMinutes": "Countdown Minutes :",
"number2": "Numero",
"fraud": "Panloloko",
"received": "Natanggap",
"currentProgress": "Kasalukuyang pag-unlad",
"currentStage": "Kasalukuyang yugto:{1}",
"roomReward2": "Gantimpala sa Kwarto:{1}",
"roomReward": "Gantimpala sa Kwarto",
"expirationTime": "Oras ng pag-expire",
"ownerSendTheRedEnvelope": "Ipinadala ng may-ari ang Reward coins.",
"rewardCoins": "Mga reward na barya:{1} mga barya",
"lastWeekProgress": "Ang pag-unlad noong nakaraang linggo",
"redEnvelopeTips2": "*Kung ang pulang bag ay hindi na-claim sa loob ng takdang panahon, ang natitirang mga barya ay ibabalik sa user na nagpadala ng pulang bag.",
"goToRecharge": "Pumunta sa recharge",
"deleteAccount2": "Tanggalin ang Account({1}s)",
"areYouSureYouWantToDeleteYourAccount": "Sigurado ka bang gusto mong tanggalin ang iyong account?",
"insufhcientGoldsGoToRecharge": "Hindi sapat na mga ginto, mag-recharge ngayon!",
"coins2": "{1}Mga barya",
"remainingNumberTips": "Ang natitirang bilang ng magagamit:({1}/{2})",
"collectionTimeTips": "Oras ng koleksyon:{1}({2}/{3})",
"sendARedEnvelope": "Magpadala ng pulang sobre",
"sendRedPackConfirmTips": "Sigurado ka bang gusto mong ipadala ang pulang pakete?",
"redEnvelopeSendingRecords": "Mga tala sa pagpapadala ng pulang sobre:",
"redEnvelope": "Pulang Sobre",
"redEnvelopeRecTips2": "Na-claim na lahat ang mga pulang sobre.",
"redEnvelopeRecTips3": "Ang oras ng koleksyon ng pulang sobre ay nag-expire na!",
"openTheTreasureChest": "Nagpadala ng pulang bag!",
"redEnvelopeRecTips1": "Ang mga nakuhang barya ay nadeposito sa iyong wallet.",
"redEnvelopeTips1": "Mga barya:",
"roomTools": "Mga Tool sa Kwarto:",
"entertainment": "Libangan:",
"reportSucc": "Tagumpay ang ulat",
"pornography": "Pornograpiya",
"reportInputTips": "Mangyaring ilarawan ang problema nang mas detalyado hangga't maaari upang maunawaan at malutas namin ito.",
"cancel": "Kanselahin",
"join": "Sumali",
"items": "Mga bagay",
"vistors": "Mga bisita",
"fans": "Mga tagahanga",
"balanceNotEnough": "Hindi sapat na balanse ng gintong barya. Gusto mo bang mag top up?",
"skip": "Laktawan ang {1}",
"wearMedal": "Magsuot ng Medalya",
"activityHonor": "Activity Honor",
"achievementHonor": "Achievement Honor",
"youDontHaveAnyHonorYet": "Wala ka pang karangalan.",
"letGoToWatch": "Tara manood tayo!",
"launchedARocket": "naglunsad ng rocket",
"sendUserId": "Ipadala ang UserID:{1}",
"giveUpIdentity": "Isuko ang pagkakakilanlan",
"leaveRoomIdentityTips": "Sigurado ka bang gusto mong ibigay ang pagkakakilanlan ng kwarto?",
"joinMemberTips2": "Gusto mo bang kumpirmahin ang pagsali sa kwarto bilang isang miyembro?",
"sureUnfollowThisRoom": "Sigurado bang i-unfollow ang kwartong ito?",
"welcomeMessage": "Maligayang pagdating sa aming aplikasyon, {name}!",
"settings": "Mga setting",
"account": "Account",
"common": "Karaniwan",
"delete": "Tanggalin",
"copy": "Kopyahin",
"bio": "Bio",
"useCoupontips": "Sigurado ka bang gusto mong gamitin ang kupon?",
"searchUserId": "Hanapin ang user's ID",
"sendUser": "Ipadala ang User",
"hobby": "libangan",
"sendCoupontips": "Sigurado ka bang gusto mong ipadala ang kupon na ito sa user na ito?",
"youDontHaveAnyCouponsYet": "Wala ka pang mga kupon.",
"recall": "Alalahanin",
"youHaventFollowed": "Wala ka pang sinundan na kwarto",
"deleteFromMyDevice": "Tanggalin sa aking device",
"deleteOnAllDevices": "Tanggalin sa lahat ng device",
"messageHasBeenRecalled": "Ang mensaheng ito ay naalala",
"recallThisMessage": "Tandaan ang mensaheng ito?",
"language": "Wika",
"feedback": "Feedback",
"signedin": "Naka-sign in",
"receiveSucc": "Matagumpay na na-claim",
"about": "Tungkol sa",
"aboutUs": "Tungkol sa Amin",
"theme": "Tema",
"wealthLevel": "Antas ng Kayamanan",
"userLevel": "Antas ng User",
"goToUpload": "Pumunta sa pag-upload",
"logout": "Log out",
"luck": "Swerte",
"level": "Antas",
"vip": "VIP",
"vip1": "VIP1",
"vip2": "VIP2",
"vip3": "VIP3",
"vip4": "VIP4",
"vip5": "VIP5",
"vip6": "VIP6",
"themeGoToUploadTips": "1. Suriin sa loob ng 24 na oras pagkatapos na matagumpay ang pag-upload.\n2.Ang lahat ng mga barya ay ibabalik kung nabigo ang pagsusuri.",
"home": "Bahay",
"explore": "Galugarin",
"me": "Ako",
"socialPrivilege": "Pribilehiyo sa lipunan",
"information": "Impormasyon",
"myPhoto": "Aking Larawan",
"cpRequest": "Kahilingan sa CP",
"areYouSureYouWantToSpend3": "*Kung tatanggihan ng kabilang partido ang imbitasyon sa CP, ibabalik ang iyong mga barya sa iyong wallet.",
"areYouSureYouWantToSpend": "Sigurado ka bang gusto mong gumastos",
"areYouSureYouWantToSpend2": "para magpadala ng CP invitation sa user na ito?",
"cpSexTips": "Ang mga mag-asawang magkapareho ang kasarian ay hindi maaaring gawin.",
"underReview": "Sinusuri",
"doYouWantToDeleteIt": "Gusto mo bang tanggalin ito?",
"chooseFromAblum": "Pumili mula sa Ablum",
"spaceBackground": "Background ng Space",
"editProfile": "I-edit ang Profile",
"sendTheCpRequest": "Ipadala ang kahilingan sa CP",
"addCp": "Magdagdag ng CP",
"partWays": "Mga Bahaging Paraan",
"reconcile": "Magkasundo",
"separated": "Hiwalay",
"areYouSureYouWantToSpend5": "{1} ipinagtapat ang nararamdaman sa iyo; kung tatanggapin mo, magiging couple kayo.",
"areYouSureYouWantToSpend6": "Gustong makipagbalikan ni {1} sa iyo. Kung magpasya kang makipagkasundo, maibabalik ang lahat ng iyong nakaraang data.",
"reconcileInvitationTips": "*Kung tatanggihan ng kabilang partido ang imbitasyon sa CP, ibabalik ang iyong mga barya sa iyong wallet.",
"reconcileInvitation": "Reconcile Imbitasyon",
"areYouSureYouWantToSpend4": "para magpadala ng imbitasyon sa pakikipagkasundo sa user na ito?",
"partWaysTips": "*Kung pipiliin ng isang partner sa mag-asawa na maghiwalay ng landas, magkakaroon ng 7-araw na panahon ng paglamig. Sa panahong ito, maaaring piliin ng magkabilang partido na magkasundo, at ang lahat ng data ay ibabalik sa pagkakasundo. Kung walang reconciliation ang pipiliin sa pagtatapos ng 7-araw na yugto, ang data ng mag-asawa ay iki-clear.",
"areYouSureYouWantToPartWaysWithYourCP": "Sigurado ka bang gusto mong makipaghiwalay sa iyong CP?",
"timeSpentTogether": "Oras na magkasama: {1} araw",
"firstDay": "Unang araw:{1}",
"numberOfMyCPs": "Bilang ng aking mga CP:({1}/{2})",
"props": "Props",
"medal": "Medalya",
"win": "manalo",
"dice": "Dice",
"rps": "RPS",
"areYouSureToCancelDynamicBlacklist": "Sigurado ka bang kakanselahin ang dynamic na blacklist?",
"blockUserDynamic": "I-block ang User Dynamic",
"unblockUserDynamic": "I-unblock ang User Dynamic",
"operationFail": "Nabigo ang operasyon.",
"likedYourComment": "Nagustuhan ang iyong Komento.",
"likedYourDynamic": "Nagustuhan ang iyong Dynamic.",
"doYouWantToKeepTheDraft": "Gusto mo bang panatilihin ang draft?",
"cantSendDynamicTips": "Kasalukuyan kang naka-block mula sa pag-post ng Dynamics.",
"operationsAreTooFrequent": "Masyadong madalas ang mga operasyon",
"luckNumber": "Numero ng Suwerte",
"relationShip": "Relasyon",
"couple": "Mag-asawa {1}:",
"couple2": "Mag-asawa",
"reject": "Tanggihan",
"cpList": "Listahan ng CP",
"sound2": "Tunog",
"hot": "Mainit",
"selectCountry": "Pumili ng bansa",
"giftEffect": "Epekto ng Regalo",
"winFloat": "Manalo ng Float",
"giftVibration": "Lucky Gift Effects",
"accept": "Tanggapin",
"noMatchedCP": "Walang katugmang CP",
"inviteYouToBecomeBD": "Anyayahan kang maging isang BD.",
"adminInviteRechargeAgent": "Anyayahan kang maging isang Recharge agent.",
"confirmAcceptTheInvitation": "Kumpirmahin na tanggapin ang imbitasyon?",
"confirmDeclineTheInvitation": "Kumpirmahin ang pagtanggi ng imbitasyon?",
"host": "Host",
"following": "Sumusunod",
"agent": "Ahensya",
"approved": "Naaprubahan",
"agreeJoinFamilyTips": "Pinapayagan mo ba ang user na ito na sumali sa pamilya?",
"refuseJoinFamilyTips": "Dapat mo bang tumanggi na payagan ang user na sumali sa pamilya?",
"onlineUsers": "Mga Online na User({1}/{2}):",
"applyToJoin": "Mag-apply para sumali",
"supporterList": "Listahan ng Tagasuporta",
"hostList": "Listahan ng host",
"upToAdmins": "Hanggang {1} (na) Admin",
"upToMembers": "Hanggang {1} (na) Miyembro",
"levelPrivileges": "Mga pribilehiyo sa antas",
"familyLevel": "Antas ng Pamilya",
"kickOutOfFamily": "Kick out sa pamilya",
"disbandTheFamilyTips": "Sigurado ka bang gusto mong buwagin ang pamilya?",
"setAsFamilyAdmin": "Itakda bilang admin ng pamilya",
"cancelFamilyAdmin": "Kanselahin ang admin ng pamilya",
"kickFamilyUserTips": "Sigurado ka bang gusto mong paalisin ang user na ito sa pamilya?",
"familyMember2": "Miyembro ng Pamilya({1}/{2}):",
"familyMember3": "Miyembro ng Pamilya({1}):",
"familyAdmin2": "Admin ng Pamilya({1}/{2}):",
"familyOwner2": "May-ari ng Pamilya:",
"ra": "RA",
"roomAnnouncement": "Anunsyo sa silid",
"family3": "{1} s'Family",
"help": "Tulong",
"rejected": "Tinanggihan",
"boxContributeTips": "Ang pamumuhunan ay ginawa na ngayon, mangyaring huwag mamuhunan muli",
"familyHelpTips": "(1) Kung mag-iinvest ka ng 50 coins, maa-unlock ang unang treasure chest kapag namuhunan ang 5 tao. Maaari kang mag-click para makatanggap ng 50 coins.(2)Maa-unlock ang pangalawang treasure chest kapag namuhunan ang 10 tao. Maaari kang makatanggap ng 50 barya.\n(3)Maa-unlock ang pangalawang treasure chest kapag namuhunan ang 20 tao. Makakatanggap ka ng 100 coin.\n(4) Kung ang kinakailangang bilang ng mga user na mag-claim ng treasure chest ay hindi maabot sa parehong araw, ang pag-usad ng treasure chest ay ire-reset sa susunod na araw.\n(5) Ang pag-unlad ng treasure chest ay magre-reset sa susunod na araw. Ang mga user na hindi pa na-claim ang kanilang mga treasure chest sa parehong araw ay dapat na i-claim ang mga ito sa tamang oras.\n(6) Oras ng pag-reset ng treasure chest: 00:00 oras ng Saudi.",
"bd": "BD",
"coupon": "Kupon",
"search": "Maghanap",
"get": "Kunin",
"inRocket": "Sa rocket",
"roomRocketHelpTips": "1. Ang pagpapadala ng mga regalo sa silid ay nagpapataas ng enerhiya ng rocket. *1 regalong gintong barya = 1 rocket energy point; pinapataas ng mga masuwerteng regalo ang rocket energy ng 4% ng halaga ng gintong barya ng regalo.\n2. Kapag ang enerhiya ng rocket ay ganap na na-charge, maaaring ilunsad ng silid ang rocket. Awtomatikong ipapamahagi ang mga reward pagkatapos ilunsad.\n3. Ang iba't ibang antas ng rocket ay nag-aalok ng iba't ibang mga gantimpala.\n4. Kapag naglunsad ang rocket, lahat ng user sa kuwarto ay maaaring mag-claim ng rocket reward.5. Nire-reset ang rocket energy sa 00:00 araw-araw.",
"roomRocketRecordAction": "Record",
"roomRocketRewardTop1": "Top1",
"roomRocketRewardSetOff": "Set off",
"roomRocketRewardInRoom": "Nasa room",
"roomRocketResetCountdown": "23 oras, 59 minuto, at 59 segundo bago mag-reset",
"roomRocketRecordRoom": "Room",
"roomRocketRecordReward": "Reward",
"roomRocketRecordLast35Days": "Ipakita lang ang records sa nakaraang 35 araw",
"couponRecord": "Talaan ng paggamit ng kupon",
"inRoom": "Sa Kwarto",
"searchCouponHint": "Search Coupon",
"giftCounter": "counter ng regalo",
"bDLeaderInviteYouToBecomeBDLeader": "Anyayahan kang maging isang BDLeader",
"wins": "panalo",
"inviteYouToBecomeHost": "Anyayahan kang maging isang host.",
"friends": "Mga kaibigan",
"deleteConversationTips": "Sigurado ka bang gusto mong tanggalin ang kasaysayan ng chat sa user na ito?",
"propMessagePrompt": "Prop mensahe prompt",
"inputUserId": "Ilagay ang User ID",
"fromLuckyGifts": "mula sa mga masuwerteng regalo",
"receive": "Tumanggap",
"checkInSuccessful": "Matagumpay ang pag-check-in",
"sginTips": "Makakakuha ka ng reward sa unang pagkakataon na mag-log in ka bawat araw. Kung maabala mo ang iyong pag-log in, ang reward ay kakalkulahin mula sa unang araw kung kailan ka muling nag-log in.",
"vipBadge": "VIP Badge",
"vipProfileFrame": "VIP Profile Frame",
"vipProfileCard": "VIP Profile Card",
"popular": "Sikat",
"recommend": "Magrekomenda",
"follow": "Sundin",
"history": "Kasaysayan",
"hotRooms": "Mga Mainit na Kwarto",
"viewMore": "Tingnan ang higit pa",
"noData": "Walang data",
"users": "Mga gumagamit",
"rooms": "Mga silid",
"coins": "mga barya",
"unread": "Hindi pa nababasa",
"read": "Basahin",
"image": "[Larawan]",
"video": "[Video]",
"sound": "[Tunog]",
"gift2": "[Regalo]",
"clickHereToStartChatting": "Sabihin mo.....",
"receivedAMessage": "[Nakatanggap ng mensahe]",
"confirmSwitchMicModelTips": "Kinukumpirma mo ba ang switch sa seating mode?",
"number": "Numero",
"album": "Album",
"camera": "Camera",
"system": "Sistema",
"notifcation": "Pansinin",
"inviteYouToBecomeAgent": "Anyayahan kang maging isang ahensya.",
"myMusic": "Aking Musika",
"add": "Idagdag",
"pullToLoadMore": "Hilahin para mag-load pa",
"loadingFailedClickToRetry": "Nabigo ang pag-load, i-click upang subukang muli",
"releaseToLoadMore": "I-release para mag-load pa",
"haveMyLimits": "---May limitasyon ako.---",
"music": "Musika",
"free": "Libre",
"charm": "Pang-regalo na alindog",
"start": "Magsimula",
"vipUseThisThemeTips": "Ang mga user lang na nakakatugon sa antas ng VlP ang makakagamit ng temang ito.",
"stop": "Tumigil ka",
"chats": "Mga chat",
"family": "Pamilya",
"refuse": "Tanggihan",
"agree": "Sumang-ayon",
"thisFeatureIsCurrentlyUnavailable": "Kasalukuyang hindi available ang feature na ito.",
"pleaseSelectTheRecipient": "Mangyaring piliin ang tatanggap.",
"searchMemberIdHint": "Pakilagay ang ID ng miyembro",
"unclaimedRedEnvelopes": "Ang mga hindi na-claim na pulang sobre ay ibinabalik sa loob ng 24 na oras.",
"redEnvelopeNotYetClaimed": "Hindi pa na-claim ang pulang sobre.",
"redEnvelopeAmount": "Halaga ng pulang sobre: {1} mga barya",
"sentARedEnvelope": "nagpadala ng pulang sobre.",
"theRedEnvelopeHasExpired": "Nag-expire na ang pulang sobre.",
"joinRequest": "Kahilingan sa Pagsali",
"welcomeToMyFamily": "Maligayang pagdating sa aking pamilya!",
"scrollToTheBottom": "Mag-scroll sa ibaba",
"gameRules": "Mga Panuntunan sa Laro:",
"charmGameRulesTips": "I-on ang dashboard para ipakita ang natanggap na gift coin ng lahat ng user sa mic,1 coin = 1 score (Lucky gift 1 coin = 0.04 score).",
"inputYourOldPassword": "Ipasok ang iyong lumang password",
"enterYourOldPassword": "Ilagay ang iyong lumang password",
"setYourPassword": "Itakda ang iyong password",
"enterYourNewPassword": "Ipasok ang iyong bagong password",
"confirmYourPassword": "Kumpirmahin ang iyong password",
"theTwoPasswordsDoNotMatch": "Hindi magkatugma ang dalawang password.",
"resetLoginPasswordtTips2": "Ang password ay dapat na 8-16 na mga character ang haba at dapat ay isang kumbinasyon ng mga titik at maliliit na letra at numero sa Ingles (hindi lamang mga numero)",
"resetLoginPassword": "I-reset ang Login Password",
"resetLoginPasswordtTips1": "Mag-log in gamit ang iyong user ID o vanity ID. Mas ligtas na mag-log in gamit ang isang Aslan account.",
"localMusic": "Lokal na Musika",
"setLoginPassword": "Itakda ang Login Password",
"confirmSwitchMicThemeTips": "Kinukumpirma mo ba ang paglipat ng istilo ng upuan?",
"pleaseUpgradeYourVipLevelFirst": "Paki-upgrade muna ang iyong VIP level.",
"micTheme": "Tema ng Mic",
"classicMic": "Klasikong {1} Mic",
"yesterday": "Kahapon {1}",
"monday": "Lunes {1}",
"tuesday": "Martes {1}",
"wednesday": "Miyerkules {1}",
"thursday": "Huwebes {1}",
"friday": "Biyernes {1}",
"saturday": "Sabado {1}",
"sunday": "Linggo {1}",
"acceptedYour": "Tinanggap ni {1} ang iyong",
"youAccepted": "Tinanggap mo ang {1}",
"openRedPackDialogTip": "Ang pulang sobre",
"micManagement": "Pamamahala ng Mic",
"vipChatBox": "VIP Chat Box",
"vipRoomCoverBorder": "Border ng VIP Room Cover",
"bdCenter": "BD Center",
"renewVip": "I-renew ang VIP",
"rechargeAgency": "Recharge Agency",
"adminCenter": "Sentro ng Trabaho",
"goldList": "Listahan ng Ginto",
"followList": "Subaybayan ang Listahan",
"fansList": "Listahan ng mga Tagahanga",
"daily": "Araw-araw",
"cp": "CP",
"female": "Babae",
"male": "Lalaki",
"identity": "Pagkakakilanlan",
"adjust": "Ayusin",
"warning": "Babala",
"screenshotTips": "Screenshot (Hanggang 3)",
"roomNotice": "Paunawa sa silid",
"roomTheme": "Tema ng kwarto",
"description": "Paglalarawan:",
"inputDesHint": "Mangyaring ilarawan ang problema nang mas detalyado hangga't maaari upang maunawaan at malutas namin ito.",
"roomProfilePicture": "Larawan sa profile ng kwarto",
"userProfilePicture": "Larawan sa profile ng user",
"userName": "User name",
"pleaseSelectTheTypeToProcess": "Mangyaring piliin ang uri upang iproseso:",
"roomEditing": "Pag-edit ng Kwarto",
"setAccount": "Itakda ang Account",
"userEditing": "Pag-edit ng User",
"enterTheUserId": "Ilagay ang userId",
"enterTheRoomId": "Ipasok ang roomId",
"deleteAccount": "Tanggalin ang Account",
"becomeAgent": "Maging ahente",
"enterNickname": "Ilagay ang Nickname",
"selectYourCountry": "Piliin ang iyong bansa",
"inviteCode": "Code ng Imbitasyon",
"magic": "Salamangka",
"list": "Listahan",
"walletBalance": "Balanse sa pitaka:",
"canOnlyBeShown": "*Maaari lang ipakita sa lahat ng user sa iyong lugar.",
"sendMessage": "Magpadala ng Mensahe",
"availableCountries": "Magagamit na mga Bansa:",
"currentBalance": "Kasalukuyang Balanse:",
"successfulTransaction": "{1} Matagumpay na Transaksyon",
"hasBeenACoinAgencyForDays": "Naging Coin Agency Sa loob ng {1} (na) Araw",
"luckGiftSpecialEffects": "Lucky gift animation effect",
"theVideoSizeCannotExceed": "Ang laki ng video ay hindi maaaring lumampas sa 50M",
"weekly": "Linggu-linggo",
"rechargeRecords": "Recharge Records",
"balance": "balanse:",
"appStore": "App Store",
"searchCountry": "Maghanap ng bansa...",
"googlePay": "Google Pay",
"biggestDiscount": "Pinakamalaking diskwento",
"officialRechargeAgent": "Opisyal na ahente ng recharge",
"customizedGiftRulesContent": "Paano makukuha ang aking na-customize na regalo:\n1. Tukuyin kung ang user ay karapat-dapat na makatanggap ng customized na regalo batay sa kanilang kasalukuyang antas ng kayamanan.\n(1) Kapag ang antas ng kayamanan ng user ay ≥35: Maaaring mag-upload ang user ng video para sa customized na regalo nang isang beses. Gagamitin namin ang kasalukuyang larawan sa profile ng user bilang larawan ng regalo at ang ibinigay na video bilang epekto ng regalo sa \"Customized.\" Magtatagal ang produksyon, at aabisuhan ka namin sa sandaling available na ito sa tindahan.\n(2) Kapag ang antas ng kayamanan ng user ay ≥45: Maaaring mag-upload ang user ng video para sa customized na regalo nang isang beses. Gagamitin namin ang kasalukuyang larawan sa profile ng user bilang larawan ng regalo at ang ibinigay na video bilang epekto ng regalo sa \"Customized.\" Magtatagal ang produksyon, at aabisuhan ka namin sa sandaling available na ito sa tindahan.\n2.Maaari kang lumahok sa mga partikular na aktibidad sa app at, pagkatapos matugunan ang mga pamantayan, makipag-ugnayan sa amin sa pamamagitan ng seksyong \"Mensahe\" → \"Makipag-ugnayan sa amin\". Magbigay ng mga screenshot ng aktibidad at ang video na gusto mong gamitin para sa customized na regalo. Gagamitin namin ang iyong kasalukuyang larawan sa profile bilang larawan ng regalo at ang ibinigay na video bilang epekto ng regalo, pagkatapos ay ilista ito sa ilalim ng \"Na-customize.\" Magtatagal ang produksyon, at aabisuhan ka namin sa sandaling available na ito sa tindahan.\nNa-customize na Panahon ng Validity ng Regalo at Paano Ito Palawigin:\nAng mga eksklusibong customized na regalo ay magiging available sa shelf para sa validity period na 30 araw. Upang bigyang-daan ang mga maimpluwensyang at nagbibigay-inspirasyong mga user na patuloy na tangkilikin ang bagong karanasang ito at ipakita ang kanilang personal na istilo, ang mga user na nagmamay-ari ng mga customized na regalo ay maaaring pahabain ang oras ng shelf ng lahat ng kanilang mga customized na regalo nang 30 araw sa pamamagitan ng muling pagsingil ng $500 sa anumang partikular na buwan.",
"customizedGiftRules": "Mga Pasadyang Panuntunan sa Regalo",
"rulesUpload": "Mga Panuntunan at Pag-upload",
"monthly": "Buwan-buwan",
"playLog": "Play Log:",
"selectACountry": "Pumili ng bansa:",
"message": "Mensahe",
"clearCache": "I-clear ang Cache",
"customized": "Customized",
"searchInputHint": "Ilagay ang account/room number",
"kickRoomTips": "Pinalayas ka na sa kwarto.",
"joinRoomTips": "sumali sa kwarto!",
"roomSetting": "Setting ng Kwarto",
"roomDetails": "Mga Detalye ng Kwarto",
"systemRoomTips": "Mangyaring panatilihin ang kagandahang-loob at paggalang. Anumang pornograpiko o bulgar na nilalaman ay mahigpit na ipinagbabawal sa Aslan. Ang anumang account na makikitang lumalabag ay permanenteng ipagbabawal. Hinihiling namin sa lahat ng mga gumagamit na sinasadyang sumunod sa mga alituntunin ng komunidad ng Aslan.",
"copiedToClipboard": "Kinopya sa clipboard",
"recharge": "Mag-recharge",
"receivedFromALuckyGift": "Natanggap mula sa isang masuwerteng regalo.",
"followedYou": "Sinundan ka",
"agentCenter": "Sentro ng Ahensya",
"areYouSureYouWantToClearLocalCache": "Sigurado ka bang gusto mong i-clear ang lokal na cache?",
"clearMessage": "I-clear ang mga mensahe sa screen",
"report": "Ulat",
"coins3": "mga barya",
"giftSpecialEffects": "Mga espesyal na epekto ng regalo",
"basicFeatures": "Mga Pangunahing Tampok",
"task": "Gawain",
"importantReminder": "Mahalagang Paalala",
"entryVehicleAnimation": "Entry vehicle animation(VIP3)",
"floatingAnimationInGlobal": "Lumulutang na animation sa global",
"entryVehicleAnimation2": "Maaaring gamitin ng mga user na may VlP3 o mas mataas na mga pribilehiyo ang function upang i-disable ang mga animation ng sasakyan.",
"dailyTasks": "Pang-araw-araw na Gawain",
"enterRoomConfirmTips": "Sigurado ka bang gusto mong pumasok sa kwarto?",
"followSucc": "Matagumpay na nasundan",
"goldListort": "Listahan ng Ginto",
"rechargeList": "Listahan ng Recharge",
"edit": "I-edit",
"swipeLeftOnTheFloatingScreenAreaToQuicklyCloseIt": "*Tip: Mag-swipe pakaliwa sa floating screen area para mabilis itong isara.",
"enterThisVoiceChatRoom": "Pumasok sa voice chat room na ito?",
"go": "Pumunta ka",
"done": "Tapos na",
"improvementTasks": "Mga Gawain sa Pagpapabuti",
"save": "I-save",
"kickPrevention": "Pag-iwas sa sipa",
"freeChatSpeak": "Libreng Chat at Magsalita",
"vipExclusiveVehicles": "VIP Eksklusibong Sasakyan",
"nickName": "Palayaw",
"buyVip": "Bumili ng VIP",
"gender": "Kasarian",
"unFollow": "I-unfollow",
"days": "Mga araw",
"permanent": "Permanente",
"yourVipWillExpire": "Mag-e-expire ang iyong VIP sa {1}",
"cantBuyVip": "Hindi maipagpatuloy ang pagbili",
"country": "Bansa",
"birthday": "Birthday",
"man": "Lalaki",
"woman": "Babae",
"apple": "Apple",
"google": "Google",
"idIcon": "Icon ng ID",
"inviteToBecomeAHost": "Mag-imbita upang maging isang host",
"currentLevelPrivilegesAndCostumes": "Kasalukuyang antas ng mga pribilehiyo at kasuotan: {1}",
"uploadGifAvatar": "Mag-upload ng GlF avatar(VIP2)",
"uploadProfilePicture": "Mag-upload ng Larawan sa Profile",
"permissionSettings": "Mga setting ng pahintulot",
"vipMicSoundWave": "VIP Mic Sound Wave",
"startVoiceParty": "Magsimula ng voice party!",
"enterRoomTips": "{1} Pumasok sa kwarto",
"roomName": "Pangalan ng Kwarto",
"roomMember": "Miyembro ng Kwarto",
"pleaseSelectYourCountry": "Mangyaring piliin ang iyong bansa.",
"pleaseSelectYourGender": "Mangyaring piliin ang iyong kasarian.",
"pleaseEnterNickname": "Mangyaring maglagay ng palayaw.",
"countryRegion": "Bansa at Rehiyon",
"dateOfBirth": "Petsa ng kapanganakan",
"mute": "I-mute",
"exit": "Lumabas",
"mysteriousInvisibility": "Mahiwagang invisibility",
"antiBlock": "Anti-Block",
"createFamilyForFree": "Lumikha ng Pamilya nang Libre",
"privateChat": "Pribadong Chat",
"vipBirthdayGift": "VIP Birthday Gift",
"storeDiscount": "I-off ang Diskwento sa Tindahan {1}.",
"membershipFreeChatSpeak": "Chat at Speak na walang membership",
"priorityRoomSorting": "Pag-uuri ng Priyoridad na Kwarto",
"userColoredID": "User Colored ID",
"vipEmoticon": "VIP Emoticon({1})",
"pleaseSelectaItem": "Mangyaring pumili ng isang item",
"areYouRureRoRecharge": "Sigurado ka bang magrecharge?",
"mInimize": "Panatilihin",
"everyone": "lahat",
"shop": "Mamili",
"roomOwner": "May-ari ng Kwarto",
"dailyTaskRewardBonus": "Bonus sa Pang-araw-araw na Gantimpala sa Gawain({1} XP)",
"userLevelXPBoost": "User Level XP Boost({1} XP)",
"pleaseUpgradeYourVipLevel": "Paki-upgrade ang iyong VIP level.",
"andAboveUsers": "{1} At Higit sa Mga User",
"privileges": "{1} Mga Pribilehiyo",
"basicPermissions": "Mga pangunahing pahintulot",
"hostCenter": "Host Center",
"allOnMicrophone": "Lahat sa mic",
"usersOnMicrophone": "Mga user sa mic",
"allInTheRoom": "Nasa kwarto lahat",
"send": "Ipadala",
"crop": "I-crop",
"goToUpgrade": "Pumunta sa pag-upgrade",
"exclusiveEmojiWillBeReleasedAfterBecoming": "Ilalabas ang eksklusibong emoji pagkatapos maging",
"preventBeingBlocked": "Pigilan ang Pag-block",
"enableRankIncognitoMode": "I-enable ang Rank Incognito Mode",
"avoidBeingKicked": "Iwasang Sipain",
"vipPrivilege": "Pribilehiyo ng VIP",
"finish": "Tapusin",
"takeTheMic": "Kunin ang mic",
"openTheMic": "Buksan ang mikropono",
"muteTheMic": "I-mute ang mikropono",
"unlockTheMic": "I-unlock ang mikropono",
"leavelTheMic": "Iwanan ang mikropono",
"lockTheMic": "I-lock ang mikropono",
"removeTheMic": "Alisin ang mikropono",
"inviteToTheMicrophone": "Mag-imbita sa mikropono",
"openUserProfleCard": "Buksan ang user profile card",
"obtain": "makuha",
"win2": "Manalo {1}",
"backTheRoom": "Kwarto sa likod",
"toConsume": "Para ubusin",
"howToUpgrade": "Paano mag-upgrade?",
"spendCoinsToGainExperiencePoints": "Gumastos ng mga barya upang makakuha ng mga puntos ng karanasan",
"higherLevelFancierAvatarFrame": "Mas mataas na antas, mas mahilig sa mga badge/avatar frame",
"medalAndAvatarFrameRewards": "Medal at avatar frame rewards",
"all": "Lahat",
"gift": "Regalo",
"chat": "Chat",
"owner": "May-ari",
"store": "Tindahan",
"admin": "Admin",
"member": "Miyembro",
"guest": "panauhin",
"submit": "Isumite",
"claim": "Claim",
"complete": "Kumpleto",
"shareTo": "Ibahagi sa",
"copyLink": "Kopyahin ang Link",
"faceBook": "Facebook",
"whatsApp": "Whatsapp",
"snapChat": "Snapchat",
"taskNamePersonalGameConsume": "Paggastos ng Laro",
"taskNameRoomNewMember": "Mga Bagong Kwarto",
"taskNameRoomOwnerSendRedPacket": "Nagpapadala ang May-ari ng Kwarto ng isang pulang pakete",
"taskNameRoomOwnerSendGiftUser": "Nagpapadala ng Regalo ang May-ari ng Kwarto",
"taskNameRoomMicUser120Min": "Mga miyembrong may 120+ minuto sa mikropono",
"taskNameRoomMicUser60Min": "Mga miyembrong may 60+ minuto sa mikropono",
"taskNameRoomMicUser30Min": "Mga miyembrong may 30+ minuto sa mic",
"taskNamePersonalSendGift": "Magpadala ng Regalo sa User",
"taskNameRoomOnlineUserCount": "Room online na mga miyembro",
"taskNameRoomOwnerInviteMic": "Mag-imbita ng miyembro sa Mic",
"taskNameRoomUserSendGiftGold": "Mga barya na iniregalo ng mga miyembro",
"taskNameRoomOwnerSendGiftGold": "Mga barya na niregalo ng may-ari ng kuwarto",
"taskNamePersonalMagicGiftGold": "Napanalunan ang mga Coins sa pamamagitan ng Pagpapadala ng Mga Magic Gift",
"taskNamePersonalLuckyGiftGold": "Napanalunan ang mga Coins sa pamamagitan ng Pagpapadala ng Mga Lucky Gift",
"taskNameRoomOwnerMicTime": "May-ari ng Kuwarto ay naglalagay ng mikropono sa silid",
"taskNamePersonalActiveInRoom": "Maging Aktibo sa mga Kwarto ng Iba",
"taskNamePersonalMicInRoom": "Sige na Mic",
"dailyCoinBonanzaRulesDetail": "1. Ang Pang-araw-araw na Mga Personal na Gawain at Pang-araw-araw na Mga Gawain sa May-ari ng Kwarto ay maaaring kumpletuhin nang isang beses bawat user bawat araw. Na-reset ang mga gawain sa 00:00:00 oras ng Saudi.\n2. Ang mga pang-araw-araw na personal na gawain ay maaari lamang kumpletuhin sa mga silid ng iba; ang mga gawain ng may-ari ng silid ay maaari lamang makumpleto sa iyong sariling silid.\n3. Ang mga gawain sa pagbibigay ng regalo ay binibilang lamang ang mga regalong ipinadala sa mga silid, hindi ang mga regalong ipinadala sa mga feed.\n4. Kung maraming account ang ginawa gamit ang parehong device o parehong SIM card sa anumang paraan, isang beses lang ma-claim ang mga reward para sa lahat ng gawain.",
"dailyCoinBonanzaRules": "Araw-araw na Coin Bonanza Rules",
"roomOwnerTasks": "Mga Gawain sa May-ari ng Kwarto",
"personalTasks": "Mga Personal na Gawain",
"noPromptsToday": "Walang mga prompt ngayon.",
"getPaidToRefer": "Mabayaran para Mag-refer",
"membershipFee": "Bayad sa Membership",
"membershipFeeTips1": "Mangyaring itakda ang membership fee para sa iyong kuwarto. Maaaring sumali ang mga user sa iyong kwarto sa pamamagitan ng pagbabayad ng bayad.",
"membershipFeeTips2": "Ang mga gintong kinakailangan para sa user upang maging miyembro ng silid. Ang may-ari ng kuwarto ay makakakuha ng 50% ng mga ginto.",
"freePrice": "Bayad:0-10000",
"touristsSendText": "Nagpadala ng text ang turista",
"touristsTakeToTheMic": "Dinala ng mga turista ang mikropono",
"theMembershipFee": "Ang membership fee",
"theModificationsMade": "Ang mga pagbabagong ginawa sa oras na ito ay hindi mase-save pagkatapos lumabas",
"viewFrame": "Tingnan ang Frame",
"enterRoomName": "Ilagay ang pangalan ng kwarto",
"headdress": "Mga frame",
"mountains": "Mga sasakyan",
"purchaseIsSuccessful": "Matagumpay ang pagbili",
"buy": "Bumili",
"followed": "Sinundan",
"follow2": "Sundan:{1}",
"fans2": "Mga Tagahanga:{1}",
"vistors2": "Mga Bisita:{1}",
"personal2": "Personal:",
"family2": "Pamilya:",
"conntinue": "Magpatuloy",
"confirmBuyTips": "Sigurado ka bang gusto mong bumili?",
"purchase": "Bumili",
"setRoomPassword": "Itakda ang password ng kwarto",
"inputRoomPassword": "Ipasok ang password ng kwarto",
"enter": "Pumasok",
"createDynamicSuccess": "Matagumpay na nagawa ang dynamic",
"deleteDynamicTips": "Sigurado ka bang gusto mong tanggalin ang dynamic na ito?",
"deleteCommentTips": "Sigurado ka bang gusto mong tanggalin ang komentong ito?",
"deleteSuccessful": "Matagumpay ang pagtanggal!",
"itemsLeft": "Naiwan ang mga item",
"password": "Password",
"replySucc": "Matagumpay ang tugon",
"comment": "Magkomento",
"showMore": "Magpakita ng higit pa",
"showLess": "Magpakita ng mas kaunti",
"enterPassword": "Ipasok ang Password",
"enterAccount": "Ipasok ang Account",
"logIn": "Mag-log In",
"saySomething": "Sabihin mo...",
"sayHi": "Say Hi..",
"pleaseChatFfriendly": "Mangyaring makipag-chat friendly",
"unLockTheRoom": "I-unlock Ang Kwarto",
"operationSuccessful": "Naging matagumpay ang operasyon.",
"adminByHomeowner": "ay itinakda bilang administrator ng may-ari ng bahay.",
"memberByHomeowner": "ay itinakda bilang mga miyembro ng may-ari ng bahay.",
"touristByHomeowner": "ay itinakda bilang turista ng may-ari ng bahay.",
"becomeHost": "Mag-apply Upang Maging Isang Host",
"superFans": "Mga sobrang tagahanga:",
"setUpAnIdentity": "Mag-set up ng pagkakakilanlan",
"kickedOutOfRoom": "Pinalayas ng kwarto",
"playGiftMusicAndDynamicMusic": "Magpatugtog ng regalong musika at dynamic na musika",
"knapsack": "Knapsack",
"bdLeader": "Pinuno ng BD",
"picture": "Larawan",
"theImageSizeCannotExceed": "Nabigo ang pag-upload: Dapat ay mas mababa sa 2MB ang file.",
"activity": "Aktibidad",
"alreadyAnAdministrator": "Isa nang administrator",
"alreadyAnMember": "miyembro na",
"alreadyAnTourist": "Isa nang turista",
"touristsCannotSendMessages": "Ang mga turista ay hindi maaaring magpadala ng mga mensahe",
"touristsAreNotAllowedToGoOnTheMic": "Ang mga turista ay hindi pinapayagang pumunta sa mikropono",
"lockTheRoom": "I-lock Ang Kwarto",
"special": "Espesyal",
"visitorList": "Listahan ng Bisita",
"successfulWear": "Matagumpay na pagsusuot",
"confirmUnUseTips": "Kinukumpirma mo bang tanggalin ito?",
"custom": "Custom",
"myItems": "Aking Mga Item",
"use": "Gamitin",
"unUse": "Walang gamit",
"renewal": "Pag-renew",
"wallet": "Wallet",
"profile": "Profile",
"giftwall": "Giftwall",
"announcement": "Anunsyo",
"blockedList": "Naka-block na listahan",
"country2": "Bansa:",
"sendTo": "Ipadala sa",
"medals": "Mga medalya",
"activityMedal": "Medalya ng Aktibidad",
"achievementMedal": "Medalya ng Achievement",
"credits": "Mga kredito: {1}",
"successfullyUnloaded": "Matagumpay na na-unload",
"expired": "Nag-expire na",
"day": "Araw",
"inUse": "Ginagamit",
"confirmUseTips": "Gusto mo bang kumpirmahin ang paggamit nito?",
"pleaseUploadUserAvatar": "Mangyaring mag-upload ng avatar.",
"joinMemberTips": "Kung ikaw ay isang bisita sa silid, hindi mo maaaring kunin ang mikropono.",
"giftGivingSuccessful": "Matagumpay ang pagbibigay ng regalo.",
"theAccountPasswordCannotBeEmpty": "Hindi maaaring walang laman ang account o password.",
"invitesYouToTheMicrophone": "Iniimbitahan ka ni {1} sa mikropono",
"english": "Ingles",
"chinese": "Intsik",
"arabic": "Arabic",
"darkMode": "Dark Mode",
"lightMode": "Light Mode",
"systemDefault": "System Default",
"pleaseGetOnTheMicFirst": "Mangyaring sumakay muna sa mic.",
"duration2": "Tagal:{1}"
}

777
assets/l10n/intl_hi.json Normal file
View File

@ -0,0 +1,777 @@
{
"signInWithGoogle": "Google से साइन इन करें",
"or": "या",
"signInWithYourAccount": "अपने खाते से साइन इन करें",
"signInWithApple": "Apple के साथ साइन इन करें",
"loginRepresentsAgreementTo": "लॉगिन सहमति का प्रतिनिधित्व करता है",
"termsofService": "सेवा की शर्तें",
"privaceyPolicy": "गोपनीयता नीति",
"tips": "सुझावों",
"dailyTasksTips": "नोट:कार्यों से निपटने के लिए तैयार हैं? उन्हें अपने पसंदीदा कमरों में खोजें।",
"searchNoDataTips": "वह कमरा या उपयोगकर्ता आईडी दर्ज करें जिसे आप खोजना चाहते हैं।",
"youHaveNotHadVIPYet": "आपने अभी तक वीआईपी नहीं लिया है, आएं और इसे आज़माएं",
"games": "खेल",
"vipAccelerating": "{1} त्वरित करना",
"mine": "मेरा",
"luckGiftRuleTips": "एक भाग्यशाली उपहार दें और 1000 गुना तक सोने का सिक्का इनाम जीतें! भाग्यशाली उपहार प्राप्त करने वाले उपयोगकर्ता निम्नलिखित लाभों का आनंद ले सकते हैं: \n(1) भाग्यशाली उपहार प्राप्त करने वाले उपयोगकर्ताओं के लिए: उपहार के मूल्य के आधार पर +4% आकर्षण अनुभव मूल्य। (2) यदि प्राप्तकर्ता एक मेज़बान है: उपहार के मूल्य के आधार पर +4% मेज़बान वेतन लक्ष्य मूल्य।",
"badge": "बिल्ला",
"vipRippleTheme": "वीआईपी रिपल थीम",
"glory": "वैभव",
"badgeHonor": "बिल्ला/महिमा",
"party": "दल",
"other": "अन्य",
"gifProfileUpload": "GIF प्रोफ़ाइल अपलोड करें",
"levelMedal": "लेवल मेडल",
"levelIcon": "स्तर चिह्न",
"maliciousHarassment": "दुर्भावनापूर्ण उत्पीड़न",
"event": "आयोजन",
"roomEdit": "कक्ष संपादित करें",
"cancelRoomPassword": "क्या आप वाकई कमरे का पासवर्ड हटाना चाहते हैं?",
"roomMemberFee": "कक्ष सदस्य शुल्क",
"roomTheme2": "कक्ष थीम",
"blockedList2": "अवरुद्ध सूची",
"roomPassword": "कमरे का पासवर्ड",
"numberOfMic": "माइक की संख्या",
"pleaseEnterContent": "कृपया सामग्री दर्ज करें",
"profilePhoto": "खाते की फोटो",
"aboutMe": "मेरे बारे में",
"myRoom": "मेरा कमरा",
"noHistoricalRecordsAvailable": "कोई ऐतिहासिक अभिलेख उपलब्ध नहीं है.",
"inviteNewUsersToEarnCoins": "सिक्के कमाने के लिए नए उपयोगकर्ताओं को आमंत्रित करें",
"crateMyRoom": "मेरा कमरा बनाओ",
"vipSpecialGiftTassel": "वीआईपी विशेष उपहार लटकन",
"vipEntranceEffect": "वीआईपी प्रवेश प्रभाव",
"casualInteraction": "आकस्मिक बातचीत",
"haveGamePlayingTips": "आपका एक गेम चल रहा है. कृपया वर्तमान गेम से बाहर निकलें. क्या आप निश्चित हैं आपकी बाहर निकलने की इच्छा है?",
"historicalTour": "ऐतिहासिक यात्रा",
"gameCenter": "खेल केंद्र",
"returnToVoiceChat": "वॉइस चैट पर लौटें?",
"exitGameMode": "गेम मोड से बाहर निकलें",
"enterTheRoom": "कमरे में प्रवेश करें",
"invite": "आमंत्रित करना",
"inviteGoRoomTips": "चाहे बारिश हो या धूप, हमेशा आपके लिए यहाँ। अंदर आएं और नमस्ते कहें!",
"confirmInviteThisUserToTheRoom": "इस उपयोगकर्ता (आईडी:{1}) को कमरे में आमंत्रित करने की पुष्टि करें?",
"honor": "सम्मान",
"clearCacheSuccessfully": "कैश सफलतापूर्वक साफ़ करें",
"sent": "भेजा",
"keep": "रखना",
"open": "खुला",
"deleteAccountTips2": "*यदि आप अपना मन बदलते हैं, तो आप सात दिनों में अपने चालू खाते में वापस लॉग इन कर सकते हैं, और हम स्वचालित रूप से आपका खाता बहाल कर देंगे। यदि सात दिनों के भीतर कोई बहाली नहीं होती है, तो खाता स्थायी रूप से हटा दिया जाएगा",
"deleteAccountTips": "इस खाते पर आपके पास पूर्ण प्रशासनिक अधिकार हैं. यदि आप खाता हटाने का इरादा रखते हैं, तो कृपया इस ऑपरेशन से जुड़े निम्नलिखित जोखिमों से अवगत रहें:\n1. एक बार खाता सफलतापूर्वक हटा दिए जाने के बाद, आप अपने वर्तमान खाते में लॉगिन नहीं कर पाएंगे। खाता हटाना एक स्थायी कार्रवाई है.\n2. अकाउंट सफलतापूर्वक डिलीट होने के बाद आप अकाउंट का कोई भी डेटा रिकवर नहीं कर पाएंगे। सभी जानकारी (कमरे, दोस्तों सहित), आभासी मुद्रा, उपहार और आभासी वस्तुएं स्थायी रूप से हटा दी जाएंगी और उन्हें पुनर्स्थापित नहीं किया जा सकेगा।\n3. कूलिंग-ऑफ अवधि: यदि आप खाते को पुनर्स्थापित नहीं करते हैं, तो आप खरीद पृष्ठ, निकासी पृष्ठ, या ऐप पर किसी अन्य पृष्ठ तक पहुंचने में असमर्थ होंगे।\n4.कूलिंग-ऑफ अवधि के दौरान या खाता हटाए जाने के बाद, प्रोफ़ाइल पृष्ठ इंगित करेगा कि इसे हटा दिया गया है। आपके खाते को दूसरों द्वारा खोजे जाने या उस तक पहुंचने से बचाने के लिए, आपकी व्यक्तिगत जानकारी दैनिक कार्यों से संबंधित सिस्टम से हटा दी जाएगी। जब खाता हटाने में राष्ट्रीय सुरक्षा, नागरिक या आपराधिक कार्यवाही, या तीसरे पक्ष के वैध अधिकारों और हितों की सुरक्षा शामिल होती है, तो अधिकारी उपयोगकर्ता के खाता हटाने के अनुरोध को अस्वीकार करने का अधिकार सुरक्षित रखता है।\nयदि आप निश्चित हैं कि आप अपने चालू खाते से सभी व्यक्तिगत डेटा हटाना चाहते हैं, तो कृपया \"खाता हटाएं\" पर क्लिक करें।",
"accountDeletionNotice": "खाता हटाने की सूचना:",
"thisUserHasBeenBlacklisted": "इस उपयोगकर्ता को काली सूची में डाल दिया गया है.",
"trend": "रुझान",
"like": "पसंद",
"more": "अधिक",
"discard": "खारिज करना",
"catchFirstComment": "पहली टिप्पणी पकड़ें",
"reply": "जवाब",
"posting": "प्रविष्टि",
"dynamic": "गतिशील",
"multiple": "विभिन्न",
"successfullyAddedToTheDynamicBlacklist": "डायनामिक ब्लैकलिस्ट में सफलतापूर्वक जोड़ा गया!",
"successfullyRemovedFromTheBlacklist": "काली सूची से सफलतापूर्वक हटाया गया!",
"successfullyRemovedFromTheDynamicBlacklist": "डायनामिक ब्लैकलिस्ट से सफलतापूर्वक हटा दिया गया!",
"successfullyAddedToTheBlacklist": "ब्लैकलिस्ट में सफलतापूर्वक जोड़ा गया!",
"youAreCurrentlyCPRelationshipPleaseDissolve": "आप वर्तमान में CP संबंध में हैं.\nकृपया पहले इसे भंग करें.",
"areYouSureToCancelBlacklist": "क्या आप निश्चित रूप से काली सूची रद्द करना चाहते हैं?",
"areYouSureYouWantToBlockThisUser": "क्या वाकई आपको इस प्रयोगकर्ता को ब्लॉक करना है?",
"areYouSureYouWantToDynamicBlockThisUser": "क्या आप निश्चित रूप से डायनामिक ब्लैकलिस्ट जोड़ना चाहते हैं?",
"removeFromBlacklist": "काली सूची से हटाएँ",
"moveToBlacklist": "काली सूची में ले जाएँ",
"userBlacklist": "उपयोगकर्ता ब्लैकलिस्ट",
"specialEffectsManagement": "विशेष प्रभाव प्रबंधन",
"wishingYouHappinessEveryDay": "आपके लिए हर दिन खुशियों की कामना करता हूं।",
"newMessage": "नया सन्देश",
"createRoomSuccsess": "कमरे को सफल बनाएं!",
"contactUs": "मुझसे संपर्क करें",
"systemAnnouncementTips1": "धोखाधड़ी से बचें:",
"systemAnnouncementTips": "जानकारी को केवल आधिकारिक चैनलों के माध्यम से सत्यापित करें। कभी भी तृतीय-पक्ष सॉफ़्टवेयर डाउनलोड न करें, व्यक्तिगत डेटा साझा न करें, या बाहरी अनुरोधों के आधार पर धन हस्तांतरित न करें। आधिकारिक स्टाफ आईडी केवल 10000, 10003, और 10086 हैं। किसी भी संदेह के लिए, रुकें और रिपोर्ट करें",
"systemAnnouncement": "सिस्टम घोषणा",
"doNotClickUnfamiliarTips": "अपरिचित लिंक पर क्लिक न करें, क्योंकि वे आपकी व्यक्तिगत जानकारी को उजागर कर सकते हैं। कभी भी अपनी आईडी या बैंक कार्ड का विवरण किसी के साथ साझा न करें।",
"atTag": "@टैग",
"sayHi2": "नमस्ते कहे",
"canSendMsgTips": "निजी संदेश भेजने से पहले दोनों पक्षों को एक-दूसरे का अनुसरण करना होगा।",
"msgSendRedEnvelopeTips": "*लाल लिफाफे पर 10% सेवा शुल्क लिया जाएगा, और प्राप्तकर्ताओं को लाल लिफाफे के मूल्य का केवल 90% प्राप्त होगा। प्रेषक का धन स्तर स्तर 10 से अधिक होना चाहिए।",
"leavFamilyTips": "क्या आप वाकई अपना वर्तमान कबीला छोड़ना चाहते हैं? किसी कबीले में पुनः शामिल होने के लिए आपको 1 दिन प्रतीक्षा करनी होगी।",
"leavingTheFamily": "परिवार को छोड़कर",
"familyNotifcations": "पारिवारिक सूचनाएं",
"familyNews": "पारिवारिक समाचार",
"reapply": "पुन: लागू",
"cancelRequestFamilyMsg": "परिवार 【{1} के परिवार】 में शामिल होने का आपका अनुरोध समीक्षाधीन है, क्या आप वाकई अनुरोध रद्द करना चाहते हैं?",
"cancelRequest": "अनुरोध को रद्द करें",
"pending": "लंबित",
"familyAnnouncement": "पारिवारिक घोषणा",
"enterFamilyAnnouncement": "कृपया पारिवारिक घोषणा दर्ज करें।",
"disbandTheFamily": "परिवार को तोड़ दो",
"editFamily": "परिवार संपादित करें",
"supporter": "समर्थक",
"rechargeSuccessful": "रिचार्ज सफल",
"transactionReceived": "लेनदेन प्राप्त हुआ",
"createFamilySuccess": "पारिवारिक सफलता बनाएँ.",
"numberOfSign": "चिह्न की संख्या: {1}",
"hostWeeklyRank": "मेजबान साप्ताहिक रैंक",
"supporterWeeklyRank": "समर्थक साप्ताहिक रैंक",
"memberList": "सदस्य सूची",
"treasureChest": "खजाने की मेज",
"xxfamily": "{1} का परिवार",
"applicationRecord": "आवेदन रिकार्ड",
"createFamily": "परिवार बनाएँ",
"familyName": "पारिवारिक नाम",
"createAFamily": "एक परिवार बनाएं",
"searchFamilyIdHint": "कृपया परिवार के मालिक की आईडी दर्ज करें",
"enterFamilyInfo": "कृपया अपने परिवार का संक्षिप्त परिचय दें!",
"enterFamilyName": "कृपया अपना पारिवारिक नाम दर्ज करें.",
"familyInfo": "पारिवारिक परिचय",
"joinFamily": "एक परिवार में शामिल हों",
"appUpdateTip": "ऐप का नया संस्करण ({1}) है, कृपया जाकर इसे डाउनलोड करें?",
"ownerIncomeCoins": "मालिक की आय:{1} सिक्के",
"game": "खेल",
"skip2": "छोडना",
"coins4": "सिक्के",
"currentVip": "वर्तमान वीआईपी",
"weekStart": "सप्ताह शुरू",
"forMoreRewardsPleaseCheckTheTaskCenter": "अधिक पुरस्कारों के लिए कृपया कार्य केंद्र देखें",
"kingQuuen": "राजा-रानी",
"ramadan": "रमजान",
"updateNow": "अभी अद्यतन करें",
"allGames": "सभी खेल",
"fishClass": "मछली वर्ग",
"greedyClass": "लालची वर्ग",
"raceSeries": "दौड़ शृंखला",
"slotsClass": "स्लॉट क्लास",
"others": "अन्य",
"hotGames": "गर्म खेल",
"chatBox": "चैट बॉक्स",
"termsOfServicePrivacyPolicyTips": "जारी रखकर आप सेवा की शर्तों और गोपनीयता नीति से सहमत हैं",
"and": "और",
"pleaseSelectTheTypeContent": "कृपया आपत्तिजनक सामग्री का प्रकार चुनें.",
"wearHonor": "सम्मान धारण करें",
"illegalInformation": "अवैध जानकारी",
"inappropriateContent": "अनुपयुक्त सामग्री",
"personalAttack": "व्यक्तिगत हमला",
"confirm": "पुष्टि करना",
"spam": "अवांछित ईमेल",
"countdownMinutes": "उलटी गिनती मिनट:",
"number2": "संख्या:",
"fraud": "धोखा",
"received": "प्राप्त",
"currentProgress": "वर्तमान प्रगति",
"currentStage": "वर्तमान चरण:{1}",
"roomReward2": "कमरे का इनाम:{1}",
"roomReward": "कक्ष पुरस्कार",
"expirationTime": "समाप्ति समय",
"ownerSendTheRedEnvelope": "मालिक इनाम के सिक्के भेजता है।",
"rewardCoins": "इनाम के सिक्के:{1} सिक्के",
"lastWeekProgress": "पिछले सप्ताह की प्रगति",
"redEnvelopeTips2": "*यदि समय सीमा के भीतर लाल बैग का दावा नहीं किया जाता है, तो शेष सिक्के लाल बैग भेजने वाले उपयोगकर्ता को वापस कर दिए जाएंगे।",
"goToRecharge": "रिचार्ज पर जाएं",
"deleteAccount2": "खाता हटाएं({1}s)",
"areYouSureYouWantToDeleteYourAccount": "क्या आप इस खाते को हटाने के लिए सुनिश्चित हैं?",
"insufhcientGoldsGoToRecharge": "अपर्याप्त सोने, अभी रिचार्ज करें!",
"coins2": "{1}सिक्के",
"remainingNumberTips": "उपलब्ध की शेष संख्या:({1}/{2})",
"collectionTimeTips": "संग्रहण समय:{1}({2}/{3})",
"sendARedEnvelope": "लाल लिफाफा भेजें",
"sendRedPackConfirmTips": "क्या आप वाकई लाल पैकेट भेजना चाहते हैं?",
"redEnvelopeSendingRecords": "लाल लिफाफा भेजने वाले रिकॉर्ड:",
"redEnvelope": "लाल लिफाफा",
"redEnvelopeRecTips2": "सभी लाल लिफाफों पर दावा किया गया है।",
"redEnvelopeRecTips3": "लाल लिफाफा संग्रहण का समय समाप्त हो गया है!",
"openTheTreasureChest": "एक लाल बैग भेजा!",
"redEnvelopeRecTips1": "अर्जित सिक्के आपके बटुए में जमा कर दिए गए हैं।",
"redEnvelopeTips1": "सिक्के:",
"roomTools": "कक्ष उपकरण:",
"entertainment": "मनोरंजन:",
"reportSucc": "रिपोर्ट सफल",
"pornography": "कामोद्दीपक चित्र",
"reportInputTips": "कृपया समस्या का यथासंभव विस्तार से वर्णन करें ताकि हम इसे समझ सकें और इसका समाधान कर सकें।",
"cancel": "रद्द करना",
"join": "जोड़ना",
"items": "सामान",
"vistors": "आगंतुकों",
"fans": "प्रशंसक",
"balanceNotEnough": "अपर्याप्त सोने के सिक्के का संतुलन। क्या आप टॉप अप करना चाहते हैं?",
"skip": "छोड़ें {1}",
"wearMedal": "मेडल पहनें",
"activityHonor": "गतिविधि सम्मान",
"achievementHonor": "उपलब्धि सम्मान",
"youDontHaveAnyHonorYet": "आपके पास अभी तक कोई सम्मान नहीं है.",
"letGoToWatch": "चलो देखने चलते हैं!",
"launchedARocket": "एक रॉकेट लॉन्च किया",
"sendUserId": "उपयोगकर्ता आईडी भेजें:{1}",
"giveUpIdentity": "पहचान छोड़ो",
"leaveRoomIdentityTips": "क्या आप वाकई कमरे की पहचान छोड़ना चाहते हैं?",
"joinMemberTips2": "क्या आप सदस्य के रूप में कक्ष में शामिल होने की पुष्टि करना चाहते हैं?",
"sureUnfollowThisRoom": "क्या आप निश्चित रूप से इस कमरे को अनफ़ॉलो करना चाहते हैं?",
"welcomeMessage": "हमारे एप्लिकेशन, {नाम} में आपका स्वागत है!",
"settings": "सेटिंग्स",
"account": "खाता",
"common": "सामान्य",
"delete": "मिटाना",
"copy": "प्रतिलिपि",
"bio": "जैव",
"useCoupontips": "क्या आप वाकई कूपन का उपयोग करना चाहते हैं?",
"searchUserId": "उपयोगकर्ता की आईडी खोजें",
"sendUser": "उपयोगकर्ता भेजें",
"hobby": "शौक",
"sendCoupontips": "क्या आप वाकई इस उपयोगकर्ता को यह कूपन भेजना चाहते हैं?",
"youDontHaveAnyCouponsYet": "आपके पास अभी तक कोई कूपन नहीं है.",
"recall": "याद करना",
"youHaventFollowed": "आपने किसी भी कमरे का अनुसरण नहीं किया है",
"deleteFromMyDevice": "मेरे डिवाइस से हटाएँ",
"deleteOnAllDevices": "सभी डिवाइस पर हटाएँ",
"messageHasBeenRecalled": "इस संदेश को वापस ले लिया गया है",
"recallThisMessage": "यह संदेश याद है?",
"language": "भाषा",
"feedback": "प्रतिक्रिया",
"signedin": "साइन इन किया गया",
"receiveSucc": "सफलतापूर्वक दावा किया गया",
"about": "के बारे में",
"aboutUs": "हमारे बारे में",
"theme": "विषय",
"wealthLevel": "धन स्तर",
"userLevel": "उपयोगकर्ता स्तर",
"goToUpload": "अपलोड पर जाएं",
"logout": "लॉग आउट",
"luck": "भाग्य",
"level": "स्तर",
"vip": "वीआईपी",
"vip1": "VIP1",
"vip2": "VIP2",
"vip3": "VIP3",
"vip4": "VIP4",
"vip5": "VIP5",
"vip6": "वीआईपी6",
"themeGoToUploadTips": "1.अपलोड सफल होने के 24 घंटे के भीतर समीक्षा करें।\n2. समीक्षा विफल होने पर सभी सिक्के वापस कर दिए जाएंगे।",
"home": "घर",
"explore": "अन्वेषण करना",
"me": "मुझे",
"socialPrivilege": "सामाजिक विशेषाधिकार",
"information": "जानकारी",
"myPhoto": "मेरी फोटो",
"cpRequest": "सीपी अनुरोध",
"areYouSureYouWantToSpend3": "*यदि दूसरा पक्ष सीपी आमंत्रण को अस्वीकार करता है, तो आपके सिक्के आपके बटुए में वापस कर दिए जाएंगे।",
"areYouSureYouWantToSpend": "क्या आप वाकई खर्च करना चाहते हैं?",
"areYouSureYouWantToSpend2": "इस उपयोगकर्ता को सीपी आमंत्रण भेजने के लिए?",
"cpSexTips": "एक ही लिंग के जोड़े नहीं बनाए जा सकते.",
"underReview": "समीक्षा के अंतर्गत",
"doYouWantToDeleteIt": "क्या आप इसे हटाना चाहते हैं?",
"chooseFromAblum": "एब्लम में से चुनें",
"spaceBackground": "अंतरिक्ष पृष्ठभूमि",
"editProfile": "प्रोफ़ाइल संपादित करें",
"sendTheCpRequest": "सीपी अनुरोध भेजें",
"addCp": "सीपी जोड़ें",
"partWays": "भाग तरीके",
"reconcile": "सुलह करो",
"separated": "अलग किए",
"areYouSureYouWantToSpend5": "{1}तुम्हारे सामने भावना का इज़हार किया; यदि आप स्वीकार करते हैं, तो आप युगल बन जायेंगे।",
"areYouSureYouWantToSpend6": "{1} आपके साथ वापस आना चाहता है। यदि आप समाधान करने का निर्णय लेते हैं, तो आपका पिछला सारा डेटा पुनर्स्थापित कर दिया जाएगा।",
"reconcileInvitationTips": "*यदि दूसरा पक्ष सीपी आमंत्रण को अस्वीकार करता है, तो आपके सिक्के आपके बटुए में वापस कर दिए जाएंगे।",
"reconcileInvitation": "समाधान आमंत्रण",
"areYouSureYouWantToSpend4": "इस उपयोगकर्ता को समाधान आमंत्रण भेजने के लिए?",
"partWaysTips": "*यदि जोड़े में से एक साथी अलग होने का विकल्प चुनता है, तो 7 दिन की कूलिंग-ऑफ अवधि होगी। इस समय के दौरान, दोनों पक्ष सुलह करना चुन सकते हैं, और सुलह होने पर सभी डेटा बहाल कर दिया जाएगा। यदि 7-दिन की अवधि के अंत तक कोई सुलह नहीं चुनी जाती है, तो जोड़े का डेटा साफ़ कर दिया जाएगा।",
"areYouSureYouWantToPartWaysWithYourCP": "क्या आप वाकई अपने सीपी से अलग होना चाहते हैं?",
"timeSpentTogether": "एक साथ बिताया गया समय: {1} दिन",
"firstDay": "पहला दिन:{1}",
"numberOfMyCPs": "मेरे सीपी की संख्या:({1}/{2})",
"props": "रंगमंच की सामग्री",
"medal": "पदक",
"win": "जीतना",
"dice": "पासा",
"rps": "आर पी एस",
"areYouSureToCancelDynamicBlacklist": "क्या आप निश्चित रूप से डायनामिक ब्लैकलिस्ट रद्द करना चाहते हैं?",
"blockUserDynamic": "उपयोगकर्ता डायनामिक को ब्लॉक करें",
"unblockUserDynamic": "उपयोगकर्ता डायनामिक को अनब्लॉक करें",
"operationFail": "ऑपरेशन फेल हो गया.",
"likedYourComment": "आपकी टिप्पणी पसंद आयी.",
"likedYourDynamic": "आपका डायनामिक पसंद आया.",
"doYouWantToKeepTheDraft": "क्या आप ड्राफ्ट रखना चाहते हैं?",
"cantSendDynamicTips": "आपको वर्तमान में डायनेमिक्स पोस्ट करने से अवरुद्ध कर दिया गया है।",
"operationsAreTooFrequent": "ऑपरेशन बहुत बार होते हैं",
"luckNumber": "भाग्यांक",
"relationShip": "संबंध",
"couple": "युगल {1}:",
"couple2": "युगल",
"reject": "अस्वीकार करना",
"cpList": "सीपी सूची",
"sound2": "आवाज़",
"hot": "गर्म",
"selectCountry": "देश चुनें",
"giftEffect": "उपहार प्रभाव",
"winFloat": "फ्लोट जीतो",
"giftVibration": "भाग्यशाली उपहार प्रभाव",
"accept": "स्वीकार करना",
"noMatchedCP": "कोई मिलान सीपी नहीं",
"inviteYouToBecomeBD": "आपको बीडी बनने के लिए आमंत्रित करें।",
"adminInviteRechargeAgent": "आपको रिचार्ज एजेंट बनने के लिए आमंत्रित करें।",
"confirmAcceptTheInvitation": "निमंत्रण स्वीकार करने की पुष्टि करें?",
"confirmDeclineTheInvitation": "निमंत्रण की अस्वीकृति की पुष्टि करें?",
"host": "मेज़बान",
"following": "अगले",
"agent": "एजेंसी",
"approved": "अनुमत",
"agreeJoinFamilyTips": "क्या आप इस उपयोगकर्ता को परिवार में शामिल होने की अनुमति देते हैं?",
"refuseJoinFamilyTips": "क्या आपको उपयोगकर्ता को परिवार में शामिल होने से मना कर देना चाहिए?",
"onlineUsers": "ऑनलाइन उपयोगकर्ता({1}/{2}):",
"applyToJoin": "जुड़ने के लिए आवेदन करें",
"supporterList": "समर्थकों की सूची",
"hostList": "मेज़बान सूची",
"upToAdmins": "{1} एडमिन तक",
"upToMembers": "अधिकतम {1} सदस्य",
"levelPrivileges": "स्तरीय विशेषाधिकार",
"familyLevel": "पारिवारिक स्तर",
"kickOutOfFamily": "परिवार से बाहर निकालो",
"disbandTheFamilyTips": "क्या आप वाकई परिवार को ख़त्म करना चाहते हैं?",
"setAsFamilyAdmin": "पारिवारिक व्यवस्थापक के रूप में सेट करें",
"cancelFamilyAdmin": "परिवार व्यवस्थापक रद्द करें",
"kickFamilyUserTips": "क्या आप वाकई इस उपयोगकर्ता को परिवार से बाहर निकालना चाहते हैं?",
"familyMember2": "परिवार के सदस्य({1}/{2}):",
"familyMember3": "परिवार का सदस्य({1}):",
"familyAdmin2": "पारिवारिक व्यवस्थापक({1}/{2}):",
"familyOwner2": "परिवार स्वामी:",
"ra": "आरए",
"roomAnnouncement": "कमरे की घोषणा",
"family3": "{1} परिवार",
"help": "मदद",
"rejected": "अस्वीकार कर दिया",
"boxContributeTips": "आज निवेश पहले ही किया जा चुका है, कृपया दोबारा निवेश न करें",
"familyHelpTips": "(1) यदि आप 50 सिक्के निवेश करते हैं, तो पहला खजाना तब खुल जाएगा जब 5 लोग निवेश करेंगे। आप 50 सिक्के प्राप्त करने के लिए क्लिक कर सकते हैं।(2)जब 10 लोग निवेश करेंगे तो दूसरा खज़ाना खुल जाएगा। आप 50 सिक्के प्राप्त कर सकते हैं.\n(3) दूसरा खज़ाना तब खुलेगा जब 20 लोग निवेश करेंगे। आप 100 सिक्के प्राप्त कर सकते हैं.\n(4) यदि खजाना पेटी पर दावा करने के लिए उपयोगकर्ताओं की आवश्यक संख्या उसी दिन नहीं पहुंचती है, तो खजाना पेटी की प्रगति अगले दिन रीसेट कर दी जाएगी।\n(5)खजाना संदूक की प्रगति अगले दिन रीसेट हो जाएगी। जिन उपयोगकर्ताओं ने अभी तक उसी दिन अपने खजाने का दावा नहीं किया है, उन्हें समय पर दावा करना चाहिए।\n(6)खजाना संदूक रीसेट समय: 00:00 सऊदी समय।",
"bd": "बी.डी",
"coupon": "कूपन",
"search": "खोज",
"get": "पाना",
"inRocket": "रॉकेट में",
"roomRocketHelpTips": "1. कमरे में उपहार भेजने से रॉकेट ऊर्जा बढ़ती है। *1 सोने का सिक्का उपहार = 1 रॉकेट ऊर्जा बिंदु; भाग्यशाली उपहार रॉकेट ऊर्जा को उपहार के सोने के सिक्के के मूल्य से 4% तक बढ़ा देते हैं।\n2. एक बार रॉकेट ऊर्जा पूरी तरह चार्ज हो जाने पर, कक्ष रॉकेट लॉन्च कर सकता है। लॉन्च के बाद पुरस्कार स्वचालित रूप से वितरित किए जाएंगे।\n3. विभिन्न रॉकेट स्तर अलग-अलग पुरस्कार प्रदान करते हैं।\n4. जब रॉकेट लॉन्च होता है, तो कमरे में मौजूद सभी उपयोगकर्ता रॉकेट इनाम का दावा कर सकते हैं।5. रॉकेट ऊर्जा हर दिन 00:00 बजे रीसेट की जाती है।",
"roomRocketRecordAction": "रिकॉर्ड",
"roomRocketRewardTop1": "Top1",
"roomRocketRewardSetOff": "लॉन्च",
"roomRocketRewardInRoom": "कमरे में",
"roomRocketResetCountdown": "रीसेट होने में 23 घंटे, 59 मिनट और 59 सेकंड",
"roomRocketRecordRoom": "कमरा",
"roomRocketRecordReward": "इनाम",
"roomRocketRecordLast35Days": "केवल पिछले 35 दिनों के रिकॉर्ड दिखाएं",
"couponRecord": "कूपन उपयोग रिकॉर्ड",
"inRoom": "कमरे में",
"searchCouponHint": "कूपन खोजें",
"giftCounter": "उपहार काउंटर",
"bDLeaderInviteYouToBecomeBDLeader": "आपको बीडीलीडर बनने के लिए आमंत्रित करें",
"wins": "जीत",
"inviteYouToBecomeHost": "आपको मेज़बान बनने के लिए आमंत्रित करें.",
"friends": "दोस्त",
"deleteConversationTips": "क्या आप वाकई इस उपयोगकर्ता के साथ चैट इतिहास को हटाना चाहते हैं?",
"propMessagePrompt": "प्रोप संदेश शीघ्र",
"inputUserId": "उपयोगकर्ता आईडी दर्ज करें",
"fromLuckyGifts": "भाग्यशाली उपहारों से",
"receive": "प्राप्त करें",
"checkInSuccessful": "चेक-इन सफल",
"sginTips": "हर दिन पहली बार लॉग इन करने पर आपको इनाम मिलेगा। यदि आप अपना लॉगिन बाधित करते हैं, तो इनाम की गणना आपके दोबारा लॉग इन करने पर पहले दिन से की जाएगी।",
"vipBadge": "वीआईपी बैज",
"vipProfileFrame": "वीआईपी प्रोफ़ाइल फ़्रेम",
"vipProfileCard": "वीआईपी प्रोफ़ाइल कार्ड",
"popular": "लोकप्रिय",
"recommend": "अनुशंसा करना",
"follow": "अनुसरण करना",
"history": "इतिहास",
"hotRooms": "गर्म कमरे",
"viewMore": "और देखें",
"noData": "कोई डेटा नहीं",
"users": "उपयोगकर्ताओं",
"rooms": "कमरा",
"coins": "सिक्के",
"unread": "अपठित ग",
"read": "पढ़ना",
"image": "[छवि]",
"video": "[वीडियो]",
"sound": "[आवाज़]",
"gift2": "[उपहार]",
"clickHereToStartChatting": "कुछ कहो.....",
"receivedAMessage": "[एक संदेश प्राप्त हुआ]",
"confirmSwitchMicModelTips": "क्या आप सीटिंग मोड में स्विच की पुष्टि करते हैं?",
"number": "संख्या",
"album": "एल्बम",
"camera": "कैमरा",
"system": "प्रणाली",
"notifcation": "सूचना",
"inviteYouToBecomeAgent": "आपको एक एजेंसी बनने के लिए आमंत्रित करें.",
"myMusic": "मेरे संगीत",
"add": "जोड़ना",
"pullToLoadMore": "अधिक लोड करने के लिए खींचें",
"loadingFailedClickToRetry": "लोडिंग विफल, पुनः प्रयास करने के लिए क्लिक करें",
"releaseToLoadMore": "अधिक लोड करने के लिए रिलीज़ करें",
"haveMyLimits": "---मेरी अपनी सीमाएँ हैं।---",
"music": "संगीत",
"free": "मुक्त",
"charm": "उपहार आकर्षण",
"start": "शुरू",
"vipUseThisThemeTips": "केवल वीएलपी स्तर को पूरा करने वाले उपयोगकर्ता ही इस थीम का उपयोग कर सकते हैं।",
"stop": "रुकना",
"chats": "चैट",
"family": "परिवार",
"refuse": "अस्वीकार करना",
"agree": "सहमत",
"thisFeatureIsCurrentlyUnavailable": "यह विशेषता इस समय उपलब्ध नहीं है।",
"pleaseSelectTheRecipient": "कृपया प्राप्तकर्ता का चयन करें.",
"searchMemberIdHint": "कृपया सदस्य की आईडी दर्ज करें",
"unclaimedRedEnvelopes": "लावारिस लाल लिफाफे 24 घंटे में वापस कर दिए जाते हैं।",
"redEnvelopeNotYetClaimed": "लाल लिफाफे पर अभी तक दावा नहीं किया गया है।",
"redEnvelopeAmount": "लाल लिफ़ाफ़ा राशि: {1} सिक्के",
"sentARedEnvelope": "एक लाल लिफाफा भेजा.",
"theRedEnvelopeHasExpired": "लाल लिफाफा समाप्त हो गया है.",
"joinRequest": "शामिल होने का अनुरोध",
"welcomeToMyFamily": "मेरे परिवार में आपका स्वागत है!",
"scrollToTheBottom": "नीचे तक स्क्रॉल करें",
"gameRules": "खेल के नियम:",
"charmGameRulesTips": "सभी उपयोगकर्ताओं के प्राप्त उपहार सिक्के को माइक पर दिखाने के लिए डैशबोर्ड चालू करें, 1 सिक्का = 1 अंक (भाग्यशाली उपहार 1 सिक्का = 0.04 अंक)।",
"inputYourOldPassword": "अपना पुराना पासवर्ड डालें",
"enterYourOldPassword": "अपना पुराना पासवर्ड डालें",
"setYourPassword": "अपना पासवर्ड सेट करें",
"enterYourNewPassword": "अपना नया पासवर्ड दर्ज करें",
"confirmYourPassword": "अपने पासवर्ड की पुष्टि करें",
"theTwoPasswordsDoNotMatch": "दो पासवर्ड मेल नहीं खाता हैं।",
"resetLoginPasswordtTips2": "पासवर्ड 8-16 अक्षर लंबा होना चाहिए और इसमें अंग्रेजी के अपरकेस और लोअरकेस अक्षरों और संख्याओं का संयोजन होना चाहिए (सिर्फ संख्याएं नहीं)",
"resetLoginPassword": "लॉगिन पासवर्ड रीसेट करें",
"resetLoginPasswordtTips1": "अपनी यूजर आईडी या वैनिटी आईडी से लॉग इन करें। असलान खाते से लॉग इन करना अधिक सुरक्षित है।",
"localMusic": "स्थानीय संगीत",
"setLoginPassword": "लॉगिन पासवर्ड सेट करें",
"confirmSwitchMicThemeTips": "क्या आप सीट शैली के बदलाव की पुष्टि करते हैं?",
"pleaseUpgradeYourVipLevelFirst": "कृपया पहले अपना वीआईपी स्तर अपग्रेड करें।",
"micTheme": "माइक थीम",
"classicMic": "क्लासिक {1} माइक",
"yesterday": "कल {1}",
"monday": "सोमवार {1}",
"tuesday": "मंगलवार {1}",
"wednesday": "बुधवार {1}",
"thursday": "गुरुवार {1}",
"friday": "शुक्रवार {1}",
"saturday": "शनिवार {1}",
"sunday": "रविवार {1}",
"acceptedYour": "{1} ने आपका स्वीकार कर लिया",
"youAccepted": "आपने स्वीकार कर लिया है {1}",
"openRedPackDialogTip": "लाल लिफाफा",
"micManagement": "माइक प्रबंधन",
"vipChatBox": "वीआईपी चैट बॉक्स",
"vipRoomCoverBorder": "वीआईपी रूम कवर बॉर्डर",
"bdCenter": "बीडी सेंटर",
"renewVip": "वीआईपी नवीनीकृत करें",
"rechargeAgency": "रिचार्ज एजेंसी",
"adminCenter": "कार्य केंद्र",
"goldList": "सोने की सूची",
"followList": "सूची का पालन करें",
"fansList": "प्रशंसकों की सूची",
"daily": "दैनिक",
"cp": "सीपी",
"female": "महिला",
"male": "पुरुष",
"identity": "पहचान",
"adjust": "समायोजित करना",
"warning": "चेतावनी",
"screenshotTips": "स्क्रीनशॉट (3 तक)",
"roomNotice": "कक्ष सूचना",
"roomTheme": "कक्ष विषय",
"description": "विवरण:",
"inputDesHint": "कृपया समस्या का यथासंभव विस्तार से वर्णन करें ताकि हम इसे समझ सकें और इसका समाधान कर सकें।",
"roomProfilePicture": "कमरे का प्रोफ़ाइल चित्र",
"userProfilePicture": "उपयोगकर्ता प्रोफ़ाइल चित्र",
"userName": "उपयोगकर्ता नाम",
"pleaseSelectTheTypeToProcess": "कृपया संसाधित करने के लिए प्रकार का चयन करें:",
"roomEditing": "कक्ष संपादन",
"setAccount": "खाता सेट करें",
"userEditing": "उपयोगकर्ता संपादन",
"enterTheUserId": "उपयोगकर्ता आईडी दर्ज करें",
"enterTheRoomId": "रूम आईडी दर्ज करें",
"deleteAccount": "खाता हटा दो",
"becomeAgent": "एक एजेंट बनें",
"enterNickname": "उपनाम दर्ज करें",
"selectYourCountry": "अपने देश का चयन करॊ",
"inviteCode": "कोड आमंत्रित",
"magic": "जादू",
"list": "सूची",
"walletBalance": "बटुआ शेष:",
"canOnlyBeShown": "*केवल आपके क्षेत्र के सभी उपयोगकर्ताओं को दिखाया जा सकता है।",
"sendMessage": "मेसेज भेजें",
"availableCountries": "उपलब्ध देश:",
"currentBalance": "वर्तमान शेष:",
"successfulTransaction": "{1} सफल लेनदेन",
"hasBeenACoinAgencyForDays": "{1} दिनों से एक सिक्का एजेंसी रही है",
"luckGiftSpecialEffects": "भाग्यशाली उपहार एनीमेशन प्रभाव",
"theVideoSizeCannotExceed": "वीडियो का आकार 50M से अधिक नहीं हो सकता",
"weekly": "साप्ताहिक",
"rechargeRecords": "पुनर्भरण रिकार्ड",
"balance": "संतुलन:",
"appStore": "ऐप स्टोर",
"searchCountry": "देश खोजें...",
"googlePay": "गूगल पे",
"biggestDiscount": "सबसे बड़ी छूट",
"officialRechargeAgent": "आधिकारिक रिचार्ज एजेंट",
"customizedGiftRulesContent": "मेरा अनुकूलित उपहार कैसे प्राप्त करें:\n1. निर्धारित करें कि क्या उपयोगकर्ता अपने वर्तमान धन स्तर के आधार पर अनुकूलित उपहार प्राप्त करने के योग्य है।\n(1) जब उपयोगकर्ता का धन स्तर ≥35 है: उपयोगकर्ता अनुकूलित उपहार के लिए एक बार वीडियो अपलोड कर सकता है। हम उपयोगकर्ता की वर्तमान प्रोफ़ाइल तस्वीर को उपहार छवि के रूप में और प्रदान किए गए वीडियो को \"अनुकूलित\" पर उपहार प्रभाव के रूप में उपयोग करेंगे। उत्पादन में कुछ समय लगेगा, और जैसे ही यह स्टोर में उपलब्ध होगा हम आपको सूचित करेंगे।\n(2) जब उपयोगकर्ता का धन स्तर 45 हो: उपयोगकर्ता अनुकूलित उपहार के लिए एक बार वीडियो अपलोड कर सकता है। हम उपयोगकर्ता की वर्तमान प्रोफ़ाइल तस्वीर को उपहार छवि के रूप में और प्रदान किए गए वीडियो को \"अनुकूलित\" पर उपहार प्रभाव के रूप में उपयोग करेंगे। उत्पादन में कुछ समय लगेगा, और जैसे ही यह स्टोर में उपलब्ध होगा हम आपको सूचित करेंगे।\n2.आप ऐप पर विशिष्ट गतिविधियों में भाग ले सकते हैं और मानदंडों को पूरा करने के बाद, \"संदेश\" → \"हमसे संपर्क करें\" अनुभाग के माध्यम से हमसे संपर्क करें। गतिविधि और वीडियो के स्क्रीनशॉट प्रदान करें जिन्हें आप अनुकूलित उपहार के लिए उपयोग करना चाहते हैं। हम आपकी वर्तमान प्रोफ़ाइल तस्वीर को उपहार छवि के रूप में और दिए गए वीडियो को उपहार प्रभाव के रूप में उपयोग करेंगे, फिर इसे \"अनुकूलित\" के अंतर्गत सूचीबद्ध करेंगे। उत्पादन में कुछ समय लगेगा, और जैसे ही यह स्टोर में उपलब्ध होगा हम आपको सूचित करेंगे।\nअनुकूलित उपहार वैधता अवधि और इसे कैसे बढ़ाएं:\nविशेष अनुकूलित उपहार 30 दिनों की वैधता अवधि के लिए शेल्फ पर उपलब्ध होंगे। प्रभावशाली और प्रेरक उपयोगकर्ताओं को इस नए अनुभव का आनंद लेने और अपनी व्यक्तिगत शैली का प्रदर्शन करने में सक्षम बनाने के लिए, जिन उपयोगकर्ताओं के पास अनुकूलित उपहार हैं, वे किसी भी महीने में $500 का रिचार्ज करके अपने सभी अनुकूलित उपहारों के शेल्फ समय को 30 दिनों तक बढ़ा सकते हैं।",
"customizedGiftRules": "अनुकूलित उपहार नियम",
"rulesUpload": "नियम एवं अपलोड",
"monthly": "महीने के",
"playLog": "प्ले लॉग:",
"selectACountry": "कोई देश चुनें:",
"message": "संदेश",
"clearCache": "कैश को साफ़ करें",
"customized": "स्वनिर्धारित",
"searchInputHint": "खाता/कमरा नंबर दर्ज करें",
"kickRoomTips": "तुम्हें कमरे से बाहर निकाल दिया गया है.",
"joinRoomTips": "सम्मिलित कक्ष!",
"roomSetting": "कक्ष सेटिंग",
"roomDetails": "कमरे का विवरण",
"systemRoomTips": "कृपया शिष्टाचार और सम्मान बनाए रखें। असलान पर कोई भी अश्लील या अश्लील सामग्री सख्त वर्जित है। उल्लंघन में पाया गया कोई भी खाता स्थायी रूप से प्रतिबंधित कर दिया जाएगा। हम सभी उपयोगकर्ताओं से अनुरोध करते हैं कि वे सचेत रूप से असलान के सामुदायिक दिशानिर्देशों का पालन करें।",
"copiedToClipboard": "क्लिपबोर्ड पर कॉपी किया गया",
"recharge": "फिर से दाम लगाना",
"receivedFromALuckyGift": "एक भाग्यशाली उपहार से प्राप्त हुआ.",
"followedYou": "तुम्हारा पीछा",
"agentCenter": "एजेंसी केंद्र",
"areYouSureYouWantToClearLocalCache": "क्या आप वाकई स्थानीय कैश साफ़ करना चाहते हैं?",
"clearMessage": "स्क्रीन संदेश साफ़ करें",
"report": "प्रतिवेदन",
"coins3": "सिक्के",
"giftSpecialEffects": "विशेष प्रभाव उपहार दें",
"basicFeatures": "बुनियादी सुविधाएँ",
"task": "काम",
"importantReminder": "महत्वपूर्ण अनुस्मारक",
"entryVehicleAnimation": "प्रवेश वाहन एनीमेशन(VIP3)",
"floatingAnimationInGlobal": "ग्लोबल में फ़्लोटिंग एनीमेशन",
"entryVehicleAnimation2": "VlP3 या उच्चतर विशेषाधिकार वाले उपयोगकर्ता वाहन एनिमेशन को अक्षम करने के लिए फ़ंक्शन का उपयोग कर सकते हैं।",
"dailyTasks": "दैनिक कार्यों",
"enterRoomConfirmTips": "क्या आप वाकई कमरे में प्रवेश करना चाहते हैं?",
"followSucc": "सफलतापूर्वक पालन किया गया",
"goldListort": "सोने की सूची",
"rechargeList": "रिचार्ज सूची",
"edit": "संपादन करना",
"swipeLeftOnTheFloatingScreenAreaToQuicklyCloseIt": "*टिप: फ़्लोटिंग स्क्रीन क्षेत्र को तुरंत बंद करने के लिए उस पर बाईं ओर स्वाइप करें।",
"enterThisVoiceChatRoom": "इस ध्वनि चैट रूम में प्रवेश करें?",
"go": "जाना",
"done": "हो गया",
"improvementTasks": "सुधार कार्य",
"save": "बचाना",
"kickPrevention": "किक रोकथाम",
"freeChatSpeak": "मुफ़्त चैट करें और बोलें",
"vipExclusiveVehicles": "वीआईपी विशिष्ट वाहन",
"nickName": "उपनाम",
"buyVip": "वीआईपी खरीदें",
"gender": "लिंग",
"unFollow": "करें",
"days": "दिन",
"permanent": "स्थायी",
"yourVipWillExpire": "आपका वीआईपी {1} को समाप्त हो जाएगा",
"cantBuyVip": "खरीदारी जारी रखने में असमर्थ",
"country": "देश",
"birthday": "जन्मदिन",
"man": "आदमी",
"woman": "महिला",
"apple": "सेब",
"google": "गूगल",
"idIcon": "आईडी चिह्न",
"inviteToBecomeAHost": "मेज़बान बनने के लिए आमंत्रित करें",
"currentLevelPrivilegesAndCostumes": "वर्तमान स्तर के विशेषाधिकार और वेशभूषा: {1}",
"uploadGifAvatar": "GlF अवतार अपलोड करें(VIP2)",
"uploadProfilePicture": "प्रोफ़ाइल चित्र अपलोड करें",
"permissionSettings": "अनुमति सेटिंग्स",
"vipMicSoundWave": "वीआईपी माइक ध्वनि तरंग",
"startVoiceParty": "एक आवाज पार्टी शुरू करें!",
"enterRoomTips": "{1} कमरे में प्रवेश करें",
"roomName": "कमरे का नाम",
"roomMember": "कक्ष सदस्य",
"pleaseSelectYourCountry": "कृपया अपना देश चुनें.",
"pleaseSelectYourGender": "कृपया अपना लिंग चुनें.",
"pleaseEnterNickname": "कृपया एक निकनाम दर्ज करें।",
"countryRegion": "देश एवं क्षेत्र",
"dateOfBirth": "जन्मतिथि",
"mute": "आवाज़ बंद करना",
"exit": "बाहर निकलना",
"mysteriousInvisibility": "रहस्यमय अदृश्यता",
"antiBlock": "विरोधी अवरोध",
"createFamilyForFree": "मुफ़्त में परिवार बनाएं",
"privateChat": "निजी चैट",
"vipBirthdayGift": "वीआईपी जन्मदिन उपहार",
"storeDiscount": "स्टोर डिस्काउंट {1} बंद",
"membershipFreeChatSpeak": "सदस्यता-मुक्त चैट करें और बोलें",
"priorityRoomSorting": "प्राथमिकता कक्ष छँटाई",
"userColoredID": "उपयोगकर्ता रंगीन आईडी",
"vipEmoticon": "वीआईपी इमोटिकॉन({1})",
"pleaseSelectaItem": "कृपया एक आइटम चुनें",
"areYouRureRoRecharge": "क्या आप निश्चित रूप से रिचार्ज करेंगे?",
"mInimize": "रखना",
"everyone": "सब लोग",
"shop": "दुकान",
"roomOwner": "कमरे का मालिक",
"dailyTaskRewardBonus": "दैनिक कार्य पुरस्कार बोनस({1} XP)",
"userLevelXPBoost": "उपयोगकर्ता स्तर XP बूस्ट({1} XP)",
"pleaseUpgradeYourVipLevel": "कृपया अपना वीआईपी स्तर अपग्रेड करें।",
"andAboveUsers": "{1} और उससे ऊपर के उपयोगकर्ता",
"privileges": "{1} विशेषाधिकार",
"basicPermissions": "बुनियादी अनुमतियाँ",
"hostCenter": "मेज़बान केंद्र",
"allOnMicrophone": "सब माइक पर",
"usersOnMicrophone": "माइक पर यूजर्स",
"allInTheRoom": "सभी कमरे में",
"send": "भेजना",
"crop": "काटना",
"goToUpgrade": "अपग्रेड करने के लिए जाएं",
"exclusiveEmojiWillBeReleasedAfterBecoming": "एक्सक्लूसिव इमोजी बनने के बाद जारी किया जाएगा",
"preventBeingBlocked": "अवरुद्ध होने से रोकें",
"enableRankIncognitoMode": "रैंक गुप्त मोड सक्षम करें",
"avoidBeingKicked": "लात खाने से बचें",
"vipPrivilege": "वीआईपी विशेषाधिकार",
"finish": "खत्म करना",
"takeTheMic": "माइक ले लो",
"openTheMic": "माइक खोलो",
"muteTheMic": "माइक म्यूट करें",
"unlockTheMic": "माइक अनलॉक करें",
"leavelTheMic": "माइक छोड़ो",
"lockTheMic": "माइक लॉक करें",
"removeTheMic": "माइक हटाओ",
"inviteToTheMicrophone": "माइक्रोफ़ोन पर आमंत्रित करें",
"openUserProfleCard": "उपयोगकर्ता प्रोफ़ाइल कार्ड खोलें",
"obtain": "प्राप्त",
"win2": "जीतो {1}",
"backTheRoom": "पीछे का कमरा",
"toConsume": "उपभोग करना",
"howToUpgrade": "अपग्रेड कैसे करें?",
"spendCoinsToGainExperiencePoints": "अनुभव अंक प्राप्त करने के लिए सिक्के खर्च करें",
"higherLevelFancierAvatarFrame": "उच्च स्तर, शानदार बैज/अवतार फ्रेम",
"medalAndAvatarFrameRewards": "पदक और अवतार फ़्रेम पुरस्कार",
"all": "सभी",
"gift": "उपहार",
"chat": "बात करना",
"owner": "मालिक",
"store": "इकट्ठा करना",
"admin": "व्यवस्थापक",
"member": "सदस्य",
"guest": "अतिथि",
"submit": "जमा करना",
"claim": "दावा",
"complete": "पूरा",
"shareTo": "को साझा करें",
"copyLink": "लिंक की प्रतिलिपि करें",
"faceBook": "फेसबुक",
"whatsApp": "Whatsapp",
"snapChat": "Snapchat",
"taskNamePersonalGameConsume": "खेल खर्च",
"taskNameRoomNewMember": "नये कक्ष सदस्य",
"taskNameRoomOwnerSendRedPacket": "कमरे का मालिक एक लाल पैकेट भेजता है",
"taskNameRoomOwnerSendGiftUser": "कमरे का मालिक उपहार भेजता है",
"taskNameRoomMicUser120Min": "माइक पर 120+ मिनट वाले सदस्य",
"taskNameRoomMicUser60Min": "माइक पर 60+ मिनट वाले सदस्य",
"taskNameRoomMicUser30Min": "माइक पर 30+ मिनट वाले सदस्य",
"taskNamePersonalSendGift": "उपयोगकर्ता को उपहार भेजें",
"taskNameRoomOnlineUserCount": "कक्ष ऑनलाइन सदस्य",
"taskNameRoomOwnerInviteMic": "सदस्य को माइक पर आमंत्रित करें",
"taskNameRoomUserSendGiftGold": "सदस्यों द्वारा उपहार में दिये गये सिक्के",
"taskNameRoomOwnerSendGiftGold": "कमरे के मालिक द्वारा उपहार में दिए गए सिक्के",
"taskNamePersonalMagicGiftGold": "जादुई उपहार भेजकर जीते गए सिक्के",
"taskNamePersonalLuckyGiftGold": "भाग्यशाली उपहार भेजकर जीते गए सिक्के",
"taskNameRoomOwnerMicTime": "रूम मालिक कमरे में माइक पर चला जाता है",
"taskNamePersonalActiveInRoom": "दूसरों के कमरों में सक्रिय रहें",
"taskNamePersonalMicInRoom": "माइक पर जाओ",
"dailyCoinBonanzaRulesDetail": "1. दैनिक व्यक्तिगत कार्य और दैनिक कक्ष स्वामी कार्य प्रति उपयोगकर्ता प्रति दिन एक बार पूरा किया जा सकता है। कार्य सऊदी समय 00:00:00 पर रीसेट हो गए।\n2.दैनिक व्यक्तिगत कार्य केवल दूसरों के कमरे में ही पूरे किये जा सकते हैं; कमरे के मालिक के कार्य केवल आपके अपने कमरे में ही पूरे किए जा सकते हैं।\n3. उपहार देने के कार्य केवल कमरों में भेजे गए उपहारों की गणना करते हैं, फ़ीड पर भेजे गए उपहारों की नहीं।\n4. यदि किसी भी तरह से एक ही डिवाइस या एक ही सिम कार्ड का उपयोग करके कई खाते बनाए जाते हैं, तो सभी कार्यों के लिए पुरस्कार का दावा केवल एक बार किया जा सकता है।",
"dailyCoinBonanzaRules": "दैनिक सिक्का बोनान्ज़ा नियम",
"roomOwnerTasks": "कक्ष स्वामी कार्य",
"personalTasks": "व्यक्तिगत कार्य",
"noPromptsToday": "आज कोई संकेत नहीं.",
"getPaidToRefer": "रेफर करने के लिए भुगतान प्राप्त करें",
"membershipFee": "मेम्बरशिप फीस",
"membershipFeeTips1": "कृपया अपने कमरे के लिए सदस्यता शुल्क निर्धारित करें। उपयोगकर्ता शुल्क का भुगतान करके आपके कमरे से जुड़ सकते हैं।",
"membershipFeeTips2": "उपयोगकर्ता को कमरे का सदस्य बनने के लिए आवश्यक सोना। कमरे के मालिक को 50% सोना मिलेगा।",
"freePrice": "शुल्क: 0-10000",
"touristsSendText": "पर्यटक पाठ भेजें",
"touristsTakeToTheMic": "पर्यटक माइक पर आते हैं",
"theMembershipFee": "सदस्यता शुल्क",
"theModificationsMade": "इस बार किए गए संशोधन बाहर निकलने के बाद सहेजे नहीं जाएंगे",
"viewFrame": "फ़्रेम देखें",
"enterRoomName": "कमरे का नाम दर्ज करें",
"headdress": "फ्रेम्स",
"mountains": "वाहनों",
"purchaseIsSuccessful": "खरीदारी सफल है",
"buy": "खरीदना",
"followed": "पालन ​​किया",
"follow2": "अनुसरण करें:{1}",
"fans2": "प्रशंसक:{1}",
"vistors2": "आगंतुक:{1}",
"personal2": "निजी:",
"family2": "परिवार:",
"conntinue": "जारी रखें",
"confirmBuyTips": "क्या आप वाकई खरीदना चाहते हैं?",
"purchase": "खरीदना",
"setRoomPassword": "कमरे का पासवर्ड सेट करें",
"inputRoomPassword": "इनपुट रूम पासवर्ड",
"enter": "प्रवेश करना",
"createDynamicSuccess": "डायनामिक सफलतापूर्वक बनाया गया",
"deleteDynamicTips": "क्या आप वाकई इस डायनामिक को हटाना चाहते हैं?",
"deleteCommentTips": "क्या आप इस कमेंट को मिटाने के बारे में पक्के हैं?",
"deleteSuccessful": "हटाना सफल!",
"itemsLeft": "आइटम बचे हैं",
"password": "पासवर्ड",
"replySucc": "उत्तर सफल",
"comment": "टिप्पणी",
"showMore": "और दिखाएँ",
"showLess": "कम दिखाओ",
"enterPassword": "पास वर्ड दर्ज करें",
"enterAccount": "खाता दर्ज करें",
"logIn": "लॉग इन करें",
"saySomething": "कुछ कहो...",
"sayHi": "नमस्ते कहे..",
"pleaseChatFfriendly": "कृपया दोस्ताना बातचीत करें",
"unLockTheRoom": "कमरे का ताला खोलो",
"operationSuccessful": "ऑपरेशन सफल रहा.",
"adminByHomeowner": "गृहस्वामी द्वारा प्रशासक के रूप में स्थापित किया गया है।",
"memberByHomeowner": "गृहस्वामी द्वारा सदस्यों के रूप में निर्धारित किया जाता है।",
"touristByHomeowner": "गृहस्वामी द्वारा एक पर्यटक के रूप में स्थापित किया गया है।",
"becomeHost": "मेज़बान बनने के लिए आवेदन करें",
"superFans": "सुपर प्रशंसक:",
"setUpAnIdentity": "एक पहचान स्थापित करें",
"kickedOutOfRoom": "कमरे से बाहर निकाल दिया",
"playGiftMusicAndDynamicMusic": "उपहार संगीत और गतिशील संगीत बजाएं",
"knapsack": "बस्ता",
"bdLeader": "बीडी नेता",
"picture": "चित्र",
"theImageSizeCannotExceed": "अपलोड विफल: फ़ाइल 2एमबी से कम होनी चाहिए।",
"activity": "गतिविधि",
"alreadyAnAdministrator": "पहले से ही प्रशासक है",
"alreadyAnMember": "पहले से ही सदस्य है",
"alreadyAnTourist": "पहले से ही एक पर्यटक",
"touristsCannotSendMessages": "पर्यटक संदेश नहीं भेज सकते",
"touristsAreNotAllowedToGoOnTheMic": "पर्यटकों को माइक पर जाने की इजाजत नहीं है",
"lockTheRoom": "कमरा बंद करो",
"special": "विशेष",
"visitorList": "आगंतुक सूची",
"successfulWear": "सफल पहनावा",
"confirmUnUseTips": "क्या आप इसे हटाने की पुष्टि करते हैं?",
"custom": "रिवाज़",
"myItems": "मेरे आइटम",
"use": "उपयोग",
"unUse": "उपयोग न करें",
"renewal": "नवीनीकरण",
"wallet": "बटुआ",
"profile": "प्रोफ़ाइल",
"giftwall": "गिफ्टवॉल",
"announcement": "घोषणा",
"blockedList": "अवरुद्ध सूची",
"country2": "देश:",
"sendTo": "भेजना",
"medals": "पदक",
"activityMedal": "गतिविधि पदक",
"achievementMedal": "उपलब्धि पदक",
"credits": "श्रेय: {1}",
"successfullyUnloaded": "सफलतापूर्वक अनलोड किया गया",
"expired": "खत्म हो चुका",
"day": "दिन",
"inUse": "उपयोग में",
"confirmUseTips": "क्या आप इसके उपयोग की पुष्टि करना चाहते हैं?",
"pleaseUploadUserAvatar": "कृपया एक अवतार अपलोड करें.",
"joinMemberTips": "यदि आप कमरे में आगंतुक हैं, तो आप माइक्रोफ़ोन नहीं ले जा सकते।",
"giftGivingSuccessful": "उपहार देना सफल.",
"theAccountPasswordCannotBeEmpty": "खाता या पासवर्ड खाली नहीं हो सकता.",
"invitesYouToTheMicrophone": "{1} आपको माइक्रोफ़ोन पर आमंत्रित करता है",
"english": "अंग्रेज़ी",
"chinese": "चीनी",
"arabic": "अरबी",
"darkMode": "डार्क मोड",
"lightMode": "लाइट मोड",
"systemDefault": "प्रणालीगत चूक",
"pleaseGetOnTheMicFirst": "कृपया पहले माइक पर आएँ।",
"duration2": "अवधि:{1}"
}

777
assets/l10n/intl_id.json Normal file
View File

@ -0,0 +1,777 @@
{
"signInWithGoogle": "Masuk dengan Google",
"or": "Atau",
"signInWithYourAccount": "Masuk dengan akun Anda",
"signInWithApple": "Masuk dengan Apple",
"loginRepresentsAgreementTo": "Login mewakili persetujuan untuk",
"termsofService": "Persyaratan layanan",
"privaceyPolicy": "Kebijakan Privasi",
"tips": "Kiat",
"dailyTasksTips": "Catatan: Siap untuk menangani tugas? Temukan di kamar favorit Anda.",
"searchNoDataTips": "Masukkan ruangan atau ID pengguna yang ingin Anda cari.",
"youHaveNotHadVIPYet": "Anda belum memiliki VIP, datang dan coba",
"games": "Pertandingan",
"vipAccelerating": "{1} Mempercepat",
"mine": "Milikku",
"luckGiftRuleTips": "Berikan hadiah keberuntungan dan menangkan hadiah koin emas hingga 1000 kali lipat! Pengguna yang menerima hadiah keberuntungan dapat menikmati keuntungan berikut: \n(1) Bagi pengguna yang menerima hadiah keberuntungan: +4% nilai pengalaman pesona berdasarkan nilai hadiah. (2) Jika penerima adalah tuan rumah: +4% nilai target gaji tuan rumah berdasarkan nilai hadiah.",
"badge": "Lencana",
"vipRippleTheme": "Tema Riak VIP",
"glory": "Kejayaan",
"badgeHonor": "Lencana/Kemuliaan",
"party": "Berpesta",
"other": "Lainnya",
"gifProfileUpload": "Unggah Profil GIF",
"levelMedal": "Medali Tingkat",
"levelIcon": "Ikon Tingkat",
"maliciousHarassment": "Pelecehan yang berbahaya",
"event": "Peristiwa",
"roomEdit": "Pengeditan Ruangan",
"cancelRoomPassword": "Apakah Anda yakin ingin menghapus kata sandi ruangan?",
"roomMemberFee": "Biaya Anggota Kamar",
"roomTheme2": "Tema Kamar",
"blockedList2": "Daftar yang Diblokir",
"roomPassword": "Kata Sandi Kamar",
"numberOfMic": "Jumlah Mikrofon",
"pleaseEnterContent": "Silakan masukkan konten",
"profilePhoto": "Foto Profil",
"aboutMe": "Tentang saya",
"myRoom": "Kamarku",
"noHistoricalRecordsAvailable": "Tidak ada catatan sejarah yang tersedia.",
"inviteNewUsersToEarnCoins": "Undang pengguna baru untuk mendapatkan koin",
"crateMyRoom": "Buat kamarku",
"vipSpecialGiftTassel": "Rumbai hadiah spesial VIP",
"vipEntranceEffect": "Efek Masuk VIP",
"casualInteraction": "Interaksi Santai",
"haveGamePlayingTips": "Anda memiliki permainan yang sedang berlangsung. Silakan keluar dari permainan saat ini. Apakah Anda yakin ingin keluar?",
"historicalTour": "Wisata Sejarah",
"gameCenter": "Pusat Permainan",
"returnToVoiceChat": "Kembali ke obrolan suara?",
"exitGameMode": "Keluar dari Mode Permainan",
"enterTheRoom": "Masuki ruangan",
"invite": "Mengundang",
"inviteGoRoomTips": "Selalu di sini untukmu, hujan atau cerah. Mampirlah dan sapa!",
"confirmInviteThisUserToTheRoom": "Konfirmasikan undangan pengguna ini (ID:{1}) ke ruang?",
"honor": "Menghormati",
"clearCacheSuccessfully": "Hapus cache berhasil",
"sent": "Terkirim",
"keep": "Menyimpan",
"open": "Membuka",
"deleteAccountTips2": "*Jika Anda berubah pikiran, Anda dapat masuk kembali ke akun Anda saat ini dalam tujuh hari, dan kami akan memulihkan akun Anda secara otomatis. Jika tidak ada pemulihan yang terjadi dalam waktu tujuh hari, akun akan dihapus secara permanen",
"deleteAccountTips": "Anda memiliki hak administratif penuh atas akun ini. Jika Anda bermaksud menghapus akun, harap perhatikan risiko berikut yang terkait dengan operasi ini:\n1.Setelah akun berhasil dihapus, Anda tidak dapat lagi masuk ke akun Anda saat ini. Penghapusan akun merupakan tindakan permanen.\n2. Setelah akun berhasil dihapus, Anda tidak akan dapat memulihkan data akun apa pun. Semua informasi (termasuk kamar, teman), mata uang virtual, hadiah, dan barang virtual akan dihapus secara permanen dan tidak dapat dipulihkan.\n3. Masa tunggu: Jika Anda tidak memulihkan akun, Anda tidak akan dapat mengakses halaman pembelian, halaman penarikan, atau halaman lainnya di aplikasi.\n4.Selama masa tunggu atau setelah akun dihapus, halaman profil akan menunjukkan bahwa akun tersebut telah dihapus. Untuk melindungi akun Anda agar tidak dicari atau diakses oleh orang lain, informasi pribadi Anda akan dihapus dari sistem yang terkait dengan fungsi sehari-hari. Jika penghapusan akun melibatkan keamanan nasional, proses perdata atau pidana, atau perlindungan hak dan kepentingan sah pihak ketiga, pejabat berhak menolak permintaan penghapusan akun pengguna.\nJika Anda yakin ingin menghapus semua data pribadi dari akun Anda saat ini, silakan klik \"Hapus Akun\".",
"accountDeletionNotice": "Pemberitahuan Penghapusan Akun:",
"thisUserHasBeenBlacklisted": "Pengguna ini telah masuk daftar hitam.",
"trend": "Kecenderungan",
"like": "Menyukai",
"more": "Lagi",
"discard": "Membuang",
"catchFirstComment": "Tangkap komentar pertama",
"reply": "Membalas",
"posting": "Posting",
"dynamic": "Dinamis",
"multiple": "Banyak",
"successfullyAddedToTheDynamicBlacklist": "Berhasil ditambahkan ke daftar hitam dinamis!",
"successfullyRemovedFromTheBlacklist": "Berhasil dihapus dari daftar hitam!",
"successfullyRemovedFromTheDynamicBlacklist": "Berhasil dihapus dari daftar hitam dinamis!",
"successfullyAddedToTheBlacklist": "Berhasil ditambahkan ke daftar hitam!",
"youAreCurrentlyCPRelationshipPleaseDissolve": "Anda sedang menjalin hubungan CP.\nSilakan dilarutkan terlebih dahulu.",
"areYouSureToCancelBlacklist": "Apakah Anda yakin untuk membatalkan daftar hitam?",
"areYouSureYouWantToBlockThisUser": "Apakah Anda yakin ingin memblokir pengguna ini?",
"areYouSureYouWantToDynamicBlockThisUser": "Apakah Anda yakin untuk menambahkan daftar hitam dinamis?",
"removeFromBlacklist": "Hapus dari daftar hitam",
"moveToBlacklist": "Pindah ke daftar hitam",
"userBlacklist": "Daftar hitam pengguna",
"specialEffectsManagement": "Manajemen efek khusus",
"wishingYouHappinessEveryDay": "Semoga Anda bahagia setiap hari.",
"newMessage": "Pesan baru",
"createRoomSuccsess": "Ciptakan kesuksesan ruangan!",
"contactUs": "Hubungi saya",
"systemAnnouncementTips1": "Penjagaan terhadap penipuan:",
"systemAnnouncementTips": "Verifikasi informasi hanya melalui saluran resmi. Jangan pernah mengunduh perangkat lunak pihak ketiga, membagikan data pribadi, atau mentransfer uang berdasarkan permintaan eksternal. ID staf resmi hanya 10000, 10003, dan 10086. Jika ada kecurigaan, hentikan dan laporkan melalui",
"systemAnnouncement": "Pengumuman Sistem",
"doNotClickUnfamiliarTips": "Jangan klik tautan yang tidak dikenal, karena dapat mengungkap informasi pribadi Anda. Jangan pernah membagikan detail ID atau kartu bank Anda kepada siapa pun.",
"atTag": "@Menandai",
"sayHi2": "Katakan Hai",
"canSendMsgTips": "Kedua belah pihak harus saling mengikuti sebelum mereka dapat mengirim pesan pribadi.",
"msgSendRedEnvelopeTips": "*Biaya layanan sebesar 10% akan dikenakan pada amplop merah, dan penerima hanya akan menerima 90% dari nilai amplop merah. Tingkat kekayaan pengirim harus lebih tinggi dari Level 10.",
"leavFamilyTips": "Apakah Anda yakin ingin keluar dari klan Anda saat ini? Anda harus menunggu 1 hari untuk bergabung kembali dengan klan.",
"leavingTheFamily": "Meninggalkan keluarga",
"familyNotifcations": "Pemberitahuan Keluarga",
"familyNews": "Berita Keluarga",
"reapply": "Melamar lagi",
"cancelRequestFamilyMsg": "Permintaan Anda untuk bergabung dengan keluarga 【keluarga {1}】 sedang ditinjau, apakah Anda yakin untuk membatalkan permintaan tersebut?",
"cancelRequest": "Batalkan Permintaan",
"pending": "Tertunda",
"familyAnnouncement": "Pengumuman Keluarga",
"enterFamilyAnnouncement": "Silakan masukkan pengumuman keluarga.",
"disbandTheFamily": "Bubarkan keluarga",
"editFamily": "Sunting Keluarga",
"supporter": "Pendukung",
"rechargeSuccessful": "Isi Ulang Berhasil",
"transactionReceived": "Transaksi Diterima",
"createFamilySuccess": "Ciptakan kesuksesan keluarga.",
"numberOfSign": "Jumlah tanda: {1}",
"hostWeeklyRank": "Peringkat Mingguan Tuan Rumah",
"supporterWeeklyRank": "Peringkat Mingguan Suporter",
"memberList": "Daftar Anggota",
"treasureChest": "Peti Harta Karun",
"xxfamily": "keluarga {1}",
"applicationRecord": "Catatan Aplikasi",
"createFamily": "Buat Keluarga",
"familyName": "Nama keluarga",
"createAFamily": "Ciptakan sebuah keluarga",
"searchFamilyIdHint": "Silakan masukkan ID pemilik keluarga",
"enterFamilyInfo": "Silakan perkenalkan secara singkat keluarga Anda!",
"enterFamilyName": "Silakan masukkan nama keluarga Anda.",
"familyInfo": "Perkenalan keluarga",
"joinFamily": "Bergabunglah dengan sebuah keluarga",
"appUpdateTip": "Aplikasi ini memiliki versi baru ({1}), silakan buka dan unduh?",
"ownerIncomeCoins": "Pendapatan pemilik:{1} koin",
"game": "Permainan",
"skip2": "Melewati",
"coins4": "Koin",
"currentVip": "VIP saat ini",
"weekStart": "Awal Minggu",
"forMoreRewardsPleaseCheckTheTaskCenter": "Untuk hadiah lebih lanjut, silakan periksa pusat tugas",
"kingQuuen": "Raja-Ratu",
"ramadan": "Ramadan",
"updateNow": "Perbarui Sekarang",
"allGames": "Semua Permainan",
"fishClass": "Kelas Ikan",
"greedyClass": "Kelas serakah",
"raceSeries": "Seri Balapan",
"slotsClass": "Kelas Slot",
"others": "Yang lain",
"hotGames": "Permainan Panas",
"chatBox": "Kotak obrolan",
"termsOfServicePrivacyPolicyTips": "Dengan melanjutkan, Anda menyetujui Ketentuan Layanan & Kebijakan Privasi",
"and": "Dan",
"pleaseSelectTheTypeContent": "Silakan pilih jenis konten yang menyinggung.",
"wearHonor": "Pakailah Kehormatan",
"illegalInformation": "Informasi ilegal",
"inappropriateContent": "Konten yang tidak pantas",
"personalAttack": "Serangan pribadi",
"confirm": "Mengonfirmasi",
"spam": "Spam",
"countdownMinutes": "Menit Hitung Mundur:",
"number2": "Nomor:",
"fraud": "Tipuan",
"received": "Diterima",
"currentProgress": "Kemajuan saat ini",
"currentStage": "Tahap saat ini:{1}",
"roomReward2": "Hadiah Kamar:{1}",
"roomReward": "Hadiah Kamar",
"expirationTime": "Waktu kedaluwarsa",
"ownerSendTheRedEnvelope": "Pemilik mengirimkan koin Hadiah.",
"rewardCoins": "Koin hadiah:{1} koin",
"lastWeekProgress": "Kemajuan minggu lalu",
"redEnvelopeTips2": "*Jika tas merah tidak diklaim dalam batas waktu, sisa koin akan dikembalikan kepada pengguna yang mengirimkan tas merah.",
"goToRecharge": "Pergi untuk mengisi ulang",
"deleteAccount2": "Hapus Akun({1}s)",
"areYouSureYouWantToDeleteYourAccount": "Apakah Anda yakin ingin menghapus akun Anda?",
"insufhcientGoldsGoToRecharge": "Emas tidak mencukupi, isi ulang sekarang!",
"coins2": "{1}Koin",
"remainingNumberTips": "Jumlah yang tersisa tersedia:({1}/{2})",
"collectionTimeTips": "Waktu pengambilan:{1}({2}/{3})",
"sendARedEnvelope": "Kirim amplop merah",
"sendRedPackConfirmTips": "Apakah Anda yakin ingin mengirim paket merah?",
"redEnvelopeSendingRecords": "Catatan pengiriman amplop merah:",
"redEnvelope": "Amplop Merah",
"redEnvelopeRecTips2": "Semua amplop merah telah diklaim.",
"redEnvelopeRecTips3": "Waktu pengambilan amplop merah telah habis!",
"openTheTreasureChest": "Mengirimkan tas merah!",
"redEnvelopeRecTips1": "Koin yang diperoleh telah disimpan ke dompet Anda.",
"redEnvelopeTips1": "Koin:",
"roomTools": "Peralatan Ruangan:",
"entertainment": "Hiburan:",
"reportSucc": "Laporkan berhasil",
"pornography": "Pornografi",
"reportInputTips": "Mohon jelaskan permasalahannya sedetail mungkin agar kami dapat memahami dan menyelesaikannya.",
"cancel": "Membatalkan",
"join": "Bergabung",
"items": "Barang",
"vistors": "Pengunjung",
"fans": "Penggemar",
"balanceNotEnough": "Saldo koin emas tidak mencukupi. Apakah Anda ingin pergi ke top up?",
"skip": "Lewati {1}",
"wearMedal": "Pakai Medali",
"activityHonor": "Kehormatan Aktivitas",
"achievementHonor": "Kehormatan Prestasi",
"youDontHaveAnyHonorYet": "Anda belum mendapat kehormatan apa pun.",
"letGoToWatch": "Ayo pergi menonton!",
"launchedARocket": "meluncurkan roket",
"sendUserId": "Kirim ID Pengguna:{1}",
"giveUpIdentity": "Menyerahkan identitas",
"leaveRoomIdentityTips": "Apakah Anda yakin ingin melepaskan identitas kamar?",
"joinMemberTips2": "Apakah Anda ingin mengonfirmasi bergabung dengan ruang sebagai anggota?",
"sureUnfollowThisRoom": "Yakin untuk berhenti mengikuti ruangan ini?",
"welcomeMessage": "Selamat datang di aplikasi kami, {name}!",
"settings": "Pengaturan",
"account": "Akun",
"common": "Umum",
"delete": "Menghapus",
"copy": "Menyalin",
"bio": "Biografi",
"useCoupontips": "Apakah Anda yakin ingin menggunakan kupon tersebut?",
"searchUserId": "Cari ID pengguna",
"sendUser": "Kirim Pengguna",
"hobby": "Hobi",
"sendCoupontips": "Apakah Anda yakin ingin mengirimkan kupon ini kepada pengguna ini?",
"youDontHaveAnyCouponsYet": "Anda belum memiliki kupon apa pun.",
"recall": "Mengingat",
"youHaventFollowed": "Anda belum mengikuti ruangan mana pun",
"deleteFromMyDevice": "Hapus dari perangkat saya",
"deleteOnAllDevices": "Hapus di semua perangkat",
"messageHasBeenRecalled": "Pesan ini telah ditarik kembali",
"recallThisMessage": "Ingat pesan ini?",
"language": "Bahasa",
"feedback": "Masukan",
"signedin": "Masuk",
"receiveSucc": "Berhasil diklaim",
"about": "Tentang",
"aboutUs": "Tentang Kami",
"theme": "Tema",
"wealthLevel": "Tingkat Kekayaan",
"userLevel": "Tingkat Pengguna",
"goToUpload": "Pergi untuk mengunggah",
"logout": "Keluar",
"luck": "Keberuntungan",
"level": "Tingkat",
"vip": "VIP",
"vip1": "VIP1",
"vip2": "VIP2",
"vip3": "VIP3",
"vip4": "VIP4",
"vip5": "VIP5",
"vip6": "VIP6",
"themeGoToUploadTips": "1.Tinjau dalam waktu 24 jam setelah pengunggahan berhasil.\n2.Semua koin akan dikembalikan jika peninjauan gagal.",
"home": "Rumah",
"explore": "Mengeksplorasi",
"me": "Aku",
"socialPrivilege": "Hak istimewa sosial",
"information": "Informasi",
"myPhoto": "Foto saya",
"cpRequest": "Permintaan CP",
"areYouSureYouWantToSpend3": "*Jika pihak lain menolak undangan CP, koin Anda akan dikembalikan ke dompet Anda.",
"areYouSureYouWantToSpend": "Apakah Anda yakin ingin membelanjakannya",
"areYouSureYouWantToSpend2": "untuk mengirim undangan CP ke pengguna ini?",
"cpSexTips": "Pasangan dengan jenis kelamin yang sama tidak dapat diciptakan.",
"underReview": "Sedang ditinjau",
"doYouWantToDeleteIt": "Apakah Anda ingin menghapusnya?",
"chooseFromAblum": "Pilih dari Ablum",
"spaceBackground": "Latar Belakang Luar Angkasa",
"editProfile": "Sunting Profil",
"sendTheCpRequest": "Kirim permintaan CP",
"addCp": "Tambahkan CP",
"partWays": "Bagian Cara",
"reconcile": "Mendamaikan",
"separated": "Terpisah",
"areYouSureYouWantToSpend5": "{1} menyatakan perasaannya kepadamu; jika kamu menerimanya, kamu akan menjadi pasangan.",
"areYouSureYouWantToSpend6": "{1} ingin kembali bersama Anda. Jika Anda memutuskan untuk melakukan rekonsiliasi, semua data Anda sebelumnya akan dipulihkan.",
"reconcileInvitationTips": "*Jika pihak lain menolak undangan CP, koin Anda akan dikembalikan ke dompet Anda.",
"reconcileInvitation": "Rekonsiliasi Undangan",
"areYouSureYouWantToSpend4": "mengirim undangan rekonsiliasi kepada pengguna ini?",
"partWaysTips": "*Jika salah satu pasangan memilih untuk berpisah, akan ada periode jeda selama 7 hari. Selama waktu ini, kedua belah pihak dapat memilih untuk melakukan rekonsiliasi, dan semua data akan dipulihkan setelah rekonsiliasi. Jika tidak ada rekonsiliasi yang dipilih pada akhir periode 7 hari, data pasangan tersebut akan dihapus.",
"areYouSureYouWantToPartWaysWithYourCP": "Apakah Anda yakin ingin berpisah dengan CP Anda?",
"timeSpentTogether": "Waktu yang dihabiskan bersama: {1} hari",
"firstDay": "Hari pertama:{1}",
"numberOfMyCPs": "Jumlah CP saya:({1}/{2})",
"props": "Alat peraga",
"medal": "Medali",
"win": "Menang",
"dice": "Dadu",
"rps": "RPS",
"areYouSureToCancelDynamicBlacklist": "Apakah Anda yakin untuk membatalkan daftar hitam dinamis?",
"blockUserDynamic": "Blokir Dinamis Pengguna",
"unblockUserDynamic": "Buka blokir Dinamis Pengguna",
"operationFail": "Operasi itu gagal.",
"likedYourComment": "Menyukai Komentar Anda.",
"likedYourDynamic": "Menyukai Dinamis Anda.",
"doYouWantToKeepTheDraft": "Apakah Anda ingin menyimpan drafnya?",
"cantSendDynamicTips": "Anda saat ini diblokir dari posting Dynamics.",
"operationsAreTooFrequent": "Operasi terlalu sering",
"luckNumber": "Nomor Keberuntungan",
"relationShip": "Hubungan",
"couple": "Pasangan {1}:",
"couple2": "Pasangan",
"reject": "Menolak",
"cpList": "Daftar CP",
"sound2": "Suara",
"hot": "Panas",
"selectCountry": "Pilih negara",
"giftEffect": "Efek Hadiah",
"winFloat": "Menangkan Mengambang",
"giftVibration": "Efek Hadiah Keberuntungan",
"accept": "Menerima",
"noMatchedCP": "Tidak ada CP yang cocok",
"inviteYouToBecomeBD": "Mengundang Anda untuk menjadi BD.",
"adminInviteRechargeAgent": "Mengundang Anda untuk menjadi agen Isi Ulang.",
"confirmAcceptTheInvitation": "Konfirmasikan untuk menerima undangan?",
"confirmDeclineTheInvitation": "Konfirmasi penolakan undangan?",
"host": "Tuan rumah",
"following": "Mengikuti",
"agent": "Agen",
"approved": "Disetujui",
"agreeJoinFamilyTips": "Apakah Anda mengizinkan pengguna ini bergabung dengan keluarga?",
"refuseJoinFamilyTips": "Haruskah Anda menolak membiarkan pengguna bergabung dengan keluarga?",
"onlineUsers": "Pengguna Daring ({1}/{2}):",
"applyToJoin": "Ajukan permohonan untuk bergabung",
"supporterList": "Daftar Pendukung",
"hostList": "Daftar Tuan Rumah",
"upToAdmins": "Hingga {1} Admin",
"upToMembers": "Hingga {1} Anggota",
"levelPrivileges": "Hak istimewa tingkat",
"familyLevel": "Tingkat Keluarga",
"kickOutOfFamily": "Keluar dari keluarga",
"disbandTheFamilyTips": "Apakah Anda yakin ingin membubarkan keluarga?",
"setAsFamilyAdmin": "Tetapkan sebagai admin keluarga",
"cancelFamilyAdmin": "Batalkan admin keluarga",
"kickFamilyUserTips": "Apakah Anda yakin ingin mengeluarkan pengguna ini dari keluarga?",
"familyMember2": "Anggota Keluarga ({1}/{2}):",
"familyMember3": "Anggota Keluarga ({1}):",
"familyAdmin2": "Admin Keluarga ({1}/{2}):",
"familyOwner2": "Pemilik Keluarga:",
"ra": "RA",
"roomAnnouncement": "Pengumuman Kamar",
"family3": "{1} s'Keluarga",
"help": "Membantu",
"rejected": "Ditolak",
"boxContributeTips": "Investasi sudah dilakukan hari ini, mohon jangan berinvestasi lagi",
"familyHelpTips": "(1)Jika Anda menginvestasikan 50 koin, peti harta karun pertama akan terbuka ketika 5 orang berinvestasi. Anda dapat mengklik untuk menerima 50 koin. (2) Peti harta karun kedua akan terbuka ketika 10 orang berinvestasi. Anda dapat menerima 50 koin.\n(3) Peti harta karun kedua akan terbuka ketika 20 orang berinvestasi. Anda dapat menerima 100 koin.\n(4) Jika jumlah pengguna yang diperlukan untuk mengklaim peti harta karun tidak tercapai pada hari yang sama, kemajuan peti harta karun akan diatur ulang pada hari berikutnya.\n(5) Kemajuan peti harta karun akan diatur ulang pada hari berikutnya. Pengguna yang belum mengklaim peti harta karunnya pada hari yang sama harus mengklaimnya tepat waktu.\n(6) Waktu reset peti harta karun: 00:00 waktu Saudi.",
"bd": "BD",
"coupon": "Kupon",
"search": "Mencari",
"get": "Mendapatkan",
"inRocket": "Di dalam roket",
"roomRocketHelpTips": "1. Mengirim hadiah di dalam ruangan meningkatkan energi roket. *1 hadiah koin emas = 1 poin energi roket; hadiah keberuntungan meningkatkan energi roket sebesar 4% dari nilai koin emas hadiah.\n2. Setelah energi roket terisi penuh, ruangan dapat meluncurkan roket. Hadiah akan didistribusikan secara otomatis setelah peluncuran.\n3. Level roket yang berbeda menawarkan hadiah yang berbeda.\n4. Saat roket diluncurkan, semua pengguna di ruangan dapat mengklaim hadiah roket.5. Energi roket disetel ulang pada pukul 00:00 setiap hari.",
"roomRocketRecordAction": "Catatan",
"roomRocketRewardTop1": "Top1",
"roomRocketRewardSetOff": "Diluncurkan",
"roomRocketRewardInRoom": "Di dalam ruangan",
"roomRocketResetCountdown": "23 jam, 59 menit, dan 59 detik hingga reset",
"roomRocketRecordRoom": "Ruangan",
"roomRocketRecordReward": "Hadiah",
"roomRocketRecordLast35Days": "Hanya tampilkan catatan 35 hari terakhir",
"couponRecord": "Catatan penggunaan kupon",
"inRoom": "Di Kamar",
"searchCouponHint": "Cari Kupon",
"giftCounter": "Penghitung hadiah",
"bDLeaderInviteYouToBecomeBDLeader": "Mengundang Anda untuk menjadi BDLeader",
"wins": "menang",
"inviteYouToBecomeHost": "Mengundang Anda untuk menjadi tuan rumah.",
"friends": "Teman-teman",
"deleteConversationTips": "Apakah Anda yakin ingin menghapus riwayat obrolan dengan pengguna ini?",
"propMessagePrompt": "Prompt pesan prop",
"inputUserId": "Masukkan ID Pengguna",
"fromLuckyGifts": "dari hadiah keberuntungan",
"receive": "Menerima",
"checkInSuccessful": "Check-in berhasil",
"sginTips": "Anda akan mendapatkan hadiah saat pertama kali login setiap hari. Jika Anda menghentikan proses login, hadiah akan dihitung mulai hari pertama saat Anda login kembali.",
"vipBadge": "Lencana VIP",
"vipProfileFrame": "Bingkai Profil VIP",
"vipProfileCard": "Kartu Profil VIP",
"popular": "Populer",
"recommend": "Menyarankan",
"follow": "Mengikuti",
"history": "Sejarah",
"hotRooms": "Kamar Panas",
"viewMore": "Lihat lebih banyak",
"noData": "Tidak ada data",
"users": "Pengguna",
"rooms": "Kamar",
"coins": "koin",
"unread": "Belum dibaca",
"read": "Membaca",
"image": "[Gambar]",
"video": "[Video]",
"sound": "[Suara]",
"gift2": "[Hadiah]",
"clickHereToStartChatting": "Katakan sesuatu.....",
"receivedAMessage": "[Menerima pesan]",
"confirmSwitchMicModelTips": "Apakah Anda mengonfirmasi peralihan dalam mode tempat duduk?",
"number": "Nomor",
"album": "Album",
"camera": "Kamera",
"system": "Sistem",
"notifcation": "Melihat",
"inviteYouToBecomeAgent": "Mengundang Anda untuk menjadi agensi.",
"myMusic": "Musik Saya",
"add": "Menambahkan",
"pullToLoadMore": "Tarik untuk memuat lebih banyak",
"loadingFailedClickToRetry": "Gagal memuat, klik untuk mencoba lagi",
"releaseToLoadMore": "Lepaskan untuk memuat lebih banyak",
"haveMyLimits": "---Aku punya batasku.---",
"music": "Musik",
"free": "Bebas",
"charm": "Pesona hadiah",
"start": "Awal",
"vipUseThisThemeTips": "Hanya pengguna yang memenuhi level VlP yang dapat menggunakan tema ini.",
"stop": "Berhenti",
"chats": "Obrolan",
"family": "Keluarga",
"refuse": "Menolak",
"agree": "Setuju",
"thisFeatureIsCurrentlyUnavailable": "Fitur ini saat ini tidak tersedia.",
"pleaseSelectTheRecipient": "Silakan pilih penerima.",
"searchMemberIdHint": "Silakan masukkan ID anggota",
"unclaimedRedEnvelopes": "Amplop merah yang tidak diambil akan dikembalikan dalam 24 jam.",
"redEnvelopeNotYetClaimed": "Amplop merah belum diklaim.",
"redEnvelopeAmount": "Jumlah amplop merah: {1} koin",
"sentARedEnvelope": "mengirim amplop merah.",
"theRedEnvelopeHasExpired": "Amplop merah sudah habis masa berlakunya.",
"joinRequest": "Permintaan Gabung",
"welcomeToMyFamily": "Selamat datang di keluarga saya!",
"scrollToTheBottom": "Gulir ke bawah",
"gameRules": "Aturan Permainan:",
"charmGameRulesTips": "Aktifkan dasbor untuk menampilkan koin hadiah yang diterima semua pengguna di mikrofon, 1 koin = 1 skor (Hadiah keberuntungan 1 koin = skor 0,04).",
"inputYourOldPassword": "Masukkan kata sandi lama Anda",
"enterYourOldPassword": "Masukkan kata sandi lama Anda",
"setYourPassword": "Tetapkan kata sandi Anda",
"enterYourNewPassword": "Masukkan kata sandi baru Anda",
"confirmYourPassword": "Konfirmasikan kata sandi Anda",
"theTwoPasswordsDoNotMatch": "Kedua kata sandi tidak cocok.",
"resetLoginPasswordtTips2": "Kata sandi harus terdiri dari 8-16 karakter dan harus berupa kombinasi huruf besar dan kecil serta angka dalam bahasa Inggris (bukan hanya angka)",
"resetLoginPassword": "Atur Ulang Kata Sandi Masuk",
"resetLoginPasswordtTips1": "Masuk dengan ID pengguna atau ID cantik Anda. Lebih aman masuk dengan akun Aslan.",
"localMusic": "Musik Lokal",
"setLoginPassword": "Tetapkan Kata Sandi Masuk",
"confirmSwitchMicThemeTips": "Apakah Anda mengonfirmasi peralihan gaya kursi?",
"pleaseUpgradeYourVipLevelFirst": "Silakan tingkatkan level VIP Anda terlebih dahulu.",
"micTheme": "Tema Mikrofon",
"classicMic": "Klasik {1} Mikrofon",
"yesterday": "Kemarin {1}",
"monday": "Senin {1}",
"tuesday": "Selasa {1}",
"wednesday": "Rabu {1}",
"thursday": "Kamis {1}",
"friday": "Jumat {1}",
"saturday": "Sabtu {1}",
"sunday": "Minggu {1}",
"acceptedYour": "{1} menerima Anda",
"youAccepted": "Anda menyetujui {1}",
"openRedPackDialogTip": "Amplop merah",
"micManagement": "Manajemen Mikrofon",
"vipChatBox": "Kotak Obrolan VIP",
"vipRoomCoverBorder": "Perbatasan Penutup Ruang VIP",
"bdCenter": "Pusat BD",
"renewVip": "Perpanjang VIP",
"rechargeAgency": "Badan Isi Ulang",
"adminCenter": "Pusat Kerja",
"goldList": "Daftar Emas",
"followList": "Ikuti Daftar",
"fansList": "Daftar Penggemar",
"daily": "Sehari-hari",
"cp": "CP",
"female": "Perempuan",
"male": "Pria",
"identity": "Identitas",
"adjust": "Menyesuaikan",
"warning": "Peringatan",
"screenshotTips": "Tangkapan Layar (Hingga 3)",
"roomNotice": "Pemberitahuan kamar",
"roomTheme": "Tema kamar",
"description": "Keterangan:",
"inputDesHint": "Mohon jelaskan permasalahannya sedetail mungkin agar kami dapat memahami dan menyelesaikannya.",
"roomProfilePicture": "Gambar profil kamar",
"userProfilePicture": "Gambar profil pengguna",
"userName": "Nama belakang",
"pleaseSelectTheTypeToProcess": "Silakan pilih jenis yang akan diproses:",
"roomEditing": "Pengeditan Ruangan",
"setAccount": "Tetapkan Akun",
"userEditing": "Pengeditan Pengguna",
"enterTheUserId": "Masukkan ID pengguna",
"enterTheRoomId": "Masukkan ID ruangan",
"deleteAccount": "Hapus Akun",
"becomeAgent": "Menjadi agen",
"enterNickname": "Masukkan Nama Panggilan",
"selectYourCountry": "Pilih negara Anda",
"inviteCode": "Kode Undangan",
"magic": "Sihir",
"list": "Daftar",
"walletBalance": "Saldo dompet:",
"canOnlyBeShown": "*Hanya dapat ditampilkan kepada semua pengguna di wilayah Anda.",
"sendMessage": "Kirim Pesan",
"availableCountries": "Negara yang Tersedia:",
"currentBalance": "Saldo Saat Ini:",
"successfulTransaction": "{1} Transaksi Berhasil",
"hasBeenACoinAgencyForDays": "Telah Menjadi Agen Koin Selama {1} Hari",
"luckGiftSpecialEffects": "Efek animasi hadiah keberuntungan",
"theVideoSizeCannotExceed": "Ukuran video tidak boleh melebihi 50M",
"weekly": "Mingguan",
"rechargeRecords": "Isi Ulang Catatan",
"balance": "keseimbangan:",
"appStore": "Toko Aplikasi",
"searchCountry": "Telusuri negara...",
"googlePay": "Google Bayar",
"biggestDiscount": "Diskon terbesar",
"officialRechargeAgent": "Agen isi ulang resmi",
"customizedGiftRulesContent": "Cara mendapatkan hadiah khusus saya:\n1.Tentukan apakah pengguna berhak menerima hadiah khusus berdasarkan tingkat kekayaan mereka saat ini.\n(1) Ketika tingkat kekayaan pengguna ≥35: Pengguna dapat mengunggah video untuk hadiah khusus satu kali. Kami akan menggunakan gambar profil pengguna saat ini sebagai gambar hadiah dan video yang disediakan sebagai efek hadiah pada \"Disesuaikan\". Produksi akan memakan waktu beberapa saat, dan kami akan memberi tahu Anda segera setelah tersedia di toko.\n(2) Ketika tingkat kekayaan pengguna ≥45: Pengguna dapat mengunggah video untuk hadiah khusus satu kali. Kami akan menggunakan gambar profil pengguna saat ini sebagai gambar hadiah dan video yang disediakan sebagai efek hadiah pada \"Disesuaikan\". Produksi akan memakan waktu beberapa saat, dan kami akan memberi tahu Anda segera setelah tersedia di toko.\n2.Anda dapat berpartisipasi dalam aktivitas tertentu di aplikasi dan, setelah memenuhi kriteria, menghubungi kami melalui bagian \"Pesan\" → \"Hubungi kami\". Berikan tangkapan layar aktivitas dan video yang ingin Anda gunakan untuk hadiah khusus. Kami akan menggunakan gambar profil Anda saat ini sebagai gambar hadiah dan video yang disediakan sebagai efek hadiah, lalu mencantumkannya di bawah \"Disesuaikan\". Produksi akan memakan waktu beberapa saat, dan kami akan memberi tahu Anda segera setelah tersedia di toko.\nPeriode Validitas Hadiah yang Disesuaikan & Cara Memperpanjangnya:\nHadiah eksklusif yang disesuaikan akan tersedia di rak untuk masa berlaku 30 hari. Untuk memungkinkan pengguna yang berpengaruh dan menginspirasi untuk terus menikmati pengalaman baru ini dan menampilkan gaya pribadi mereka, pengguna yang memiliki hadiah khusus dapat memperpanjang waktu simpan semua hadiah khusus mereka selama 30 hari dengan mengisi ulang $500 pada bulan tertentu.",
"customizedGiftRules": "Aturan Hadiah yang Disesuaikan",
"rulesUpload": "Aturan & Unggah",
"monthly": "Bulanan",
"playLog": "Log Putar:",
"selectACountry": "Pilih negara:",
"message": "Pesan",
"clearCache": "Hapus Tembolok",
"customized": "Disesuaikan",
"searchInputHint": "Masukkan nomor rekening/kamar",
"kickRoomTips": "Anda telah diusir dari ruangan.",
"joinRoomTips": "bergabung ke ruangan!",
"roomSetting": "Pengaturan Ruangan",
"roomDetails": "Detail Kamar",
"systemRoomTips": "Harap menjaga kesopanan dan rasa hormat. Konten pornografi atau vulgar apa pun dilarang keras di Aslan. Akun apa pun yang ditemukan melanggar akan diblokir secara permanen. Kami dengan hormat meminta semua pengguna untuk secara sadar mematuhi pedoman komunitas Aslan.",
"copiedToClipboard": "Disalin ke papan klip",
"recharge": "Isi ulang",
"receivedFromALuckyGift": "Diterima dari hadiah keberuntungan.",
"followedYou": "Mengikutimu",
"agentCenter": "Pusat Agensi",
"areYouSureYouWantToClearLocalCache": "Apakah Anda yakin ingin menghapus cache lokal?",
"clearMessage": "Hapus pesan layar",
"report": "Laporan",
"coins3": "Koin",
"giftSpecialEffects": "Hadiahkan efek khusus",
"basicFeatures": "Fitur Dasar",
"task": "Tugas",
"importantReminder": "Pengingat Penting",
"entryVehicleAnimation": "Animasi kendaraan masuk (VIP3)",
"floatingAnimationInGlobal": "Animasi mengambang secara global",
"entryVehicleAnimation2": "Pengguna dengan hak istimewa VlP3 atau lebih tinggi dapat menggunakan fungsi ini untuk menonaktifkan animasi kendaraan.",
"dailyTasks": "Tugas Harian",
"enterRoomConfirmTips": "Apakah Anda yakin ingin memasuki ruangan?",
"followSucc": "Diikuti dengan sukses",
"goldListort": "Daftar Emas",
"rechargeList": "Daftar Isi Ulang",
"edit": "Sunting",
"swipeLeftOnTheFloatingScreenAreaToQuicklyCloseIt": "*Tips: Geser ke kiri pada area layar mengambang untuk menutupnya dengan cepat.",
"enterThisVoiceChatRoom": "Masuk ke ruang obrolan suara ini?",
"go": "Pergi",
"done": "Selesai",
"improvementTasks": "Tugas Peningkatan",
"save": "Menyimpan",
"kickPrevention": "Pencegahan tendangan",
"freeChatSpeak": "Obrolan & Bicara Gratis",
"vipExclusiveVehicles": "Kendaraan Eksklusif VIP",
"nickName": "Nama panggilan",
"buyVip": "Beli VIP",
"gender": "Jenis kelamin",
"unFollow": "Berhenti mengikuti",
"days": "hari",
"permanent": "Permanen",
"yourVipWillExpire": "Masa berlaku VIP Anda akan berakhir pada {1}",
"cantBuyVip": "Tidak dapat melanjutkan pembelian",
"country": "Negara",
"birthday": "Hari ulang tahun",
"man": "Pria",
"woman": "Wanita",
"apple": "Apel",
"google": "Google",
"idIcon": "Ikon ID",
"inviteToBecomeAHost": "Undang untuk menjadi tuan rumah",
"currentLevelPrivilegesAndCostumes": "Hak istimewa dan kostum level saat ini: {1}",
"uploadGifAvatar": "Unggah avatar GlF (VIP2)",
"uploadProfilePicture": "Unggah Gambar Profil",
"permissionSettings": "Pengaturan izin",
"vipMicSoundWave": "Gelombang Suara Mikrofon VIP",
"startVoiceParty": "Mulai pesta suara!",
"enterRoomTips": "{1} Masuk ke ruangan",
"roomName": "Nama Kamar",
"roomMember": "Anggota Kamar",
"pleaseSelectYourCountry": "Silakan pilih negara Anda.",
"pleaseSelectYourGender": "Silakan pilih jenis kelamin Anda.",
"pleaseEnterNickname": "Silakan masukkan nama panggilan.",
"countryRegion": "Negara & Wilayah",
"dateOfBirth": "Tanggal lahir",
"mute": "Bisu",
"exit": "KELUAR",
"mysteriousInvisibility": "Gaib yang misterius",
"antiBlock": "Anti-Blok",
"createFamilyForFree": "Buat Keluarga Gratis",
"privateChat": "Obrolan Pribadi",
"vipBirthdayGift": "Hadiah Ulang Tahun VIP",
"storeDiscount": "Diskon Toko Diskon {1}",
"membershipFreeChatSpeak": "Obrolan & Bicara bebas keanggotaan",
"priorityRoomSorting": "Penyortiran Kamar Prioritas",
"userColoredID": "ID Berwarna Pengguna",
"vipEmoticon": "Emotikon VIP({1})",
"pleaseSelectaItem": "Silakan pilih item",
"areYouRureRoRecharge": "Apakah Anda yakin untuk mengisi ulang?",
"mInimize": "Menyimpan",
"everyone": "Setiap orang",
"shop": "Toko",
"roomOwner": "Pemilik Kamar",
"dailyTaskRewardBonus": "Bonus Hadiah Tugas Harian ({1} XP)",
"userLevelXPBoost": "Peningkatan XP Tingkat Pengguna ({1} XP)",
"pleaseUpgradeYourVipLevel": "Silakan tingkatkan level VIP Anda.",
"andAboveUsers": "{1} Dan Pengguna Di Atas",
"privileges": "{1} Hak istimewa",
"basicPermissions": "Izin dasar",
"hostCenter": "Pusat Tuan Rumah",
"allOnMicrophone": "Semuanya menggunakan mikrofon",
"usersOnMicrophone": "Pengguna di mikrofon",
"allInTheRoom": "Semua di kamar",
"send": "Mengirim",
"crop": "Tanaman",
"goToUpgrade": "Pergi untuk meningkatkan",
"exclusiveEmojiWillBeReleasedAfterBecoming": "Emoji eksklusif akan dirilis setelah menjadi",
"preventBeingBlocked": "Mencegah Diblokir",
"enableRankIncognitoMode": "Aktifkan Mode Penyamaran Peringkat",
"avoidBeingKicked": "Hindari Ditendang",
"vipPrivilege": "Hak istimewa VIP",
"finish": "Menyelesaikan",
"takeTheMic": "Ambil mikrofonnya",
"openTheMic": "Buka mikrofon",
"muteTheMic": "Matikan mikrofon",
"unlockTheMic": "Buka kunci mikrofon",
"leavelTheMic": "Tinggalkan mikrofonnya",
"lockTheMic": "Kunci mikrofonnya",
"removeTheMic": "Hapus mikrofon",
"inviteToTheMicrophone": "Undang ke mikrofon",
"openUserProfleCard": "Buka kartu profil pengguna",
"obtain": "memperoleh",
"win2": "Menangkan {1}",
"backTheRoom": "Ruang belakang",
"toConsume": "Untuk mengkonsumsi",
"howToUpgrade": "Bagaimana cara meningkatkannya?",
"spendCoinsToGainExperiencePoints": "Habiskan Koin untuk mendapatkan poin pengalaman",
"higherLevelFancierAvatarFrame": "Tingkat yang lebih tinggi, lencana/bingkai avatar yang lebih menarik",
"medalAndAvatarFrameRewards": "Hadiah medali dan bingkai avatar",
"all": "Semua",
"gift": "Hadiah",
"chat": "Mengobrol",
"owner": "Pemilik",
"store": "Toko",
"admin": "Admin",
"member": "Anggota",
"guest": "Tamu",
"submit": "Kirim",
"claim": "Mengeklaim",
"complete": "Menyelesaikan",
"shareTo": "Bagikan ke",
"copyLink": "Salin Tautan",
"faceBook": "Facebook",
"whatsApp": "ada apa",
"snapChat": "Snapchat",
"taskNamePersonalGameConsume": "Pengeluaran Game",
"taskNameRoomNewMember": "Anggota Ruang Baru",
"taskNameRoomOwnerSendRedPacket": "Pemilik Kamar mengirimkan satu paket merah",
"taskNameRoomOwnerSendGiftUser": "Pemilik Kamar Mengirim Hadiah",
"taskNameRoomMicUser120Min": "Anggota dengan 120+ menit menggunakan mikrofon",
"taskNameRoomMicUser60Min": "Anggota dengan 60+ menit menggunakan mikrofon",
"taskNameRoomMicUser30Min": "Anggota dengan 30+ menit menggunakan mikrofon",
"taskNamePersonalSendGift": "Kirim Hadiah ke Pengguna",
"taskNameRoomOnlineUserCount": "Anggota ruang online",
"taskNameRoomOwnerInviteMic": "Undang anggota ke Mic",
"taskNameRoomUserSendGiftGold": "Koin yang diberikan oleh anggota",
"taskNameRoomOwnerSendGiftGold": "Koin yang diberikan oleh pemilik kamar",
"taskNamePersonalMagicGiftGold": "Koin Dimenangkan dengan Mengirim Hadiah Ajaib",
"taskNamePersonalLuckyGiftGold": "Koin Dimenangkan dengan Mengirim Hadiah Keberuntungan",
"taskNameRoomOwnerMicTime": "Pemilik Kamar menyalakan mikrofon di dalam kamar",
"taskNamePersonalActiveInRoom": "Jadilah Aktif di Ruangan Orang Lain",
"taskNamePersonalMicInRoom": "Ayo Mikrofon",
"dailyCoinBonanzaRulesDetail": "1. Tugas Pribadi Harian dan Tugas Pemilik Ruangan Harian dapat diselesaikan satu kali per pengguna per hari. Tugas diatur ulang pada 00:00:00 waktu Saudi.\n2. Tugas pribadi sehari-hari hanya dapat diselesaikan di ruangan orang lain; tugas pemilik ruangan hanya dapat diselesaikan di ruangan Anda sendiri.\n3. Tugas pemberian hadiah hanya menghitung hadiah yang dikirim di ruangan, bukan hadiah yang dikirim di feed.\n4. Jika beberapa akun dibuat menggunakan perangkat yang sama atau kartu SIM yang sama dengan cara apa pun, hadiah untuk semua tugas hanya dapat diklaim satu kali.",
"dailyCoinBonanzaRules": "Aturan Bonanza Koin Harian",
"roomOwnerTasks": "Tugas Pemilik Ruangan",
"personalTasks": "Tugas Pribadi",
"noPromptsToday": "Tidak ada petunjuk hari ini.",
"getPaidToRefer": "Dapatkan Bayaran untuk Merujuk",
"membershipFee": "Biaya Keanggotaan",
"membershipFeeTips1": "Silakan tentukan biaya keanggotaan untuk kamar Anda. Pengguna dapat bergabung dengan kamar Anda dengan membayar biayanya.",
"membershipFeeTips2": "Emas yang dibutuhkan pengguna untuk menjadi anggota ruangan. Pemilik ruangan akan mendapatkan 50% emas.",
"freePrice": "Biaya: 0-10.000",
"touristsSendText": "Turis mengirim SMS",
"touristsTakeToTheMic": "Wisatawan mendengarkan mikrofon",
"theMembershipFee": "Biaya keanggotaan",
"theModificationsMade": "Modifikasi yang dilakukan kali ini tidak akan disimpan setelah keluar",
"viewFrame": "Lihat Bingkai",
"enterRoomName": "Masukkan nama ruangan",
"headdress": "Bingkai",
"mountains": "Kendaraan",
"purchaseIsSuccessful": "Pembelian berhasil",
"buy": "Membeli",
"followed": "Diikuti",
"follow2": "Ikuti:{1}",
"fans2": "Penggemar:{1}",
"vistors2": "Pengunjung:{1}",
"personal2": "Pribadi:",
"family2": "Keluarga:",
"conntinue": "Lanjutkan",
"confirmBuyTips": "Apakah Anda yakin ingin membeli?",
"purchase": "Pembelian",
"setRoomPassword": "Tetapkan kata sandi ruangan",
"inputRoomPassword": "Masukkan kata sandi ruangan",
"enter": "Memasuki",
"createDynamicSuccess": "Berhasil membuat dinamis",
"deleteDynamicTips": "Apakah Anda yakin ingin menghapus dinamika ini?",
"deleteCommentTips": "Apakah Anda yakin ingin menghapus komentar ini?",
"deleteSuccessful": "Penghapusan berhasil!",
"itemsLeft": "Barang tersisa",
"password": "Kata sandi",
"replySucc": "Balasan berhasil",
"comment": "Komentar",
"showMore": "Tampilkan lebih banyak",
"showLess": "Tampilkan lebih sedikit",
"enterPassword": "Masukkan Kata Sandi",
"enterAccount": "Masuk ke Akun",
"logIn": "Masuk",
"saySomething": "Katakan sesuatu...",
"sayHi": "Ucapkan salam..",
"pleaseChatFfriendly": "Silakan ngobrol dengan ramah",
"unLockTheRoom": "Buka Kunci Ruangan",
"operationSuccessful": "Operasinya berhasil.",
"adminByHomeowner": "ditetapkan sebagai administrator oleh pemilik rumah.",
"memberByHomeowner": "ditetapkan sebagai anggota oleh pemilik rumah.",
"touristByHomeowner": "ditetapkan sebagai turis oleh pemilik rumah.",
"becomeHost": "Lamar Untuk Menjadi Tuan Rumah",
"superFans": "Penggemar super:",
"setUpAnIdentity": "Siapkan identitas",
"kickedOutOfRoom": "Ditendang keluar dari ruangan",
"playGiftMusicAndDynamicMusic": "Mainkan musik hadiah dan musik dinamis",
"knapsack": "ransel",
"bdLeader": "Pemimpin BD",
"picture": "Gambar",
"theImageSizeCannotExceed": "Gagal mengunggah: File harus berukuran kurang dari 2 MB.",
"activity": "Aktivitas",
"alreadyAnAdministrator": "Sudah menjadi administrator",
"alreadyAnMember": "Sudah menjadi anggota",
"alreadyAnTourist": "Sudah menjadi turis",
"touristsCannotSendMessages": "Wisatawan tidak dapat mengirim pesan",
"touristsAreNotAllowedToGoOnTheMic": "Wisatawan tidak diperbolehkan menggunakan mikrofon",
"lockTheRoom": "Kunci Ruangan",
"special": "Spesial",
"visitorList": "Daftar Pengunjung",
"successfulWear": "Pakaian yang sukses",
"confirmUnUseTips": "Apakah Anda mengonfirmasi untuk menghapusnya?",
"custom": "Kebiasaan",
"myItems": "Barang Saya",
"use": "Menggunakan",
"unUse": "Tidak digunakan",
"renewal": "Pembaruan",
"wallet": "Dompet",
"profile": "Profil",
"giftwall": "dinding hadiah",
"announcement": "Pengumuman",
"blockedList": "Daftar yang diblokir",
"country2": "Negara:",
"sendTo": "Kirim ke",
"medals": "Medali",
"activityMedal": "Medali Aktivitas",
"achievementMedal": "Medali Prestasi",
"credits": "Kredit: {1}",
"successfullyUnloaded": "Berhasil dibongkar",
"expired": "Kedaluwarsa",
"day": "Hari",
"inUse": "Sedang digunakan",
"confirmUseTips": "Apakah Anda ingin mengonfirmasi penggunaannya?",
"pleaseUploadUserAvatar": "Silakan unggah avatar.",
"joinMemberTips": "Jika Anda adalah pengunjung ruangan, Anda tidak dapat mengambil mikrofon.",
"giftGivingSuccessful": "Pemberian hadiah berhasil.",
"theAccountPasswordCannotBeEmpty": "Akun atau kata sandi tidak boleh kosong.",
"invitesYouToTheMicrophone": "{1} mengundang Anda ke mikrofon",
"english": "Bahasa inggris",
"chinese": "Cina",
"arabic": "Arab",
"darkMode": "Mode Gelap",
"lightMode": "Modus Cahaya",
"systemDefault": "Bawaan Sistem",
"pleaseGetOnTheMicFirst": "Silakan nyalakan mikrofonnya terlebih dahulu.",
"duration2": "Durasi:{1}"
}

View File

@ -359,6 +359,14 @@
"get": "Al",
"inRocket": "Rokette",
"roomRocketHelpTips": "1. Odada hediye göndermek roket enerjisini artırır. *1 altın jetton hediyesi = 1 roket enerji puanı; şanslı hediyeler roket enerjisini hediyenin altın jetton değerinin %4'ü kadar artırır.\n2. Roket enerjisi tamamen dolduğunda, oda roketi fırlatabilir. Fırlatmadan sonra ödüller otomatik olarak dağıtılacaktır.\n3. Farklı roket seviyeleri farklı ödüller sunar.\n4. Roket fırlatıldığında, odadaki tüm kullanıcılar roket ödülünü talep edebilir.5. Roket enerjisi her gün 00:00'da sıfırlanır.",
"roomRocketRecordAction": "Kayıt",
"roomRocketRewardTop1": "Top1",
"roomRocketRewardSetOff": "Fırlatan",
"roomRocketRewardInRoom": "Odada",
"roomRocketResetCountdown": "Sıfırlamaya 23 saat, 59 dakika ve 59 saniye kaldı",
"roomRocketRecordRoom": "Oda",
"roomRocketRecordReward": "Ödül",
"roomRocketRecordLast35Days": "Yalnızca son 35 günün kayıtlarını göster",
"couponRecord": "Kupon Kullanım Kaydı",
"inRoom": "Odada",
"searchCouponHint": "Kupon Ara",
@ -463,7 +471,7 @@
"bdCenter": "BD Merkezi",
"renewVip": "VIP'yi Yenile",
"rechargeAgency": "Yükleme Temsilciliği",
"adminCenter": "Yönetici Merkezi",
"adminCenter": "Çalışma Merkezi",
"goldList": "Altın Listesi",
"followList": "Takip Listesi",
"fansList": "Hayran Listesi",
@ -765,4 +773,4 @@
"systemDefault": "Sistem Varsayılanı",
"pleaseGetOnTheMicFirst": "Lütfen önce mikroya çıkın.",
"duration2": "Süre:{1}"
}
}

777
assets/l10n/intl_ur.json Normal file
View File

@ -0,0 +1,777 @@
{
"signInWithGoogle": "گوگل کے ساتھ سائن ان کریں۔",
"or": "یا",
"signInWithYourAccount": "اپنے اکاؤنٹ سے سائن ان کریں۔",
"signInWithApple": "ایپل کے ساتھ سائن ان کریں۔",
"loginRepresentsAgreementTo": "لاگ ان معاہدے کی نمائندگی کرتا ہے۔",
"termsofService": "سروس کی شرائط",
"privaceyPolicy": "رازداری کی پالیسی",
"tips": "تجاویز",
"dailyTasksTips": "نوٹ: کاموں سے نمٹنے کے لیے تیار ہیں؟ انہیں اپنے پسندیدہ کمروں میں تلاش کریں۔",
"searchNoDataTips": "وہ کمرہ یا صارف lD درج کریں جسے آپ تلاش کرنا چاہتے ہیں۔",
"youHaveNotHadVIPYet": "آپ نے ابھی تک VIP نہیں کیا ہے، آو اور اسے آزمائیں",
"games": "گیمز",
"vipAccelerating": "{1} تیز کرنا",
"mine": "میرا",
"luckGiftRuleTips": "ایک خوش قسمت تحفہ دیں اور 1000 گنا تک سونے کا سکہ انعام جیتیں! خوش قسمت تحائف حاصل کرنے والے صارفین درج ذیل فوائد سے لطف اندوز ہو سکتے ہیں۔ \n(1) خوش قسمت تحائف وصول کرنے والے صارفین کے لیے: تحفے کی قیمت کی بنیاد پر +4% دلکش تجربہ کی قیمت۔ (2) اگر وصول کنندہ میزبان ہے: تحفہ کی مالیت کی بنیاد پر +4% میزبان تنخواہ ہدف کی قیمت۔",
"badge": "بیج",
"vipRippleTheme": "وی آئی پی ریپل تھیم",
"glory": "جلال",
"badgeHonor": "بیج/گلوری",
"party": "پارٹی",
"other": "دیگر",
"gifProfileUpload": "GIF پروفائل اپ لوڈ",
"levelMedal": "لیول میڈل",
"levelIcon": "سطح کا آئیکن",
"maliciousHarassment": "بدنیتی پر مبنی ہراساں کرنا",
"event": "واقعہ",
"roomEdit": "کمرے میں ترمیم کریں۔",
"cancelRoomPassword": "کیا آپ واقعی کمرے کا پاس ورڈ حذف کرنا چاہتے ہیں؟",
"roomMemberFee": "کمرہ ممبر کی فیس",
"roomTheme2": "روم تھیم",
"blockedList2": "مسدود فہرست",
"roomPassword": "کمرے کا پاس ورڈ",
"numberOfMic": "مائیک کی تعداد",
"pleaseEnterContent": "براہ کرم مواد درج کریں۔",
"profilePhoto": "پروفائل فوٹو",
"aboutMe": "میرے بارے میں",
"myRoom": "میرا کمرہ",
"noHistoricalRecordsAvailable": "کوئی تاریخی ریکارڈ دستیاب نہیں ہے۔",
"inviteNewUsersToEarnCoins": "سکے حاصل کرنے کے لیے نئے صارفین کو مدعو کریں۔",
"crateMyRoom": "میرا کمرہ بنائیں",
"vipSpecialGiftTassel": "VIP خصوصی تحفہ tassel",
"vipEntranceEffect": "VIP داخلے کا اثر",
"casualInteraction": "آرام دہ اور پرسکون تعامل",
"haveGamePlayingTips": "آپ کے پاس ایک گیم جاری ہے۔ براہ کرم موجودہ گیم سے باہر نکلیں۔ کیا آپ واقعی باہر نکلنا چاہتے ہیں؟",
"historicalTour": "تاریخی دورہ",
"gameCenter": "کھیل مرکز",
"returnToVoiceChat": "صوتی چیٹ پر واپس جائیں؟",
"exitGameMode": "گیم موڈ سے باہر نکلیں۔",
"enterTheRoom": "کمرے میں داخل ہوں۔",
"invite": "دعوت دیں۔",
"inviteGoRoomTips": "ہمیشہ آپ کے لیے بارش ہو یا چمک۔ اندر داخل ہوں اور ہیلو کہو!",
"confirmInviteThisUserToTheRoom": "اس صارف (ID:{1}) کو کمرے میں مدعو کرنے کی تصدیق کریں؟",
"honor": "عزت",
"clearCacheSuccessfully": "کیشے کو کامیابی سے صاف کریں۔",
"sent": "بھیجا",
"keep": "رکھو",
"open": "کھولیں۔",
"deleteAccountTips2": "*اگر آپ اپنا خیال بدل لیتے ہیں، تو آپ سات دنوں میں اپنے موجودہ اکاؤنٹ میں دوبارہ لاگ ان کر سکتے ہیں، اور ہم خود بخود آپ کا اکاؤنٹ بحال کر دیں گے۔ اگر سات دنوں کے اندر کوئی بحالی نہیں ہوتی ہے، تو اکاؤنٹ مستقل طور پر حذف کر دیا جائے گا۔",
"deleteAccountTips": "آپ کو اس اکاؤنٹ کے مکمل انتظامی حقوق حاصل ہیں۔ اگر آپ اکاؤنٹ کو حذف کرنا چاہتے ہیں، تو براہ کرم اس آپریشن سے منسلک درج ذیل خطرات سے آگاہ رہیں:\n1.اکاؤنٹ کامیابی کے ساتھ حذف ہونے کے بعد، آپ اپنے موجودہ اکاؤنٹ میں لاگ ان نہیں ہو پائیں گے۔ اکاؤنٹ حذف کرنا ایک مستقل عمل ہے۔\n2. اکاؤنٹ کے کامیابی سے حذف ہونے کے بعد، آپ اکاؤنٹ کا کوئی ڈیٹا بازیافت نہیں کر سکیں گے۔ تمام معلومات (بشمول کمرے، دوست)، ورچوئل کرنسی، تحائف، اور ورچوئل آئٹمز مستقل طور پر حذف کر دی جائیں گی اور انہیں بحال نہیں کیا جا سکتا۔\n3. کولنگ آف پیریڈ: اگر آپ اکاؤنٹ کو بحال نہیں کرتے ہیں، تو آپ خریداری کے صفحہ، واپسی کے صفحہ، یا ایپ کے کسی دوسرے صفحات تک رسائی حاصل کرنے سے قاصر ہوں گے۔\n4. کولنگ آف پیریڈ کے دوران یا اکاؤنٹ کے حذف ہونے کے بعد، پروفائل صفحہ اس بات کی نشاندہی کرے گا کہ اسے حذف کر دیا گیا ہے۔ آپ کے اکاؤنٹ کو دوسروں کی طرف سے تلاش یا ان تک رسائی سے بچانے کے لیے، آپ کی ذاتی معلومات کو روزانہ کے افعال سے متعلق سسٹمز سے ہٹا دیا جائے گا۔ جب اکاؤنٹ کو حذف کرنے میں قومی سلامتی، دیوانی یا فوجداری کارروائی، یا فریق ثالث کے جائز حقوق اور مفادات کا تحفظ شامل ہو، تو اہلکار صارف کی اکاؤنٹ حذف کرنے کی درخواست کو مسترد کرنے کا حق محفوظ رکھتا ہے۔\nاگر آپ کو یقین ہے کہ آپ اپنے موجودہ اکاؤنٹ سے تمام ذاتی ڈیٹا حذف کرنا چاہتے ہیں، تو براہ کرم \"اکاؤنٹ حذف کریں\" پر کلک کریں۔",
"accountDeletionNotice": "اکاؤنٹ حذف کرنے کا نوٹس:",
"thisUserHasBeenBlacklisted": "اس صارف کو بلیک لسٹ کر دیا گیا ہے۔",
"trend": "رجحان",
"like": "پسند",
"more": "مزید",
"discard": "رد کر دیں۔",
"catchFirstComment": "پہلا تبصرہ دیکھیں",
"reply": "جواب دیں۔",
"posting": "پوسٹنگ",
"dynamic": "متحرک",
"multiple": "متعدد",
"successfullyAddedToTheDynamicBlacklist": "کامیابی کے ساتھ متحرک بلیک لسٹ میں شامل کیا گیا!",
"successfullyRemovedFromTheBlacklist": "بلیک لسٹ سے کامیابی کے ساتھ ہٹا دیا گیا!",
"successfullyRemovedFromTheDynamicBlacklist": "ڈائنامک بلیک لسٹ سے کامیابی کے ساتھ ہٹا دیا گیا!",
"successfullyAddedToTheBlacklist": "بلیک لسٹ میں کامیابی کے ساتھ شامل کیا گیا!",
"youAreCurrentlyCPRelationshipPleaseDissolve": "آپ فی الحال CP رشتہ میں ہیں۔\nبراہ کرم پہلے اسے تحلیل کریں۔",
"areYouSureToCancelBlacklist": "کیا آپ یقینی طور پر بلیک لسٹ کو منسوخ کرنا چاہتے ہیں؟",
"areYouSureYouWantToBlockThisUser": "کیا آپ واقعی اس صارف کو مسدود کرنا چاہتے ہیں؟",
"areYouSureYouWantToDynamicBlockThisUser": "کیا آپ کو متحرک بلیک لسٹ شامل کرنے کا یقین ہے؟",
"removeFromBlacklist": "بلیک لسٹ سے نکال دیں۔",
"moveToBlacklist": "بلیک لسٹ میں جائیں۔",
"userBlacklist": "یوزر بلیک لسٹ",
"specialEffectsManagement": "خصوصی اثرات کا انتظام",
"wishingYouHappinessEveryDay": "آپ کو ہر دن خوشی کی خواہش کرتا ہوں۔",
"newMessage": "نیا پیغام",
"createRoomSuccsess": "کمرہ کامیابی بنائیں!",
"contactUs": "مجھ سے رابطہ کریں۔",
"systemAnnouncementTips1": "دھوکہ دہی سے بچاؤ:",
"systemAnnouncementTips": "معلومات کی تصدیق صرف سرکاری چینلز کے ذریعے کریں۔ کبھی بھی تھرڈ پارٹی سافٹ ویئر ڈاؤن لوڈ نہ کریں، ذاتی ڈیٹا کا اشتراک نہ کریں، یا بیرونی درخواستوں کی بنیاد پر رقم کی منتقلی نہ کریں۔ آفیشل اسٹاف آئی ڈیز صرف 10000، 10003، اور 10086 ہیں۔ کسی بھی شبہ کی صورت میں، روکیں اور بذریعہ رپورٹ کریں",
"systemAnnouncement": "سسٹم کا اعلان",
"doNotClickUnfamiliarTips": "غیر مانوس لنکس پر کلک نہ کریں، کیونکہ وہ آپ کی ذاتی معلومات کو بے نقاب کر سکتے ہیں۔ اپنے شناختی کارڈ یا بینک کارڈ کی تفصیلات کبھی بھی کسی کے ساتھ شیئر نہ کریں۔",
"atTag": "@Tag",
"sayHi2": "ہیلو کہو",
"canSendMsgTips": "دونوں فریقوں کو نجی پیغامات بھیجنے سے پہلے ایک دوسرے کی پیروی کرنے کی ضرورت ہے۔",
"msgSendRedEnvelopeTips": "*سرخ لفافوں پر 10% سروس فیس وصول کی جائے گی، اور وصول کنندگان کو سرخ لفافے کی قیمت کا صرف 90% وصول کیا جائے گا۔ بھیجنے والے کی دولت کی سطح لیول 10 سے زیادہ ہونی چاہیے۔",
"leavFamilyTips": "کیا آپ واقعی اپنا موجودہ قبیلہ چھوڑنا چاہتے ہیں؟ قبیلے میں دوبارہ شامل ہونے کے لیے آپ کو 1 دن انتظار کرنا پڑے گا۔",
"leavingTheFamily": "خاندان کو چھوڑ کر",
"familyNotifcations": "خاندانی اطلاعات",
"familyNews": "خاندانی خبریں۔",
"reapply": "دوبارہ درخواست دیں۔",
"cancelRequestFamilyMsg": "فیملی 【{1} کی فیملی】 میں شامل ہونے کی آپ کی درخواست کا جائزہ لیا جا رہا ہے، کیا آپ واقعی درخواست کو منسوخ کرنا چاہتے ہیں؟",
"cancelRequest": "درخواست منسوخ کریں۔",
"pending": "زیر التواء",
"familyAnnouncement": "خاندانی اعلان",
"enterFamilyAnnouncement": "براہ کرم خاندانی اعلان درج کریں۔",
"disbandTheFamily": "خاندان کو توڑ دو",
"editFamily": "فیملی میں ترمیم کریں۔",
"supporter": "حمایتی",
"rechargeSuccessful": "ریچارج کامیاب",
"transactionReceived": "لین دین موصول ہوا۔",
"createFamilySuccess": "خاندانی کامیابی بنائیں۔",
"numberOfSign": "نشان کی تعداد: {1}",
"hostWeeklyRank": "میزبان ہفتہ وار رینک",
"supporterWeeklyRank": "سپورٹر ہفتہ وار رینک",
"memberList": "ممبر لسٹ",
"treasureChest": "خزانہ سینے",
"xxfamily": "{1} کا خاندان",
"applicationRecord": "درخواست کا ریکارڈ",
"createFamily": "فیملی بنائیں",
"familyName": "خاندانی نام",
"createAFamily": "ایک خاندان بنائیں",
"searchFamilyIdHint": "براہ کرم خاندان کے مالک کی شناخت درج کریں۔",
"enterFamilyInfo": "برائے مہربانی اپنے خاندان کا مختصر تعارف کروائیں!",
"enterFamilyName": "براہ کرم اپنا خاندانی نام درج کریں۔",
"familyInfo": "خاندانی تعارف",
"joinFamily": "ایک خاندان میں شامل ہوں۔",
"appUpdateTip": "ایپ کا ایک نیا ورژن ہے ({1})، براہ کرم جائیں اور اسے ڈاؤن لوڈ کریں؟",
"ownerIncomeCoins": "مالک کی آمدنی:{1} سکے",
"game": "کھیل",
"skip2": "چھوڑیں۔",
"coins4": "سکے",
"currentVip": "موجودہ وی ​​آئی پی",
"weekStart": "ہفتہ کا آغاز",
"forMoreRewardsPleaseCheckTheTaskCenter": "مزید انعامات کے لیے، براہ کرم ٹاسک سینٹر کو چیک کریں۔",
"kingQuuen": "کنگ کوئن",
"ramadan": "رمضان",
"updateNow": "ابھی اپ ڈیٹ کریں۔",
"allGames": "تمام گیمز",
"fishClass": "فش کلاس",
"greedyClass": "لالچی طبقہ",
"raceSeries": "ریس سیریز",
"slotsClass": "سلاٹس کلاس",
"others": "دوسرے",
"hotGames": "گرم، شہوت انگیز کھیل",
"chatBox": "چیٹ باکس",
"termsOfServicePrivacyPolicyTips": "جاری رکھ کر آپ سروس کی شرائط اور رازداری کی پالیسی سے اتفاق کرتے ہیں۔",
"and": "اور",
"pleaseSelectTheTypeContent": "براہ کرم توہین آمیز مواد کی قسم منتخب کریں۔",
"wearHonor": "عزت پہن لو",
"illegalInformation": "غیر قانونی معلومات",
"inappropriateContent": "نامناسب مواد",
"personalAttack": "ذاتی حملہ",
"confirm": "تصدیق کریں۔",
"spam": "سپیم",
"countdownMinutes": "الٹی گنتی منٹ:",
"number2": "نمبر:",
"fraud": "فراڈ",
"received": "موصول ہوا۔",
"currentProgress": "موجودہ پیشرفت",
"currentStage": "موجودہ مرحلہ:{1}",
"roomReward2": "کمرے کا انعام:{1}",
"roomReward": "کمرہ انعام",
"expirationTime": "میعاد ختم ہونے کا وقت",
"ownerSendTheRedEnvelope": "مالک انعامی سکے بھیجیں۔",
"rewardCoins": "انعامی سکے:{1} سکے",
"lastWeekProgress": "پچھلے ہفتے کی پیشرفت",
"redEnvelopeTips2": "*اگر وقت کی حد کے اندر سرخ بیگ کا دعویٰ نہیں کیا جاتا ہے، تو باقی سکے اس صارف کو واپس کردیئے جائیں گے جس نے سرخ بیگ بھیجا تھا۔",
"goToRecharge": "ریچارج پر جائیں۔",
"deleteAccount2": "اکاؤنٹ حذف کریں({1}s)",
"areYouSureYouWantToDeleteYourAccount": "کیا آپ واقعی اپنا اکاؤنٹ حذف کرنا چاہتے ہیں؟",
"insufhcientGoldsGoToRecharge": "ناکافی سونا، ابھی ریچارج کریں!",
"coins2": "{1}سکے",
"remainingNumberTips": "دستیاب کی بقیہ تعداد:({1}/{2})",
"collectionTimeTips": "جمع کرنے کا وقت:{1}({2}/{3})",
"sendARedEnvelope": "ایک سرخ لفافہ بھیجیں۔",
"sendRedPackConfirmTips": "کیا آپ واقعی سرخ پیکٹ بھیجنا چاہتے ہیں؟",
"redEnvelopeSendingRecords": "سرخ لفافہ بھیجنے کا ریکارڈ:",
"redEnvelope": "سرخ لفافہ",
"redEnvelopeRecTips2": "سرخ لفافوں کا دعویٰ کیا گیا ہے۔",
"redEnvelopeRecTips3": "سرخ لفافے جمع کرنے کا وقت ختم ہو گیا ہے!",
"openTheTreasureChest": "ایک سرخ بیگ باہر بھیجا!",
"redEnvelopeRecTips1": "کمائے گئے سکے آپ کے بٹوے میں جمع کر دیے گئے ہیں۔",
"redEnvelopeTips1": "سکے:",
"roomTools": "کمرے کے اوزار:",
"entertainment": "تفریح:",
"reportSucc": "رپورٹ کامیاب",
"pornography": "فحش نگاری",
"reportInputTips": "براہ کرم مسئلہ کو زیادہ سے زیادہ تفصیل سے بیان کریں تاکہ ہم اسے سمجھ سکیں اور حل کر سکیں۔",
"cancel": "منسوخ کریں۔",
"join": "شمولیت",
"items": "اشیاء",
"vistors": "Vistors",
"fans": "پرستار",
"balanceNotEnough": "سونے کے سکے کا ناکافی بیلنس۔ کیا آپ ٹاپ اپ پر جانا چاہتے ہیں؟",
"skip": "چھوڑیں {1}",
"wearMedal": "میڈل پہنیں۔",
"activityHonor": "سرگرمی کا اعزاز",
"achievementHonor": "کامیابی کا اعزاز",
"youDontHaveAnyHonorYet": "آپ کے پاس ابھی تک کوئی عزت نہیں ہے۔",
"letGoToWatch": "آئیے دیکھنے چلتے ہیں!",
"launchedARocket": "ایک راکٹ لانچ کیا",
"sendUserId": "UserID بھیجیں:{1}",
"giveUpIdentity": "شناخت چھوڑ دو",
"leaveRoomIdentityTips": "کیا آپ واقعی کمرے کی شناخت ترک کرنا چاہتے ہیں؟",
"joinMemberTips2": "کیا آپ ایک رکن کے طور پر کمرے میں شامل ہونے کی تصدیق کرنا چاہتے ہیں؟",
"sureUnfollowThisRoom": "اس کمرے کی پیروی ختم کرنا یقینی ہے؟",
"welcomeMessage": "ہماری درخواست میں خوش آمدید، {name}!",
"settings": "ترتیبات",
"account": "اکاؤنٹ",
"common": "عام",
"delete": "حذف کریں۔",
"copy": "کاپی",
"bio": "بایو",
"useCoupontips": "کیا آپ واقعی کوپن استعمال کرنا چاہتے ہیں؟",
"searchUserId": "صارف کی شناخت تلاش کریں۔",
"sendUser": "صارف بھیجیں۔",
"hobby": "شوق",
"sendCoupontips": "کیا آپ واقعی یہ کوپن اس صارف کو بھیجنا چاہتے ہیں؟",
"youDontHaveAnyCouponsYet": "آپ کے پاس ابھی تک کوئی کوپن نہیں ہے۔",
"recall": "یاد کرنا",
"youHaventFollowed": "آپ نے کسی کمرے کی پیروی نہیں کی ہے۔",
"deleteFromMyDevice": "میرے آلے سے حذف کریں۔",
"deleteOnAllDevices": "تمام آلات پر حذف کریں۔",
"messageHasBeenRecalled": "یہ پیغام واپس بلا لیا گیا ہے۔",
"recallThisMessage": "یہ پیغام یاد ہے؟",
"language": "زبان",
"feedback": "تاثرات",
"signedin": "سائن ان",
"receiveSucc": "کامیابی سے دعویٰ کیا گیا۔",
"about": "کے بارے میں",
"aboutUs": "ہمارے بارے میں",
"theme": "تھیم",
"wealthLevel": "دولت کی سطح",
"userLevel": "صارف کی سطح",
"goToUpload": "اپ لوڈ پر جائیں۔",
"logout": "لاگ آؤٹ کریں۔",
"luck": "قسمت",
"level": "سطح",
"vip": "وی آئی پی",
"vip1": "VIP1",
"vip2": "VIP2",
"vip3": "VIP3",
"vip4": "VIP4",
"vip5": "VIP5",
"vip6": "VIP6",
"themeGoToUploadTips": "1. اپ لوڈ کامیاب ہونے کے بعد 24 گھنٹے کے اندر جائزہ لیں۔\n2. جائزہ ناکام ہونے پر تمام سکے واپس کر دیے جائیں گے۔",
"home": "گھر",
"explore": "دریافت کریں۔",
"me": "مجھے",
"socialPrivilege": "سماجی استحقاق",
"information": "معلومات",
"myPhoto": "میری تصویر",
"cpRequest": "سی پی کی درخواست",
"areYouSureYouWantToSpend3": "*اگر دوسرا فریق CP کی دعوت کو مسترد کرتا ہے، تو آپ کے سکے آپ کے بٹوے میں واپس کردیئے جائیں گے۔",
"areYouSureYouWantToSpend": "کیا آپ واقعی خرچ کرنا چاہتے ہیں؟",
"areYouSureYouWantToSpend2": "اس صارف کو CP دعوت نامہ بھیجنا ہے؟",
"cpSexTips": "ایک ہی جنس کے جوڑے نہیں بن سکتے۔",
"underReview": "زیر جائزہ",
"doYouWantToDeleteIt": "کیا آپ اسے حذف کرنا چاہتے ہیں؟",
"chooseFromAblum": "ابلم میں سے انتخاب کریں۔",
"spaceBackground": "خلائی پس منظر",
"editProfile": "پروفائل میں ترمیم کریں۔",
"sendTheCpRequest": "سی پی کی درخواست بھیجیں۔",
"addCp": "CP شامل کریں۔",
"partWays": "حصے کے طریقے",
"reconcile": "صلح کرنا",
"separated": "الگ",
"areYouSureYouWantToSpend5": "{1} نے آپ سے احساس کا اقرار کیا۔ اگر آپ قبول کرتے ہیں تو آپ جوڑے بن جائیں گے۔",
"areYouSureYouWantToSpend6": "{1} آپ کے ساتھ واپس جانا چاہتا ہے۔ اگر آپ صلح کرنے کا فیصلہ کرتے ہیں، تو آپ کا تمام سابقہ ​​ڈیٹا بحال ہو جائے گا۔",
"reconcileInvitationTips": "*اگر دوسرا فریق CP کی دعوت کو مسترد کرتا ہے، تو آپ کے سکے آپ کے بٹوے میں واپس کردیئے جائیں گے۔",
"reconcileInvitation": "دعوت نامہ میں صلح کریں۔",
"areYouSureYouWantToSpend4": "اس صارف کو مفاہمت کا دعوت نامہ بھیجنا ہے؟",
"partWaysTips": "*اگر ایک جوڑے میں سے ایک پارٹنر الگ ہونے کا انتخاب کرتا ہے، تو 7 دن کی کولنگ آف مدت ہوگی۔ اس وقت کے دوران، دونوں فریقین مصالحت کا انتخاب کر سکتے ہیں، اور تمام ڈیٹا کو مفاہمت پر بحال کر دیا جائے گا۔ اگر 7 دن کی مدت کے اختتام تک مصالحت کا انتخاب نہیں کیا جاتا ہے، تو جوڑے کا ڈیٹا صاف کر دیا جائے گا۔",
"areYouSureYouWantToPartWaysWithYourCP": "کیا آپ واقعی اپنے CP سے الگ ہونا چاہتے ہیں؟",
"timeSpentTogether": "ایک ساتھ گزارا وقت: {1} دن",
"firstDay": "پہلا دن:{1}",
"numberOfMyCPs": "میرے CPs کی تعداد:({1}/{2})",
"props": "سہارے",
"medal": "میڈل",
"win": "جیت",
"dice": "ڈائس",
"rps": "آر پی ایس",
"areYouSureToCancelDynamicBlacklist": "کیا آپ یقینی طور پر متحرک بلیک لسٹ کو منسوخ کرنا چاہتے ہیں؟",
"blockUserDynamic": "یوزر ڈائنامک کو بلاک کریں۔",
"unblockUserDynamic": "یوزر ڈائنامک کو غیر مسدود کریں۔",
"operationFail": "آپریشن ناکام رہا۔",
"likedYourComment": "آپ کا تبصرہ پسند آیا۔",
"likedYourDynamic": "آپ کا Dynamic پسند آیا۔",
"doYouWantToKeepTheDraft": "کیا آپ مسودہ رکھنا چاہتے ہیں؟",
"cantSendDynamicTips": "آپ کو فی الحال ڈائنامکس پوسٹ کرنے سے روک دیا گیا ہے۔",
"operationsAreTooFrequent": "آپریشنز بہت زیادہ ہوتے ہیں۔",
"luckNumber": "لک نمبر",
"relationShip": "رشتہ",
"couple": "جوڑا {1}:",
"couple2": "جوڑے",
"reject": "رد کرنا",
"cpList": "سی پی کی فہرست",
"sound2": "آواز",
"hot": "گرم",
"selectCountry": "ملک منتخب کریں۔",
"giftEffect": "گفٹ اثر",
"winFloat": "ون فلوٹ",
"giftVibration": "لکی گفٹ ایفیکٹس",
"accept": "قبول کریں۔",
"noMatchedCP": "کوئی مماثل CP نہیں ہے۔",
"inviteYouToBecomeBD": "آپ کو بی ڈی بننے کی دعوت دیں۔",
"adminInviteRechargeAgent": "آپ کو ریچارج ایجنٹ بننے کے لیے مدعو کریں۔",
"confirmAcceptTheInvitation": "دعوت قبول کرنے کی تصدیق کریں؟",
"confirmDeclineTheInvitation": "دعوت نامے کے انکار کی تصدیق کریں؟",
"host": "میزبان",
"following": "پیروی کرنا",
"agent": "ایجنسی",
"approved": "منظور شدہ",
"agreeJoinFamilyTips": "کیا آپ اس صارف کو فیملی میں شامل ہونے کی اجازت دیتے ہیں؟",
"refuseJoinFamilyTips": "کیا آپ کو صارف کو خاندان میں شامل ہونے سے انکار کر دینا چاہیے؟",
"onlineUsers": "آن لائن صارفین({1}/{2}):",
"applyToJoin": "شامل ہونے کے لیے درخواست دیں۔",
"supporterList": "حامیوں کی فہرست",
"hostList": "میزبان کی فہرست",
"upToAdmins": "{1} ایڈمنز تک",
"upToMembers": "{1} اراکین تک",
"levelPrivileges": "سطحی مراعات",
"familyLevel": "خاندانی سطح",
"kickOutOfFamily": "خاندان سے نکال دو",
"disbandTheFamilyTips": "کیا آپ واقعی خاندان کو منقطع کرنا چاہتے ہیں؟",
"setAsFamilyAdmin": "فیملی ایڈمن کے طور پر سیٹ کریں۔",
"cancelFamilyAdmin": "فیملی ایڈمن کینسل کریں۔",
"kickFamilyUserTips": "کیا آپ واقعی اس صارف کو خاندان سے نکالنا چاہتے ہیں؟",
"familyMember2": "فیملی ممبر({1}/{2}):",
"familyMember3": "فیملی ممبر({1}):",
"familyAdmin2": "فیملی ایڈمن({1}/{2}):",
"familyOwner2": "خاندان کا مالک:",
"ra": "RA",
"roomAnnouncement": "کمرے کا اعلان",
"family3": "{1} کا خاندان",
"help": "مدد",
"rejected": "مسترد",
"boxContributeTips": "سرمایہ کاری آج ہو چکی ہے، براہ کرم دوبارہ سرمایہ کاری نہ کریں۔",
"familyHelpTips": "(1) اگر آپ 50 سکوں کی سرمایہ کاری کرتے ہیں، تو 5 افراد کی سرمایہ کاری کرنے پر پہلا ٹریژر چیسٹ کھل جائے گا۔ آپ 50 سکے وصول کرنے کے لیے کلک کر سکتے ہیں۔ آپ 50 سکے وصول کر سکتے ہیں۔\n(3) جب 20 لوگ سرمایہ کاری کریں گے تو دوسرا خزانہ سینے کو کھول دیا جائے گا۔ آپ 100 سکے وصول کر سکتے ہیں۔\n(4) اگر ٹریژر چیسٹ کا دعویٰ کرنے کے لیے صارفین کی مطلوبہ تعداد اسی دن نہیں پہنچتی ہے، تو ٹریژر چیسٹ کی پیشرفت اگلے دن دوبارہ ترتیب دی جائے گی۔\n(5) خزانے کے سینے کی پیشرفت اگلے دن دوبارہ ترتیب دی جائے گی۔ وہ صارفین جنہوں نے ابھی تک اسی دن اپنے خزانے کا دعویٰ نہیں کیا ہے انہیں وقت پر ان کا دعویٰ کرنا چاہیے۔\n(6)ٹریزر چیسٹ ری سیٹ کا وقت: 00:00 سعودی وقت۔",
"bd": "بی ڈی",
"coupon": "کوپن",
"search": "تلاش کریں۔",
"get": "حاصل کریں۔",
"inRocket": "راکٹ میں",
"roomRocketHelpTips": "1. کمرے میں تحائف بھیجنے سے راکٹ توانائی میں اضافہ ہوتا ہے۔ *1 سونے کا سکہ تحفہ = 1 راکٹ انرجی پوائنٹ؛ خوش قسمت تحائف تحفے کے سونے کے سکوں کی قیمت کا 4% راکٹ توانائی میں اضافہ کرتے ہیں۔\n2. راکٹ کی توانائی مکمل طور پر چارج ہونے کے بعد، کمرہ راکٹ کو لانچ کر سکتا ہے۔ لانچ کے بعد انعامات خود بخود تقسیم ہو جائیں گے۔\n3. راکٹ کی مختلف سطحیں مختلف انعامات پیش کرتی ہیں۔\n4. جب راکٹ لانچ ہوتا ہے، کمرے میں موجود تمام صارفین راکٹ کے انعام کا دعوی کر سکتے ہیں۔5۔ راکٹ توانائی ہر روز 00:00 پر دوبارہ ترتیب دی جاتی ہے۔",
"roomRocketRecordAction": "ریکارڈ",
"roomRocketRewardTop1": "Top1",
"roomRocketRewardSetOff": "لانچ",
"roomRocketRewardInRoom": "کمرے میں",
"roomRocketResetCountdown": "ری سیٹ ہونے میں 23 گھنٹے، 59 منٹ اور 59 سیکنڈ باقی",
"roomRocketRecordRoom": "کمرہ",
"roomRocketRecordReward": "انعام",
"roomRocketRecordLast35Days": "صرف گزشتہ 35 دنوں کے ریکارڈ دکھائیں",
"couponRecord": "کوپن کے استعمال کا ریکارڈ",
"inRoom": "کمرے میں",
"searchCouponHint": "کوپن تلاش کریں۔",
"giftCounter": "گفٹ کاؤنٹر",
"bDLeaderInviteYouToBecomeBDLeader": "آپ کو BDLeader بننے کی دعوت دیں۔",
"wins": "جیتتا ہے",
"inviteYouToBecomeHost": "آپ کو میزبان بننے کی دعوت دیں۔",
"friends": "دوستو",
"deleteConversationTips": "کیا آپ واقعی اس صارف کے ساتھ چیٹ کی سرگزشت کو حذف کرنا چاہتے ہیں؟",
"propMessagePrompt": "پروپ میسج پرامپٹ",
"inputUserId": "یوزر آئی ڈی درج کریں۔",
"fromLuckyGifts": "خوش قسمت تحائف سے",
"receive": "وصول کریں۔",
"checkInSuccessful": "چیک ان کامیاب",
"sginTips": "آپ کو ہر روز لاگ ان کرنے کے پہلے وقت پر انعام ملے گا۔ اگر آپ اپنے لاگ ان میں خلل ڈالتے ہیں، تو آپ کے دوبارہ لاگ ان ہونے پر انعام کا حساب پہلے دن سے لگایا جائے گا۔",
"vipBadge": "VIP بیج",
"vipProfileFrame": "VIP پروفائل فریم",
"vipProfileCard": "VIP پروفائل کارڈ",
"popular": "مقبول",
"recommend": "تجویز کریں۔",
"follow": "پیروی کریں۔",
"history": "تاریخ",
"hotRooms": "گرم کمرے",
"viewMore": "مزید دیکھیں",
"noData": "کوئی ڈیٹا نہیں۔",
"users": "صارفین",
"rooms": "کمرے",
"coins": "سکے",
"unread": "ان پڑھ",
"read": "پڑھیں",
"image": "[تصویر]",
"video": "[ویڈیو]",
"sound": "[آواز]",
"gift2": "[تحفہ]",
"clickHereToStartChatting": "کچھ بولو.....",
"receivedAMessage": "[ایک پیغام موصول ہوا]",
"confirmSwitchMicModelTips": "کیا آپ سیٹنگ موڈ میں سوئچ کی تصدیق کرتے ہیں؟",
"number": "نمبر",
"album": "البم",
"camera": "کیمرہ",
"system": "سسٹم",
"notifcation": "نوٹس",
"inviteYouToBecomeAgent": "آپ کو ایجنسی بننے کے لیے مدعو کریں۔",
"myMusic": "میری موسیقی",
"add": "شامل کریں۔",
"pullToLoadMore": "مزید لوڈ کرنے کے لیے کھینچیں۔",
"loadingFailedClickToRetry": "لوڈنگ ناکام، دوبارہ کوشش کرنے کے لیے کلک کریں۔",
"releaseToLoadMore": "مزید لوڈ کرنے کے لیے ریلیز کریں۔",
"haveMyLimits": "---میری حدود ہیں۔---",
"music": "موسیقی",
"free": "مفت",
"charm": "تحفہ کی توجہ",
"start": "شروع کریں۔",
"vipUseThisThemeTips": "صرف VlP لیول پر پورا اترنے والے اس تھیم کو استعمال کر سکتے ہیں۔",
"stop": "رک جاؤ",
"chats": "چیٹس",
"family": "خاندان",
"refuse": "انکار",
"agree": "متفق",
"thisFeatureIsCurrentlyUnavailable": "یہ فیچر فی الحال دستیاب نہیں ہے۔",
"pleaseSelectTheRecipient": "براہ کرم وصول کنندہ کو منتخب کریں۔",
"searchMemberIdHint": "براہ کرم ممبر کی شناخت درج کریں۔",
"unclaimedRedEnvelopes": "غیر دعویدار سرخ لفافے 24 گھنٹوں میں واپس کیے جاتے ہیں۔",
"redEnvelopeNotYetClaimed": "سرخ لفافے کا ابھی تک دعویٰ نہیں کیا گیا۔",
"redEnvelopeAmount": "سرخ لفافے کی رقم: {1} سکے",
"sentARedEnvelope": "ایک سرخ لفافہ بھیجا۔",
"theRedEnvelopeHasExpired": "سرخ لفافے کی میعاد ختم ہو چکی ہے۔",
"joinRequest": "درخواست میں شامل ہوں۔",
"welcomeToMyFamily": "میرے خاندان میں خوش آمدید!",
"scrollToTheBottom": "نیچے تک سکرول کریں۔",
"gameRules": "کھیل کے قوانین:",
"charmGameRulesTips": "مائیک پر تمام صارفین کے موصولہ گفٹ کوائن، 1 سکہ = 1 سکور (لکی گفٹ 1 کوائن = 0.04 سکور) دکھانے کے لیے ڈیش بورڈ کو آن کریں۔",
"inputYourOldPassword": "اپنا پرانا پاس ورڈ درج کریں۔",
"enterYourOldPassword": "اپنا پرانا پاس ورڈ درج کریں۔",
"setYourPassword": "اپنا پاس ورڈ سیٹ کریں۔",
"enterYourNewPassword": "اپنا نیا پاس ورڈ درج کریں۔",
"confirmYourPassword": "اپنے پاس ورڈ کی تصدیق کریں۔",
"theTwoPasswordsDoNotMatch": "دونوں پاس ورڈ مماثل نہیں ہیں۔",
"resetLoginPasswordtTips2": "پاس ورڈ 8-16 حروف لمبا ہونا چاہیے اور بڑے اور چھوٹے انگریزی حروف اور اعداد کا مجموعہ ہونا چاہیے (صرف نمبر نہیں)",
"resetLoginPassword": "لاگ ان پاس ورڈ کو دوبارہ ترتیب دیں۔",
"resetLoginPasswordtTips1": "اپنی یوزر آئی ڈی یا وینٹی آئی ڈی کے ساتھ لاگ ان کریں۔ اسلان اکاؤنٹ سے لاگ ان کرنا زیادہ محفوظ ہے۔",
"localMusic": "مقامی موسیقی",
"setLoginPassword": "لاگ ان پاس ورڈ سیٹ کریں۔",
"confirmSwitchMicThemeTips": "کیا آپ سیٹ سٹائل کے سوئچ کی تصدیق کرتے ہیں؟",
"pleaseUpgradeYourVipLevelFirst": "براہ کرم پہلے اپنا VIP لیول اپ گریڈ کریں۔",
"micTheme": "مائک تھیم",
"classicMic": "کلاسک {1} مائیک",
"yesterday": "کل {1}",
"monday": "پیر {1}",
"tuesday": "منگل {1}",
"wednesday": "بدھ {1}",
"thursday": "جمعرات {1}",
"friday": "جمعہ {1}",
"saturday": "ہفتہ {1}",
"sunday": "اتوار {1}",
"acceptedYour": "{1} نے آپ کا قبول کیا۔",
"youAccepted": "آپ نے {1} کو قبول کیا",
"openRedPackDialogTip": "سرخ لفافہ",
"micManagement": "مائیک مینجمنٹ",
"vipChatBox": "وی آئی پی چیٹ باکس",
"vipRoomCoverBorder": "وی آئی پی روم کور بارڈر",
"bdCenter": "بی ڈی سینٹر",
"renewVip": "VIP کی تجدید کریں۔",
"rechargeAgency": "ریچارج ایجنسی",
"adminCenter": "ورک سینٹر",
"goldList": "گولڈ لسٹ",
"followList": "فالو لسٹ",
"fansList": "شائقین کی فہرست",
"daily": "روزانہ",
"cp": "سی پی",
"female": "خاتون",
"male": "مرد",
"identity": "شناخت",
"adjust": "ایڈجسٹ کریں۔",
"warning": "وارننگ",
"screenshotTips": "اسکرین شاٹ (3 تک)",
"roomNotice": "کمرے کا نوٹس",
"roomTheme": "کمرے کی تھیم",
"description": "تفصیل:",
"inputDesHint": "براہ کرم مسئلہ کو زیادہ سے زیادہ تفصیل سے بیان کریں تاکہ ہم اسے سمجھ سکیں اور حل کر سکیں۔",
"roomProfilePicture": "کمرے کی پروفائل تصویر",
"userProfilePicture": "صارف کی پروفائل تصویر",
"userName": "صارف کا نام",
"pleaseSelectTheTypeToProcess": "براہ کرم عمل کرنے کے لیے قسم کا انتخاب کریں:",
"roomEditing": "روم ایڈیٹنگ",
"setAccount": "اکاؤنٹ سیٹ کریں۔",
"userEditing": "یوزر ایڈیٹنگ",
"enterTheUserId": "صارف کی شناخت درج کریں۔",
"enterTheRoomId": "روم آئی ڈی درج کریں۔",
"deleteAccount": "اکاؤنٹ حذف کریں۔",
"becomeAgent": "ایجنٹ بنیں۔",
"enterNickname": "عرفی نام درج کریں۔",
"selectYourCountry": "اپنا ملک منتخب کریں۔",
"inviteCode": "کوڈ کو مدعو کریں۔",
"magic": "جادو",
"list": "فہرست",
"walletBalance": "والیٹ بیلنس:",
"canOnlyBeShown": "*صرف آپ کے علاقے کے تمام صارفین کو دکھایا جا سکتا ہے۔",
"sendMessage": "پیغام بھیجیں۔",
"availableCountries": "دستیاب ممالک:",
"currentBalance": "موجودہ بیلنس:",
"successfulTransaction": "{1} کامیاب لین دین",
"hasBeenACoinAgencyForDays": "{1} دنوں سے سکے کی ایجنسی ہے۔",
"luckGiftSpecialEffects": "خوش قسمت تحفہ حرکت پذیری کے اثرات",
"theVideoSizeCannotExceed": "ویڈیو کا سائز 50M سے زیادہ نہیں ہو سکتا",
"weekly": "ہفتہ وار",
"rechargeRecords": "ریچارج ریکارڈز",
"balance": "توازن:",
"appStore": "ایپ اسٹور",
"searchCountry": "ملک تلاش کریں...",
"googlePay": "گوگل پے",
"biggestDiscount": "سب سے بڑی رعایت",
"officialRechargeAgent": "سرکاری ریچارج ایجنٹ",
"customizedGiftRulesContent": "اپنی مرضی کے مطابق تحفہ کیسے حاصل کریں:\n1. اس بات کا تعین کریں کہ آیا صارف اپنی موجودہ دولت کی سطح کی بنیاد پر حسب ضرورت تحفہ وصول کرنے کا اہل ہے۔\n(1) جب صارف کی دولت کی سطح ≥35 ہو: صارف حسب ضرورت تحفہ کے لیے ایک بار ویڈیو اپ لوڈ کر سکتا ہے۔ ہم صارف کی موجودہ پروفائل تصویر کو بطور تحفہ تصویر اور فراہم کردہ ویڈیو کو \"حسب ضرورت\" پر تحفہ اثر کے طور پر استعمال کریں گے۔ پیداوار میں کچھ وقت لگے گا، اور اسٹور میں دستیاب ہوتے ہی ہم آپ کو مطلع کریں گے۔\n(2) جب صارف کی دولت کی سطح ≥45 ہو: صارف حسب ضرورت تحفہ کے لیے ایک بار ویڈیو اپ لوڈ کر سکتا ہے۔ ہم صارف کی موجودہ پروفائل تصویر کو بطور تحفہ تصویر اور فراہم کردہ ویڈیو کو \"حسب ضرورت\" پر تحفہ اثر کے طور پر استعمال کریں گے۔ پیداوار میں کچھ وقت لگے گا، اور اسٹور میں دستیاب ہوتے ہی ہم آپ کو مطلع کریں گے۔\n2. آپ ایپ پر مخصوص سرگرمیوں میں حصہ لے سکتے ہیں اور معیار کو پورا کرنے کے بعد، \"پیغام\" → \"ہم سے رابطہ کریں\" سیکشن کے ذریعے ہم سے رابطہ کر سکتے ہیں۔ سرگرمی کے اسکرین شاٹس اور ویڈیو فراہم کریں جسے آپ حسب ضرورت تحفہ کے لیے استعمال کرنا چاہتے ہیں۔ ہم آپ کی موجودہ پروفائل تصویر کو بطور تحفہ تصویر اور فراہم کردہ ویڈیو کو بطور تحفہ اثر استعمال کریں گے، پھر اسے \"حسب ضرورت\" کے تحت درج کریں۔ پیداوار میں کچھ وقت لگے گا، اور اسٹور میں دستیاب ہوتے ہی ہم آپ کو مطلع کریں گے۔\nحسب ضرورت گفٹ کی میعاد کی مدت اور اسے کیسے بڑھایا جائے:\nخصوصی حسب ضرورت تحفے شیلف پر 30 دن کی میعاد کے لیے دستیاب ہوں گے۔ بااثر اور متاثر کن صارفین کو اس نئے تجربے سے لطف اندوز ہونے اور اپنے ذاتی انداز کو ظاہر کرنے کے قابل بنانے کے لیے، وہ صارفین جو حسب ضرورت تحائف کے مالک ہیں وہ کسی بھی مہینے میں $500 کا ری چارج کر کے اپنے تمام حسب ضرورت تحائف کے شیلف ٹائم کو 30 دن تک بڑھا سکتے ہیں۔",
"customizedGiftRules": "حسب ضرورت گفٹ رولز",
"rulesUpload": "قواعد اور اپ لوڈ کریں۔",
"monthly": "ماہانہ",
"playLog": "پلے لاگ:",
"selectACountry": "ایک ملک منتخب کریں:",
"message": "پیغام",
"clearCache": "کیشے صاف کریں۔",
"customized": "اپنی مرضی کے مطابق",
"searchInputHint": "اکاؤنٹ/کمرہ نمبر درج کریں۔",
"kickRoomTips": "تمہیں کمرے سے نکال دیا گیا ہے۔",
"joinRoomTips": "کمرے میں شمولیت اختیار کی!",
"roomSetting": "کمرے کی ترتیب",
"roomDetails": "کمرے کی تفصیلات",
"systemRoomTips": "براہ کرم شائستگی اور احترام کو برقرار رکھیں۔ اسلان پر کوئی بھی فحش یا بیہودہ مواد سختی سے ممنوع ہے۔ خلاف ورزی میں پائے جانے والے کسی بھی اکاؤنٹ پر مستقل پابندی لگا دی جائے گی۔ ہم تمام صارفین سے درخواست کرتے ہیں کہ وہ اسلان کی کمیونٹی گائیڈ لائنز کی شعوری پابندی کریں۔",
"copiedToClipboard": "کلپ بورڈ پر کاپی ہو گیا۔",
"recharge": "ریچارج کریں۔",
"receivedFromALuckyGift": "ایک خوش قسمت تحفہ سے ملا۔",
"followedYou": "آپ کی پیروی کی۔",
"agentCenter": "ایجنسی سینٹر",
"areYouSureYouWantToClearLocalCache": "کیا آپ واقعی مقامی کیش کو صاف کرنا چاہتے ہیں؟",
"clearMessage": "اسکرین پیغامات کو صاف کریں۔",
"report": "رپورٹ",
"coins3": "سکے",
"giftSpecialEffects": "تحفے کے خصوصی اثرات",
"basicFeatures": "بنیادی خصوصیات",
"task": "کام",
"importantReminder": "اہم یاد دہانی",
"entryVehicleAnimation": "انٹری وہیکل اینیمیشن (VIP3)",
"floatingAnimationInGlobal": "عالمی سطح پر فلوٹنگ اینیمیشن",
"entryVehicleAnimation2": "VlP3 یا اس سے زیادہ مراعات کے حامل صارفین گاڑی کی اینیمیشن کو غیر فعال کرنے کے لیے فنکشن کا استعمال کر سکتے ہیں۔",
"dailyTasks": "روزانہ کے کام",
"enterRoomConfirmTips": "کیا آپ واقعی کمرے میں داخل ہونا چاہتے ہیں؟",
"followSucc": "کامیابی سے پیروی کی گئی۔",
"goldListort": "گولڈ لسٹ",
"rechargeList": "ریچارج کی فہرست",
"edit": "ترمیم کریں۔",
"swipeLeftOnTheFloatingScreenAreaToQuicklyCloseIt": "*تجویز: فلوٹنگ اسکرین ایریا کو تیزی سے بند کرنے کے لیے بائیں جانب سوائپ کریں۔",
"enterThisVoiceChatRoom": "اس وائس چیٹ روم میں داخل ہوں؟",
"go": "جاؤ",
"done": "ہو گیا",
"improvementTasks": "بہتری کے کام",
"save": "محفوظ کریں۔",
"kickPrevention": "کک کی روک تھام",
"freeChatSpeak": "مفت چیٹ اور بات کریں۔",
"vipExclusiveVehicles": "وی آئی پی خصوصی گاڑیاں",
"nickName": "عرفی نام",
"buyVip": "وی آئی پی خریدیں۔",
"gender": "جنس",
"unFollow": "پیروی ختم کریں۔",
"days": "دن",
"permanent": "مستقل",
"yourVipWillExpire": "آپ کا VIP {1} کو ختم ہو جائے گا",
"cantBuyVip": "خریداری جاری رکھنے سے قاصر ہے۔",
"country": "ملک",
"birthday": "سالگرہ",
"man": "آدمی",
"woman": "عورت",
"apple": "سیب",
"google": "گوگل",
"idIcon": "آئی ڈی آئیکن",
"inviteToBecomeAHost": "میزبان بننے کے لیے مدعو کریں۔",
"currentLevelPrivilegesAndCostumes": "موجودہ سطح کے مراعات اور ملبوسات: {1}",
"uploadGifAvatar": "GlF اوتار (VIP2) اپ لوڈ کریں",
"uploadProfilePicture": "پروفائل تصویر اپ لوڈ کریں۔",
"permissionSettings": "اجازت کی ترتیبات",
"vipMicSoundWave": "VIP مائک ساؤنڈ ویو",
"startVoiceParty": "ایک آواز پارٹی شروع کریں!",
"enterRoomTips": "{1} کمرے میں داخل ہوں۔",
"roomName": "کمرے کا نام",
"roomMember": "روم ممبر",
"pleaseSelectYourCountry": "براہ کرم اپنا ملک منتخب کریں۔",
"pleaseSelectYourGender": "براہ کرم اپنی جنس منتخب کریں۔",
"pleaseEnterNickname": "براہ کرم ایک عرفی نام درج کریں۔",
"countryRegion": "ملک اور علاقہ",
"dateOfBirth": "تاریخ پیدائش",
"mute": "خاموش",
"exit": "باہر نکلیں۔",
"mysteriousInvisibility": "پراسرار پوشیدگی",
"antiBlock": "اینٹی بلاک",
"createFamilyForFree": "مفت میں فیملی بنائیں",
"privateChat": "پرائیویٹ چیٹ",
"vipBirthdayGift": "VIP سالگرہ کا تحفہ",
"storeDiscount": "اسٹور ڈسکاؤنٹ {1} آف",
"membershipFreeChatSpeak": "ممبر شپ فری چیٹ اینڈ اسپیک",
"priorityRoomSorting": "ترجیحی کمرے کی چھانٹی",
"userColoredID": "صارف کی رنگین ID",
"vipEmoticon": "VIP جذباتی نشان ({1})",
"pleaseSelectaItem": "براہ کرم ایک آئٹم منتخب کریں۔",
"areYouRureRoRecharge": "کیا آپ ریچارج کرنے کا یقین رکھتے ہیں؟",
"mInimize": "رکھو",
"everyone": "ہر کوئی",
"shop": "دکان",
"roomOwner": "کمرے کا مالک",
"dailyTaskRewardBonus": "ڈیلی ٹاسک ریوارڈ بونس ({1} XP)",
"userLevelXPBoost": "یوزر لیول ایکس پی بوسٹ ({1} XP)",
"pleaseUpgradeYourVipLevel": "براہ کرم اپنے VIP لیول کو اپ گریڈ کریں۔",
"andAboveUsers": "{1} اور اوپر والے صارفین",
"privileges": "{1} مراعات",
"basicPermissions": "بنیادی اجازتیں۔",
"hostCenter": "میزبان مرکز",
"allOnMicrophone": "سب مائیک پر",
"usersOnMicrophone": "مائیک پر صارفین",
"allInTheRoom": "سب کمرے میں",
"send": "بھیجیں۔",
"crop": "فصل",
"goToUpgrade": "اپ گریڈ پر جائیں۔",
"exclusiveEmojiWillBeReleasedAfterBecoming": "خصوصی ایموجی بننے کے بعد جاری کیا جائے گا۔",
"preventBeingBlocked": "بلاک ہونے سے روکیں۔",
"enableRankIncognitoMode": "رینک انکوگنیٹو موڈ کو فعال کریں۔",
"avoidBeingKicked": "لات مارنے سے بچیں۔",
"vipPrivilege": "VIP استحقاق",
"finish": "ختم کرنا",
"takeTheMic": "مائیک لے لو",
"openTheMic": "مائیک کھولیں۔",
"muteTheMic": "مائیک خاموش کریں۔",
"unlockTheMic": "مائیک کو غیر مقفل کریں۔",
"leavelTheMic": "مائیک چھوڑ دیں۔",
"lockTheMic": "مائیک لاک کریں۔",
"removeTheMic": "مائیک ہٹا دیں۔",
"inviteToTheMicrophone": "مائیکروفون پر مدعو کریں۔",
"openUserProfleCard": "صارف پروفائل کارڈ کھولیں۔",
"obtain": "حاصل کریں",
"win2": "جیتیں {1}",
"backTheRoom": "پیچھے کا کمرہ",
"toConsume": "استعمال کرنا",
"howToUpgrade": "اپ گریڈ کیسے کریں؟",
"spendCoinsToGainExperiencePoints": "تجربہ پوائنٹس حاصل کرنے کے لیے سکے خرچ کریں۔",
"higherLevelFancierAvatarFrame": "اعلیٰ سطح، فینسیئر بیجز/اوتار فریم",
"medalAndAvatarFrameRewards": "میڈل اور اوتار فریم انعامات",
"all": "تمام",
"gift": "تحفہ",
"chat": "گپ شپ",
"owner": "مالک",
"store": "اسٹور",
"admin": "ایڈمن",
"member": "ممبر",
"guest": "مہمان",
"submit": "جمع کروائیں۔",
"claim": "دعویٰ",
"complete": "مکمل",
"shareTo": "سے شئیر کریں۔",
"copyLink": "لنک کاپی کریں۔",
"faceBook": "فیس بک",
"whatsApp": "واٹس ایپ",
"snapChat": "سنیپ چیٹ",
"taskNamePersonalGameConsume": "کھیل ہی کھیل میں خرچ",
"taskNameRoomNewMember": "نئے کمرے کے ممبران",
"taskNameRoomOwnerSendRedPacket": "کمرے کا مالک ایک سرخ پیکٹ بھیجتا ہے۔",
"taskNameRoomOwnerSendGiftUser": "کمرے کا مالک تحفہ بھیجتا ہے۔",
"taskNameRoomMicUser120Min": "مائیک پر 120+ منٹ والے اراکین",
"taskNameRoomMicUser60Min": "مائیک پر 60+ منٹ والے اراکین",
"taskNameRoomMicUser30Min": "مائیک پر 30+ منٹ والے اراکین",
"taskNamePersonalSendGift": "صارف کو تحفہ بھیجیں۔",
"taskNameRoomOnlineUserCount": "کمرہ آن لائن ممبران",
"taskNameRoomOwnerInviteMic": "ممبر کو مائک پر مدعو کریں۔",
"taskNameRoomUserSendGiftGold": "اراکین کی طرف سے تحفے میں سکے",
"taskNameRoomOwnerSendGiftGold": "کمرے کے مالک کی طرف سے تحفے میں دیئے گئے سکے",
"taskNamePersonalMagicGiftGold": "جادوئی تحائف بھیج کر سکے جیتے۔",
"taskNamePersonalLuckyGiftGold": "لکی گفٹ بھیج کر سکے جیتے۔",
"taskNameRoomOwnerMicTime": "کمرے کا مالک کمرے میں مائیک چلا رہا ہے۔",
"taskNamePersonalActiveInRoom": "دوسروں کے کمروں میں متحرک رہیں",
"taskNamePersonalMicInRoom": "مائیک پر جائیں۔",
"dailyCoinBonanzaRulesDetail": "1. روزانہ ذاتی کام اور روزانہ کمرے کے مالک کے کام فی صارف فی دن ایک بار مکمل کیے جا سکتے ہیں۔ سعودی وقت کے مطابق 00:00:00 پر ٹاسکس ری سیٹ ہو گئے۔\n2. روزانہ ذاتی کام صرف دوسروں کے کمروں میں مکمل کیے جاسکتے ہیں۔ کمرے کے مالک کے کام صرف آپ کے اپنے کمرے میں مکمل کیے جا سکتے ہیں۔\n3. تحفہ دینے کے کام صرف کمروں میں بھیجے گئے تحائف کو شمار کرتے ہیں، فیڈ پر بھیجے گئے تحائف کو نہیں۔\n4. اگر کسی بھی طرح سے ایک ہی ڈیوائس یا ایک ہی سم کارڈ کا استعمال کرتے ہوئے متعدد اکاؤنٹس بنائے گئے ہیں، تو تمام کاموں کے لیے انعامات کا صرف ایک بار دعوی کیا جا سکتا ہے۔",
"dailyCoinBonanzaRules": "ڈیلی کوائن بونانزا کے قواعد",
"roomOwnerTasks": "کمرے کے مالک کے کام",
"personalTasks": "ذاتی کام",
"noPromptsToday": "آج کوئی اشارہ نہیں ہے۔",
"getPaidToRefer": "حوالہ دینے کے لیے ادائیگی کریں۔",
"membershipFee": "رکنیت کی فیس",
"membershipFeeTips1": "براہ کرم اپنے کمرے کے لیے رکنیت کی فیس مقرر کریں۔ صارفین فیس ادا کر کے آپ کے کمرے میں شامل ہو سکتے ہیں۔",
"membershipFeeTips2": "کمرے کا رکن بننے کے لیے صارف کے لیے مطلوبہ سونا۔ کمرے کے مالک کو سونے کا 50% ملے گا۔",
"freePrice": "فیس: 0-10000",
"touristsSendText": "سیاح متن بھیجیں۔",
"touristsTakeToTheMic": "سیاح مائیک لے جاتے ہیں۔",
"theMembershipFee": "رکنیت کی فیس",
"theModificationsMade": "اس بار کی گئی ترمیم باہر نکلنے کے بعد محفوظ نہیں ہوگی۔",
"viewFrame": "فریم دیکھیں",
"enterRoomName": "کمرے کا نام درج کریں۔",
"headdress": "فریم",
"mountains": "گاڑیاں",
"purchaseIsSuccessful": "خریداری کامیاب ہے۔",
"buy": "خریدیں۔",
"followed": "پیروی کی۔",
"follow2": "پیروی کریں:{1}",
"fans2": "پرستار:{1}",
"vistors2": "دیکھنے والے:{1}",
"personal2": "ذاتی:",
"family2": "خاندان:",
"conntinue": "جاری رکھیں",
"confirmBuyTips": "کیا آپ واقعی خریدنا چاہتے ہیں؟",
"purchase": "خریداری",
"setRoomPassword": "کمرے کا پاس ورڈ سیٹ کریں۔",
"inputRoomPassword": "کمرے کا پاس ورڈ درج کریں۔",
"enter": "داخل کریں۔",
"createDynamicSuccess": "کامیابی کے ساتھ متحرک بنایا گیا۔",
"deleteDynamicTips": "کیا آپ واقعی اس ڈائنامک کو حذف کرنا چاہتے ہیں؟",
"deleteCommentTips": "کیا آپ واقعی یہ تبصرہ حذف کرنا چاہتے ہیں؟",
"deleteSuccessful": "حذف کرنا کامیاب!",
"itemsLeft": "آئٹمز رہ گئے۔",
"password": "پاس ورڈ",
"replySucc": "جواب کامیاب",
"comment": "تبصرہ",
"showMore": "مزید دکھائیں",
"showLess": "کم دکھائیں۔",
"enterPassword": "پاس ورڈ درج کریں۔",
"enterAccount": "اکاؤنٹ درج کریں۔",
"logIn": "لاگ ان کریں۔",
"saySomething": "کچھ بولو...",
"sayHi": "ہیلو کہو..",
"pleaseChatFfriendly": "براہ کرم دوستانہ بات چیت کریں۔",
"unLockTheRoom": "کمرے کو غیر مقفل کریں۔",
"operationSuccessful": "آپریشن کامیاب رہا۔",
"adminByHomeowner": "گھر کے مالک کے ذریعہ بطور منتظم مقرر کیا گیا ہے۔",
"memberByHomeowner": "گھر کے مالک کے ذریعہ ممبر کے طور پر سیٹ کیا جاتا ہے۔",
"touristByHomeowner": "گھر کے مالک کی طرف سے ایک سیاح کے طور پر مقرر کیا گیا ہے.",
"becomeHost": "میزبان بننے کے لیے درخواست دیں۔",
"superFans": "سپر شائقین:",
"setUpAnIdentity": "ایک شناخت قائم کریں۔",
"kickedOutOfRoom": "کمرے سے باہر نکال دیا۔",
"playGiftMusicAndDynamicMusic": "گفٹ میوزک اور ڈائنامک میوزک چلائیں۔",
"knapsack": "نیپ سیک",
"bdLeader": "بی ڈی لیڈر",
"picture": "تصویر",
"theImageSizeCannotExceed": "اپ لوڈ ناکام: فائل 2MB سے کم ہونی چاہیے۔",
"activity": "سرگرمی",
"alreadyAnAdministrator": "پہلے سے ایڈمنسٹریٹر",
"alreadyAnMember": "پہلے سے ہی ایک رکن ہے۔",
"alreadyAnTourist": "پہلے سے ہی ایک سیاح",
"touristsCannotSendMessages": "سیاح پیغامات نہیں بھیج سکتے",
"touristsAreNotAllowedToGoOnTheMic": "سیاحوں کو مائیک پر جانے کی اجازت نہیں ہے۔",
"lockTheRoom": "کمرے کو لاک کریں۔",
"special": "خاص",
"visitorList": "وزیٹر لسٹ",
"successfulWear": "کامیاب لباس",
"confirmUnUseTips": "کیا آپ اسے ہٹانے کی تصدیق کرتے ہیں؟",
"custom": "حسب ضرورت",
"myItems": "میری اشیاء",
"use": "استعمال کریں۔",
"unUse": "غیر استعمال",
"renewal": "تجدید",
"wallet": "پرس",
"profile": "پروفائل",
"giftwall": "گفٹ وال",
"announcement": "اعلان",
"blockedList": "مسدود فہرست",
"country2": "ملک:",
"sendTo": "کو بھیجیں۔",
"medals": "تمغے",
"activityMedal": "سرگرمی میڈل",
"achievementMedal": "اچیومنٹ میڈل",
"credits": "کریڈٹس: {1}",
"successfullyUnloaded": "کامیابی کے ساتھ اتار لیا گیا۔",
"expired": "میعاد ختم",
"day": "دن",
"inUse": "استعمال میں",
"confirmUseTips": "کیا آپ اس کے استعمال کی تصدیق کرنا چاہتے ہیں؟",
"pleaseUploadUserAvatar": "براہ کرم ایک اوتار اپ لوڈ کریں۔",
"joinMemberTips": "اگر آپ کمرے میں مہمان ہیں، تو آپ مائیکروفون نہیں لے سکتے۔",
"giftGivingSuccessful": "تحفہ دینا کامیاب۔",
"theAccountPasswordCannotBeEmpty": "اکاؤنٹ یا پاس ورڈ خالی نہیں ہو سکتا۔",
"invitesYouToTheMicrophone": "{1} آپ کو مائیکروفون پر مدعو کرتا ہے۔",
"english": "انگریزی",
"chinese": "چینی",
"arabic": "عربی",
"darkMode": "ڈارک موڈ",
"lightMode": "لائٹ موڈ",
"systemDefault": "سسٹم ڈیفالٹ",
"pleaseGetOnTheMicFirst": "براہ کرم پہلے مائیک پر جائیں۔",
"duration2": "دورانیہ:{1}"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

View File

@ -0,0 +1 @@

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

3
devtools_options.yaml Normal file
View File

@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:

1
fonts/.gitkeep Normal file
View File

@ -0,0 +1 @@

View File

@ -20,7 +20,5 @@
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>13.0</string>
</dict>
</plist>

View File

@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '13.0'
platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

View File

@ -1,50 +1,10 @@
PODS:
- agora_rtc_engine (6.5.3):
- AgoraIrisRTC_iOS (= 4.5.2-build.1)
- AgoraRtcEngine_iOS (= 4.5.2)
- agora_rtc_engine (6.5.4):
- AgoraIrisRTC_iOS (= 4.5.3-build.1)
- AgoraRtcEngine_Special_iOS (= 4.5.3.70)
- Flutter
- AgoraInfra_iOS (1.2.13.1)
- AgoraIrisRTC_iOS (4.5.2-build.1)
- AgoraRtcEngine_iOS (4.5.2):
- AgoraRtcEngine_iOS/AIAEC (= 4.5.2)
- AgoraRtcEngine_iOS/AIAECLL (= 4.5.2)
- AgoraRtcEngine_iOS/AINS (= 4.5.2)
- AgoraRtcEngine_iOS/AINSLL (= 4.5.2)
- AgoraRtcEngine_iOS/AudioBeauty (= 4.5.2)
- AgoraRtcEngine_iOS/ClearVision (= 4.5.2)
- AgoraRtcEngine_iOS/ContentInspect (= 4.5.2)
- AgoraRtcEngine_iOS/FaceCapture (= 4.5.2)
- AgoraRtcEngine_iOS/FaceDetection (= 4.5.2)
- AgoraRtcEngine_iOS/LipSync (= 4.5.2)
- AgoraRtcEngine_iOS/ReplayKit (= 4.5.2)
- AgoraRtcEngine_iOS/RtcBasic (= 4.5.2)
- AgoraRtcEngine_iOS/SpatialAudio (= 4.5.2)
- AgoraRtcEngine_iOS/VideoAv1CodecDec (= 4.5.2)
- AgoraRtcEngine_iOS/VideoAv1CodecEnc (= 4.5.2)
- AgoraRtcEngine_iOS/VideoCodecDec (= 4.5.2)
- AgoraRtcEngine_iOS/VideoCodecEnc (= 4.5.2)
- AgoraRtcEngine_iOS/VirtualBackground (= 4.5.2)
- AgoraRtcEngine_iOS/VQA (= 4.5.2)
- AgoraRtcEngine_iOS/AIAEC (4.5.2)
- AgoraRtcEngine_iOS/AIAECLL (4.5.2)
- AgoraRtcEngine_iOS/AINS (4.5.2)
- AgoraRtcEngine_iOS/AINSLL (4.5.2)
- AgoraRtcEngine_iOS/AudioBeauty (4.5.2)
- AgoraRtcEngine_iOS/ClearVision (4.5.2)
- AgoraRtcEngine_iOS/ContentInspect (4.5.2)
- AgoraRtcEngine_iOS/FaceCapture (4.5.2)
- AgoraRtcEngine_iOS/FaceDetection (4.5.2)
- AgoraRtcEngine_iOS/LipSync (4.5.2)
- AgoraRtcEngine_iOS/ReplayKit (4.5.2)
- AgoraRtcEngine_iOS/RtcBasic (4.5.2):
- AgoraInfra_iOS (= 1.2.13.1)
- AgoraRtcEngine_iOS/SpatialAudio (4.5.2)
- AgoraRtcEngine_iOS/VideoAv1CodecDec (4.5.2)
- AgoraRtcEngine_iOS/VideoAv1CodecEnc (4.5.2)
- AgoraRtcEngine_iOS/VideoCodecDec (4.5.2)
- AgoraRtcEngine_iOS/VideoCodecEnc (4.5.2)
- AgoraRtcEngine_iOS/VirtualBackground (4.5.2)
- AgoraRtcEngine_iOS/VQA (4.5.2)
- AgoraIrisRTC_iOS (4.5.3-build.1)
- AgoraRtcEngine_Special_iOS (4.5.3.70)
- app_links (6.4.1):
- Flutter
- AppAuth (1.7.6):
@ -132,13 +92,6 @@ PODS:
- Mantle
- SDWebImage
- SDWebImageWebPCoder
- flutter_inappwebview_ios (0.0.1):
- Flutter
- flutter_inappwebview_ios/Core (= 0.0.1)
- OrderedSet (~> 6.0.3)
- flutter_inappwebview_ios/Core (0.0.1):
- Flutter
- OrderedSet (~> 6.0.3)
- fluttertoast (0.0.2):
- Flutter
- google_sign_in_ios (0.0.1):
@ -223,13 +176,9 @@ PODS:
- on_audio_query_ios (0.0.1):
- Flutter
- SwiftyBeaver
- OrderedSet (6.0.3)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- permission_handler_apple (9.3.0):
- permission_handler_apple (9.4.8):
- Flutter
- PromisesObjC (2.4.0)
- PromisesSwift (2.4.0):
@ -289,7 +238,6 @@ DEPENDENCIES:
- Flutter (from `Flutter`)
- flutter_foreground_task (from `.symlinks/plugins/flutter_foreground_task/ios`)
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
- flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`)
- image_cropper (from `.symlinks/plugins/image_cropper/ios`)
@ -299,7 +247,6 @@ DEPENDENCIES:
- loading_indicator_view_plus (from `.symlinks/plugins/loading_indicator_view_plus/ios`)
- on_audio_query_ios (from `.symlinks/plugins/on_audio_query_ios/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
@ -316,9 +263,8 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- AgoraInfra_iOS
- AgoraIrisRTC_iOS
- AgoraRtcEngine_iOS
- AgoraRtcEngine_Special_iOS
- AppAuth
- AppCheckCore
- Firebase
@ -341,7 +287,6 @@ SPEC REPOS:
- libwebp
- Mantle
- nanopb
- OrderedSet
- PromisesObjC
- PromisesSwift
- QGVAPlayer
@ -373,8 +318,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_foreground_task/ios"
flutter_image_compress_common:
:path: ".symlinks/plugins/flutter_image_compress_common/ios"
flutter_inappwebview_ios:
:path: ".symlinks/plugins/flutter_inappwebview_ios/ios"
fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios"
google_sign_in_ios:
@ -393,8 +336,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/on_audio_query_ios/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
permission_handler_apple:
:path: ".symlinks/plugins/permission_handler_apple/ios"
shared_preferences_foundation:
@ -423,10 +364,9 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/webview_flutter_wkwebview/darwin"
SPEC CHECKSUMS:
agora_rtc_engine: 0c7d50312967c4dc31c3c45e50589ce48f57e08a
AgoraInfra_iOS: 3691b2b277a1712a35ae96de25af319de0d73d08
AgoraIrisRTC_iOS: eab58c126439adf5ec99632828a558ea216860da
AgoraRtcEngine_iOS: 97e2398a2addda9057815a2a583a658e36796ff6
agora_rtc_engine: c8ad6313ec7a1b2f28ab3328ff485df6d19a32de
AgoraIrisRTC_iOS: d6468160cad25d36c2b6cb5e9bd5b17ba4e58677
AgoraRtcEngine_Special_iOS: 48063561d21b07524358ee0a17abc6be762c58f7
app_links: 3dbc685f76b1693c66a6d9dd1e9ab6f73d97dc0a
AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73
AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f
@ -449,7 +389,6 @@ SPEC CHECKSUMS:
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
flutter_foreground_task: a159d2c2173b33699ddb3e6c2a067045d7cebb89
flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1
flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99
fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1
google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
@ -459,25 +398,23 @@ SPEC CHECKSUMS:
GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6
HydraAsync: 8d589bd725b0224f899afafc9a396327405f8063
image_cropper: 655b3ba703c9e15e3111e79151624d6154288774
image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a
in_app_purchase_storekit: d1a48cb0f8b29dbf5f85f782f5dd79b21b90a5e6
image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326
in_app_purchase_storekit: 22cca7d08eebca9babdf4d07d0baccb73325d3c8
iris_method_channel: 7d661cf3259b3009ae423508470dbeb9374446ee
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
loading_indicator_view_plus: 33a5d3527e9c6a7b470c79878613d01c4fa1fb65
Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d
nanopb: fad817b59e0457d11a5dfbde799381cd727c1275
on_audio_query_ios: 28a780e2d0d85d92d500ba6e12c6c8167022b2fa
OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564
permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d
permission_handler_apple: 92d754bbaa7361d436db2d6c3c1c2a0fdcec462e
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
QGVAPlayer: a0bca68c9bd6f1c8de5ac2d10ddf98be6038cce9
RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba
SDWebImage: e9fc87c1aab89a8ab1bbd74eba378c6f53be8abf
SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418
social_sharing_plus: e6024862e5a4be59ef8c97a93558cba1043628bf
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
@ -487,12 +424,12 @@ SPEC CHECKSUMS:
tencent_cloud_chat_sdk: 55e5fffe20f6b7937a26a674ccccb639563a9790
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
TXIMSDK_Plus_iOS_XCFramework: 5d1933192fb3b7ef2fe933f1623de4a0486a7fe2
url_launcher_ios: 694010445543906933d732453a59da0a173ae33d
video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
video_player_avfoundation: 3453f792138786248960ca029747fcd9f318ef52
video_thumbnail: b637e0ad5f588ca9945f6e2c927f73a69a661140
wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556
webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2
webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d
PODFILE CHECKSUM: a6f49a93e5f85201a2efdadcd7cf184b0e310894
PODFILE CHECKSUM: 8de56b17e20396b0ad891231e52eec09fd896d54
COCOAPODS: 1.16.2

View File

@ -744,6 +744,23 @@ class ATAppLocalizations {
String get roomRocketHelpTips => translate('roomRocketHelpTips');
String get roomRocketRecordAction => translate('roomRocketRecordAction');
String get roomRocketRewardTop1 => translate('roomRocketRewardTop1');
String get roomRocketRewardSetOff => translate('roomRocketRewardSetOff');
String get roomRocketRewardInRoom => translate('roomRocketRewardInRoom');
String get roomRocketResetCountdown => translate('roomRocketResetCountdown');
String get roomRocketRecordRoom => translate('roomRocketRecordRoom');
String get roomRocketRecordReward => translate('roomRocketRecordReward');
String get roomRocketRecordLast35Days =>
translate('roomRocketRecordLast35Days');
String get giveUpIdentity => translate('giveUpIdentity');
String get bdLeader => translate('bdLeader');
@ -1657,8 +1674,17 @@ class _ATAppLocalizationsDelegate
const _ATAppLocalizationsDelegate();
@override
bool isSupported(Locale locale) =>
['en', 'zh', 'ar','bn','tr'].contains(locale.languageCode);
bool isSupported(Locale locale) => [
'en',
'zh',
'ar',
'bn',
'tr',
'id',
'fil',
'ur',
'hi',
].contains(locale.languageCode);
@override
Future<ATAppLocalizations> load(Locale locale) async {

View File

@ -14,7 +14,7 @@ class Variant1Config implements AppConfig {
String get packageName => 'com.chat.auu';
@override
String get apiHost => 'https://api.atuchat.com/'; // API服务器
String get apiHost => 'https://aslanapi-test.haiyihy.com/';//'https://api.atuchat.com/'; // API服务器
@override
String get imgHost => 'https://img.atuchat.com/'; //

View File

@ -8,7 +8,15 @@ import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart';
import '../../chatvibe_data/models/enum/at_banner_open_type.dart';
class ATBannerUtils {
static void openBanner(ATIndexBannerRes item, BuildContext context) {
static bool isWebBanner(ATIndexBannerRes item) {
return item.content != ATBannerOpenType.ENTER_ROOM.name &&
ATStringUtils.isUrl(item.params ?? "");
}
static Future<void> openBanner(
ATIndexBannerRes item,
BuildContext context,
) async {
if (item.content == ATBannerOpenType.ENTER_ROOM.name) {
var params = item.params;
if (params != null && params.isNotEmpty) {
@ -17,7 +25,7 @@ class ATBannerUtils {
} else {
var params = item.params;
if (ATStringUtils.isUrl(params ?? "")) {
ATNavigatorUtils.push(
await ATNavigatorUtils.push(
context,
"${MainRoute.webViewPage}?url=${Uri.encodeComponent(params ?? "")}&showTitle=false",
replace: false,

View File

@ -1,6 +1 @@
enum ATBannerType{
EXPLORE_PAGE,
HOME_ALERT,
GAME,
ROOM
}
enum ATBannerType { EXPLORE_PAGE, HOME_ALERT, GAME, ROOM, ROOM_LIST }

View File

@ -191,6 +191,11 @@ class BaseNetworkClient {
//
DioException _handleDioError(DioException e) {
ATLoadingManager.veilRoutine();
final responseData = e.response?.data;
final errorCode =
responseData is Map<String, dynamic> ? responseData["errorCode"] : null;
final errorMsg =
responseData is Map<String, dynamic> ? responseData["errorMsg"] : null;
switch (e.type) {
case DioExceptionType.connectionTimeout:
return DioException(requestOptions: e.requestOptions, error: '连接超时');
@ -199,8 +204,6 @@ class BaseNetworkClient {
case DioExceptionType.receiveTimeout:
return DioException(requestOptions: e.requestOptions, error: '接收超时');
case DioExceptionType.badResponse:
var errorCode = e.response?.data["errorCode"];
var errorMsg = e.response?.data["errorMsg"];
if (errorCode == ATErroCode.userNotRegistered.code) {
//
ATTts.show("Please register an account first.");
@ -282,6 +285,8 @@ class BaseNetworkClient {
default:
return DioException(
requestOptions: e.requestOptions,
response: e.response,
type: e.type,
error: 'Net fail',
);
}

View File

@ -34,10 +34,10 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
///sys/config/banner
@override
Future<List<ATIndexBannerRes>> getBanner({List<String>?types}) async {
Future<List<ATIndexBannerRes>> getBanner({List<String>? types}) async {
Map<String, dynamic> params = {};
if (types != null) {
params["types"] = types;
params["types"] = types.length == 1 ? types.first : types;
}
final result = await http.get(
"0d8319c7a696c73d58f5e0ae304dc663f574ade4154ed90ccaee524f6ba14490",
@ -182,7 +182,9 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
"1585c72b88d0d249c7078aae852a0806cc3d8e483b8d861962a977a00523180a",
fromJson:
(json) =>
(json as List).map((e) => ATProductConfigRes.fromJson(e)).toList(),
(json as List)
.map((e) => ATProductConfigRes.fromJson(e))
.toList(),
);
return result;
}
@ -245,7 +247,11 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
///sys/config/game/ranking
@override
Future<ATGameRankingRes> gameRanking(int current,String periodType, {int? size = 20}) async {
Future<ATGameRankingRes> gameRanking(
int current,
String periodType, {
int? size = 20,
}) async {
Map<String, dynamic> parm = {};
parm["current"] = current;
parm["periodType"] = periodType;
@ -260,7 +266,7 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
///sys/version/manage/release/latest
@override
Future<ATVersionManageLatestRes> versionManageLatest() async{
Future<ATVersionManageLatestRes> versionManageLatest() async {
final result = await http.get<ATVersionManageLatestRes>(
"ee9584f714ded864780e47dab2cf4a2e84ac21c90fcd0966a13d2ce9e8845eb8e580afbe66f9f0fef79429cd5c1e0687",
fromJson: (json) => ATVersionManageLatestRes.fromJson(json),
@ -270,7 +276,7 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
///sys/version/manage/latest/review
@override
Future<VersionManageLatesReviewRes> versionManageLatestReview() async{
Future<VersionManageLatesReviewRes> versionManageLatestReview() async {
final result = await http.get<VersionManageLatesReviewRes>(
"ee9584f714ded864780e47dab2cf4a2e11ce42bdd061186d4efe3305b73f10fe574aff257ce7e668d08f4caccd1c6232",
fromJson: (json) => VersionManageLatesReviewRes.fromJson(json),
@ -280,7 +286,7 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
///sys/config/customer-service
@override
Future<ChatVibeUserProfile> customerService() async{
Future<ChatVibeUserProfile> customerService() async {
final result = await http.get<ChatVibeUserProfile>(
"ba316258c14cc3ebddb6d28ec314bc5704e593861ca693058e9e98ab3114cf05",
fromJson: (json) => ChatVibeUserProfile.fromJson(json),
@ -290,15 +296,15 @@ class ConfigRepositoryImp implements ChatVibeConfigRepository {
///ranking/king-games-daily-top-three
@override
Future<List<ATTopFourWithRewardRes>> kingGamesDailyTopThree() async{
Future<List<ATTopFourWithRewardRes>> kingGamesDailyTopThree() async {
final result = await http.post<List<ATTopFourWithRewardRes>>(
"c0c68485b2c8a2c7eb1973ee17866bfb6015dceaae385abe0e1a1598d3af93f64eb4a9d0d7e9231cab7de49e86a5b8bc",
data: {},
fromJson:
(json) =>
(json as List)
.map((e) => ATTopFourWithRewardRes.fromJson(e))
.toList(),
(json as List)
.map((e) => ATTopFourWithRewardRes.fromJson(e))
.toList(),
);
return result;
}

View File

@ -268,6 +268,26 @@ class ChatRoomRepository implements ChatVibeRoomRepository {
return result;
}
///gift/private
@override
Future<double> givePrivateGift(
String acceptUserId,
String giftId,
num quantity,
) async {
Map<String, dynamic> params = {};
params["acceptUserId"] = acceptUserId;
params["giftId"] = giftId;
params["quantity"] = quantity;
final result = await http.post(
'779a319006782e7f4b89aa3637eb7fd2',
data: params,
fromJson: (json) => json as double,
);
return result;
}
///live/mic/kill
@override
Future<bool> micKill(String roomId, num mickIndex) async {

View File

@ -95,6 +95,13 @@ abstract class ChatVibeRoomRepository {
String? dynamicContentId,
});
///
Future<double> givePrivateGift(
String acceptUserId,
String giftId,
num quantity,
);
///
Future<bool> reported(
String reportUserId,

View File

@ -15,6 +15,7 @@ import 'package:aslan/chatvibe_core/config/business_logic_strategy.dart';
import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart';
import 'package:aslan/chatvibe_data/sources/local/data_persistence.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:aslan/chatvibe_managers/gift_system_manager.dart';
import 'package:aslan/chatvibe_ui/widgets/msg/message_conversation_list_page.dart';
import 'package:aslan/chatvibe_features/chat/at_chat_route.dart';
import 'package:aslan/chatvibe_features/chat/message/at_message_friends_page.dart';
@ -35,12 +36,24 @@ class _MessagePageState extends State<ATMessagePage> {
BusinessLogicStrategy get _strategy => ATGlobalConfig.businessLogicStrategy;
bool isFromRoom = false;
bool showSystemAnnouncementTips = true;
GiftProvider? _giftProvider;
bool _roomMessagePageVisibilityApplied = false;
_MessagePageState(this.isFromRoom);
@override
void initState() {
super.initState();
if (isFromRoom) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) {
return;
}
_giftProvider = Provider.of<GiftProvider>(context, listen: false);
_giftProvider!.updateHideLGiftAnimalOnRoomMessagePage(true);
_roomMessagePageVisibilityApplied = true;
});
}
showSystemAnnouncementTips = DataPersistence.getBool(
"${AccountStorage().getCurrentUser()?.userProfile?.account}-ShowSystemAnnouncementTips",
defaultValue: true,
@ -86,6 +99,12 @@ class _MessagePageState extends State<ATMessagePage> {
@override
void dispose() {
if (_roomMessagePageVisibilityApplied) {
final giftProvider = _giftProvider;
WidgetsBinding.instance.addPostFrameCallback((_) {
giftProvider?.updateHideLGiftAnimalOnRoomMessagePage(false);
});
}
super.dispose();
}

View File

@ -1,12 +1,18 @@
import 'dart:convert';
import 'dart:io';
import 'package:extended_image/extended_image.dart'
show ExtendedImage, ExtendedRawImage, ExtendedImageState, LoadState;
show
ExtendedImage,
ExtendedNetworkImageProvider,
ExtendedRawImage,
ExtendedImageState,
LoadState;
import 'package:extended_text/extended_text.dart';
import 'package:extended_text_field/extended_text_field.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_ninepatch_image/flutter_ninepatch_image.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:aslan/app_localizations.dart';
@ -48,15 +54,55 @@ import 'package:aslan/chatvibe_core/config/business_logic_strategy.dart';
import 'package:aslan/chatvibe_core/constants/at_screen.dart';
import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart';
import 'package:aslan/chatvibe_core/utilities/at_keybord_util.dart';
import 'package:aslan/chatvibe_core/utilities/at_gift_vap_svga_manager.dart';
import 'package:aslan/chatvibe_core/utilities/at_message_notifier.dart';
import 'package:aslan/chatvibe_core/utilities/at_path_utils.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:aslan/chatvibe_domain/models/res/gift_res.dart';
import 'package:aslan/chatvibe_domain/usecases/custom_tab_selector.dart';
import 'package:aslan/chatvibe_features/gift/gift_page.dart';
import 'package:aslan/chatvibe_managers/user_profile_manager.dart';
import 'package:aslan/chatvibe_features/index/main_route.dart';
import 'package:aslan/chatvibe_ui/widgets/room/effect/vapp_svga_layer_widget.dart';
import '../../chatvibe_domain/models/res/at_user_red_packet_send_res.dart';
Map<String, dynamic>? _privateGiftDataFromJson(String? data) {
if (data == null || data.isEmpty) {
return null;
}
try {
var json = jsonDecode(data);
if (json is Map<String, dynamic> && json["type"] == "PRIVATE_GIFT") {
return json;
}
} catch (_) {}
return null;
}
Map<String, dynamic>? _privateGiftDataFromMessage(V2TimMessage message) {
if (message.elemType != MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) {
return null;
}
V2TimCustomElem? customElem = message.customElem;
if (customElem == null) {
return null;
}
Map<String, dynamic>? data = _privateGiftDataFromJson(customElem.data);
if (data != null || customElem.desc != "PRIVATE_GIFT") {
return data;
}
return <String, dynamic>{"type": "PRIVATE_GIFT"};
}
void _playPrivateGiftAnimation(Map<String, dynamic>? giftData) {
String sourceUrl = "${giftData?["giftSourceUrl"] ?? ""}";
if (sourceUrl.isEmpty || !ATGlobalConfig.isGiftSpecialEffects) {
return;
}
ATGiftVapSvgaManager().play(sourceUrl);
}
class ATMessageChatPage extends StatefulWidget {
final V2TimConversation? conversation;
final bool shrinkWrap;
@ -272,6 +318,12 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
),
),
),
if (!widget.inRoom)
Positioned.fill(
child: IgnorePointer(
child: VapPlusSvgaPlayer(tag: "room_gift"),
),
),
],
),
);
@ -301,77 +353,97 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
///
Widget _msgList() {
print('xiaoxiliebiao:${currentConversationMessageList.length}');
return SmartRefresher(
enablePullDown: false,
enablePullUp: true,
onLoading: () async {
print('onLoading');
if (currentConversationMessageList.isNotEmpty) {
//
// lastMsgID null
// lastMsgID 使id
V2TimValueCallback<List<V2TimMessage>> v2timValueCallback =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getC2CHistoryMessageList(
userID: currentConversation!.userID ?? "",
count: 30,
lastMsgID: currentConversationMessageList.last.msgID,
);
List<V2TimMessage> messages =
v2timValueCallback.data as List<V2TimMessage>;
print('加载前:${currentConversationMessageList.length}');
currentConversationMessageList.addAll(messages);
print('加载后:${currentConversationMessageList.length}');
if (messages.length == 30) {
_refreshController.loadComplete();
} else {
_refreshController.loadNoData();
}
} else {
_refreshController.loadNoData();
}
setState(() {});
},
footer: CustomFooter(
height: 1,
builder: (context, mode) {
return SizedBox(
height: 1,
width: 1,
child: SizedBox(height: 1, width: 1),
);
},
),
controller: _refreshController,
child: CustomScrollView(
shrinkWrap: true,
controller: _scrollController,
reverse: true,
physics: const ClampingScrollPhysics(),
//
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(c, i) => _MessageItem(
message: currentConversationMessageList[i],
preMessage:
i < currentConversationMessageList.length - 1
? currentConversationMessageList[i + 1]
: null,
isSystem:
currentConversationMessageList[i].sender == "administrator",
friend: friend,
currentConversationMessageList: currentConversationMessageList,
updateCall: () {
setState(() {});
},
),
childCount: currentConversationMessageList.length,
return LayoutBuilder(
builder: (context, constraints) {
return SizedBox(
width: constraints.maxWidth,
height: constraints.maxHeight,
child: SmartRefresher(
enablePullDown: false,
enablePullUp: true,
onLoading: () async {
print('onLoading');
if (currentConversationMessageList.isNotEmpty) {
//
// lastMsgID null
// lastMsgID 使id
V2TimValueCallback<List<V2TimMessage>> v2timValueCallback =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getC2CHistoryMessageList(
userID: currentConversation!.userID ?? "",
count: 30,
lastMsgID: currentConversationMessageList.last.msgID,
);
List<V2TimMessage> messages =
v2timValueCallback.data as List<V2TimMessage>;
print('加载前:${currentConversationMessageList.length}');
currentConversationMessageList.addAll(messages);
print('加载后:${currentConversationMessageList.length}');
if (messages.length == 30) {
_refreshController.loadComplete();
} else {
_refreshController.loadNoData();
}
} else {
_refreshController.loadNoData();
}
setState(() {});
},
footer: CustomFooter(
height: 1,
builder: (context, mode) {
return SizedBox(
height: 1,
width: 1,
child: SizedBox(height: 1, width: 1),
);
},
),
controller: _refreshController,
child: CustomScrollView(
controller: _scrollController,
reverse: true,
physics: const ClampingScrollPhysics(),
//
slivers: [
SliverFillRemaining(
hasScrollBody: false,
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: List.generate(
currentConversationMessageList.length,
(index) {
int messageIndex =
currentConversationMessageList.length - 1 - index;
return _MessageItem(
message: currentConversationMessageList[messageIndex],
preMessage:
messageIndex <
currentConversationMessageList.length - 1
? currentConversationMessageList[messageIndex +
1]
: null,
isSystem:
currentConversationMessageList[messageIndex]
.sender ==
"administrator",
friend: friend,
currentConversationMessageList:
currentConversationMessageList,
updateCall: () {
setState(() {});
},
);
},
),
),
),
],
),
),
],
),
);
},
);
}
@ -486,55 +558,69 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
),
),
),
//emoji按钮
//SizedBox(width: 10.w,),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
ATKeybordUtil.conceal(context);
setState(() {
if (showTools) {
showTools = false;
}
showEmoji = !showEmoji;
});
},
child: Padding(
padding: EdgeInsets.only(left: 8.w, right: 10.w),
child: Image.asset(
showEmoji
? _strategy
.getATMessageChatPageChatKeyboardIcon()
: _strategy.getATMessageChatPageEmojiIcon(),
width: 24.w,
fit: BoxFit.fill,
),
),
),
],
),
),
),
SizedBox(width: 10.w),
!showEmoji
? GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
ATKeybordUtil.conceal(context);
setState(() {
if (showTools) {
showTools = false;
}
showEmoji = !showEmoji;
});
},
child: Image.asset(
_strategy.getATMessageChatPageEmojiIcon(),
width: 24.w,
//color: Colors.black,
fit: BoxFit.fill,
),
)
: Container(),
showEmoji
? GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
ATKeybordUtil.conceal(context);
setState(() {
if (showTools) {
showTools = false;
}
showEmoji = !showEmoji;
});
},
child: Image.asset(
_strategy.getATMessageChatPageChatKeyboardIcon(),
width: 24.w,
//color: Colors.black,
fit: BoxFit.fill,
),
)
: Container(),
if (!showSend) SizedBox(width: 12.w),
if (showSend) SizedBox(width: 5.w),
Visibility(
visible: !showSend,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
ATKeybordUtil.conceal(context);
setState(() {
showEmoji = false;
showTools = false;
});
SmartDialog.show(
tag: "showGiftControl",
alignment: Alignment.bottomCenter,
maskColor: Colors.transparent,
animationType: SmartAnimationType.fade,
clickMaskDismiss: true,
builder: (_) {
return GiftPage(
toUser: friend,
isChatGift: true,
onChatGiftSend: _onChatGiftSend,
);
},
);
},
child: Image.asset(
"atu_images/room/at_icon_botton_gift.png",
width: 26.w,
height: 26.w,
fit: BoxFit.fill,
),
),
),
if (!showSend) SizedBox(width: 8.w),
Visibility(
visible: !showSend,
child: GestureDetector(
@ -608,6 +694,19 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
).sendC2CCustomMsg(msg, currentConversation!, extension);
}
void _onChatGiftSend(ChatVibeGiftRes gift, int number) async {
if (!canSendMsg) {
ATTts.show(ATAppLocalizations.of(context)!.canSendMsgTips);
return;
}
SmartDialog.dismiss(tag: "showGiftControl");
await Provider.of<RtmProvider>(context, listen: false).sendPrivateGift(
userID: currentConversation?.userID ?? "",
gift: gift,
number: number,
);
}
///
Widget _tools(RtmProvider provider) {
return Visibility(
@ -648,16 +747,7 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
ATTts.show(ATAppLocalizations.of(context)!.canSendMsgTips);
return;
}
final List<File>? result =
await ImagePick.pickPicAndVideoFromGallery(context);
if (result == null) return; //
if (result.isNotEmpty) {
provider.sendImageMsg(
selectedList: result,
conversation: currentConversation!,
);
}
_showAlbumPickerDialog(provider);
},
),
),
@ -669,6 +759,79 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
);
}
void _showAlbumPickerDialog(RtmProvider provider) {
SmartDialog.show(
tag: "showAlbumPickerDialog",
alignment: Alignment.bottomCenter,
animationType: SmartAnimationType.fade,
clickMaskDismiss: true,
builder: (_) {
return SafeArea(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(8.w),
topRight: Radius.circular(8.w),
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
_albumPickerItem(
ATAppLocalizations.of(context)!.image,
() async {
SmartDialog.dismiss(tag: "showAlbumPickerDialog");
File? result = await ImagePick.pickSingleFromGallery(
context,
);
if (result != null) {
provider.sendImageMsg(
selectedList: [result],
conversation: currentConversation!,
);
}
},
),
_albumPickerItem(
ATAppLocalizations.of(context)!.video,
() async {
SmartDialog.dismiss(tag: "showAlbumPickerDialog");
File? result = await ImagePick.pickVideoFromGallery(
context,
);
if (result != null) {
provider.sendImageMsg(
selectedList: [result],
conversation: currentConversation!,
);
}
},
),
_albumPickerItem(ATAppLocalizations.of(context)!.cancel, () {
SmartDialog.dismiss(tag: "showAlbumPickerDialog");
}),
],
),
),
);
},
);
}
Widget _albumPickerItem(String title, Function() onTap) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: onTap,
child: Container(
alignment: Alignment.center,
width: ScreenUtil().screenWidth,
padding: EdgeInsets.symmetric(vertical: 15.w),
child: text(title, fontSize: 15.sp, textColor: Colors.black),
),
);
}
_emoji() {
return Visibility(
visible: showEmoji,
@ -781,6 +944,7 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
} else {
currentConversationMessageList.insert(0, message);
}
_playPrivateGiftAnimation(_privateGiftDataFromMessage(message));
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.markC2CMessageAsRead(userID: currentConversation!.userID!);
@ -924,6 +1088,11 @@ class _ATMessageChatPageState extends State<ATMessageChatPage> {
}
class _MessageItem extends StatelessWidget {
static final Map<String, ExtendedNetworkImageProvider>
_chatBoxImageProviderCache = <String, ExtendedNetworkImageProvider>{};
static const int _maxChatBoxImageProviderCacheSize = 64;
static const Duration _chatBoxImageCacheMaxAge = Duration(days: 7);
final V2TimMessage message;
final V2TimMessage? preMessage;
@ -1329,9 +1498,8 @@ class _MessageItem extends StatelessWidget {
V2TimCustomElem customElem = message.customElem!;
content = customElem.data ?? "";
if (customElem.extension == 'Red_Envelopes') {
ATUserRedPacketSendRes redPacketSendRes = ATUserRedPacketSendRes.fromJson(
jsonDecode(content),
);
ATUserRedPacketSendRes redPacketSendRes =
ATUserRedPacketSendRes.fromJson(jsonDecode(content));
String packetId = redPacketSendRes.packetId ?? "";
// Future
Future<ATUserRedPacketSendRes> getRedPacketFuture() {
@ -1540,6 +1708,12 @@ class _MessageItem extends StatelessWidget {
);
},
);
} else if (_isPrivateGiftMessage(customElem)) {
Map<String, dynamic>? giftData = _privateGiftData(customElem.data);
if (giftData != null) {
return _privateGift(giftData);
}
content = ATAppLocalizations.of(context)!.gift2;
} else {
content = ATAppLocalizations.of(context)!.receivedAMessage;
}
@ -1547,11 +1721,155 @@ class _MessageItem extends StatelessWidget {
return Builder(
builder: (ct) {
String chatBubbleUrl = _chatBubbleUrl().trim();
bool hasChatBubble = chatBubbleUrl.isNotEmpty;
Widget contentWidget = Container(
constraints: BoxConstraints(maxWidth: width(220)),
child: ExtendedText(
content,
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(
fontSize: sp(14),
color: hasChatBubble ? Colors.white : const Color(0xffB1B1B1),
),
),
);
return GestureDetector(
child:
hasChatBubble
? Container(
constraints: BoxConstraints(maxWidth: width(220)),
padding: EdgeInsets.symmetric(horizontal: 10.w),
child: NinePatchImage(
scale: 3,
alignment: Alignment.center,
imageProvider: _getChatBoxImageProvider(chatBubbleUrl),
sliceCachedKey: _buildNinePatchCacheKey(chatBubbleUrl),
child: contentWidget,
),
)
: Container(
decoration: BoxDecoration(
color: const Color(0xffF2F2F2),
borderRadius: BorderRadius.only(
topLeft:
message.isSelf!
? Radius.circular(8)
: Radius.circular(0),
topRight: Radius.circular(8.w),
bottomLeft: Radius.circular(8.w),
bottomRight:
message.isSelf!
? Radius.circular(0)
: Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: contentWidget,
),
onLongPress: () {
_showMsgItemMenu(ct, content);
},
);
},
);
}
String _chatBubbleUrl() {
if (isSystem ||
message.sender == "administrator" ||
message.sender == "customer") {
return "";
}
String messageChatBubbleUrl = _chatBubbleUrlFromCloudCustomData(
message.cloudCustomData,
);
if (messageChatBubbleUrl.isNotEmpty) {
return messageChatBubbleUrl;
}
PropsResources? chatBox =
(message.isSelf ?? false)
? AccountStorage().getChatbox()
: friend?.getChatBox();
return (chatBox?.expand ?? "").trim();
}
String _chatBubbleUrlFromCloudCustomData(String? cloudCustomData) {
String data = (cloudCustomData ?? "").trim();
if (data.isEmpty) {
return "";
}
try {
dynamic json = jsonDecode(data);
if (json is Map) {
dynamic chatBubble = json["chatBubble"];
if (chatBubble is Map) {
return "${chatBubble["expand"] ?? ""}".trim();
}
return "${json["chatBubbleUrl"] ?? ""}".trim();
}
} catch (_) {}
return "";
}
String _buildNinePatchCacheKey(String? url) {
final String normalizedUrl = (url ?? "").trim();
if (normalizedUrl.isEmpty) {
return "";
}
return "$normalizedUrl|scale:3|im";
}
ExtendedNetworkImageProvider _getChatBoxImageProvider(String? url) {
final String normalizedUrl = (url ?? "").trim();
final ExtendedNetworkImageProvider? cached =
_chatBoxImageProviderCache[normalizedUrl];
if (cached != null) {
return cached;
}
if (_chatBoxImageProviderCache.length >=
_maxChatBoxImageProviderCacheSize) {
_chatBoxImageProviderCache.remove(_chatBoxImageProviderCache.keys.first);
}
final ExtendedNetworkImageProvider provider = ExtendedNetworkImageProvider(
normalizedUrl,
cache: true,
cacheMaxAge: _chatBoxImageCacheMaxAge,
);
_chatBoxImageProviderCache[normalizedUrl] = provider;
return provider;
}
bool _isPrivateGiftMessage(V2TimCustomElem customElem) {
if (customElem.desc == "PRIVATE_GIFT") {
return true;
}
Map<String, dynamic>? data = _privateGiftData(customElem.data);
return data?["type"] == "PRIVATE_GIFT";
}
Map<String, dynamic>? _privateGiftData(String? data) {
return _privateGiftDataFromJson(data);
}
Widget _privateGift(Map<String, dynamic> giftData) {
String giftName = "${giftData["giftName"] ?? ""}";
String giftPhoto = "${giftData["giftPhoto"] ?? ""}";
String quantity = "${giftData["quantity"] ?? 1}";
return Builder(
builder: (ct) {
return GestureDetector(
onTap: () {
_playPrivateGiftAnimation(giftData);
},
onLongPress: () {
_showMsgItemMenu(ct, giftName);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 9.w),
decoration: BoxDecoration(
color: Colors.white,
boxShadow: [BoxShadow(blurRadius: 2.w, color: Colors.black26)],
color: const Color(0xffF2F2F2),
borderRadius: BorderRadius.only(
topLeft:
message.isSelf! ? Radius.circular(8) : Radius.circular(0),
@ -1561,22 +1879,35 @@ class _MessageItem extends StatelessWidget {
message.isSelf! ? Radius.circular(0) : Radius.circular(8),
),
),
padding: EdgeInsets.all(8.0.w),
child: Container(
constraints: BoxConstraints(maxWidth: width(220)),
child: ExtendedText(
content,
// specialTextSpanBuilder: MySpecialTextSpanBuilder(),
style: TextStyle(
fontSize: sp(14),
color: message.isSelf! ? Colors.black87 : Colors.black87,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
text(
ATAppLocalizations.of(context)!.send,
fontSize: 11.sp,
textColor: const Color(0xffB1B1B1),
),
),
SizedBox(width: 7.w),
Container(
width: 31.w,
height: 31.w,
alignment: Alignment.center,
child: netImage(
url: giftPhoto,
width: 31.w,
height: 31.w,
fit: BoxFit.contain,
),
),
SizedBox(width: 7.w),
text(
"*$quantity",
fontSize: 11.sp,
textColor: const Color(0xffB1B1B1),
),
],
),
),
onLongPress: () {
_showMsgItemMenu(ct, content);
},
);
},
);

View File

@ -1,9 +1,7 @@
import 'dart:convert';
import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_debouncer/flutter_debouncer.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@ -24,8 +22,6 @@ import 'package:provider/provider.dart';
import 'package:aslan/chatvibe_core/constants/at_room_msg_type.dart';
import 'package:aslan/chatvibe_core/constants/at_screen.dart';
import 'package:aslan/chatvibe_core/routes/at_fluro_navigator.dart';
import 'package:aslan/chatvibe_core/utilities/at_dialog_utils.dart';
import 'package:aslan/chatvibe_core/utilities/at_lk_dialog_util.dart';
import 'package:aslan/chatvibe_data/sources/local/floating_screen_manager.dart';
import 'package:aslan/chatvibe_domain/models/res/gift_res.dart';
import 'package:aslan/chatvibe_domain/models/res/mic_res.dart';
@ -34,11 +30,9 @@ import 'package:aslan/chatvibe_managers/gift_system_manager.dart';
import 'package:aslan/chatvibe_managers/rtc_manager.dart';
import 'package:aslan/chatvibe_managers/rtm_manager.dart';
import 'package:aslan/chatvibe_managers/user_profile_manager.dart';
import 'package:aslan/chatvibe_ui/widgets/countdown_timer.dart';
import 'package:aslan/chatvibe_ui/widgets/room/give_room_luck_page.dart';
import 'package:aslan/chatvibe_ui/widgets/room/room_msg_item.dart';
import 'package:aslan/chatvibe_features/wallet/wallet_route.dart';
import 'package:aslan/chatvibe_features/gift/activity/gift_tab_activity_page.dart';
import 'package:aslan/chatvibe_features/gift/gift_tab_page.dart';
import '../../chatvibe_data/models/enum/at_gift_type.dart';
import '../../chatvibe_data/models/message/at_floating_message.dart';
@ -47,8 +41,16 @@ import '../../chatvibe_domain/usecases/at_fixed_width_tabIndicator.dart';
class GiftPage extends StatefulWidget {
ChatVibeUserProfile? toUser;
final int initialIndex;
final bool isChatGift;
final void Function(ChatVibeGiftRes gift, int number)? onChatGiftSend;
GiftPage({super.key, this.toUser, this.initialIndex = 0});
GiftPage({
super.key,
this.toUser,
this.initialIndex = 0,
this.isChatGift = false,
this.onChatGiftSend,
});
@override
_GiftPageState createState() => _GiftPageState();
@ -56,15 +58,13 @@ class GiftPage extends StatefulWidget {
class _GiftPageState extends State<GiftPage>
with SingleTickerProviderStateMixin {
late TabController _tabController;
TabController? _tabController;
/// 访
BusinessLogicStrategy get _strategy => ATGlobalConfig.businessLogicStrategy;
// int checkedIndex = 0;
ChatVibeGiftRes? checkedGift;
final List<Widget> _pages = [];
final List<Widget> _tabs = [];
RtcProvider? rtcProvider;
bool isAll = false;
@ -94,144 +94,6 @@ class _GiftPageState extends State<GiftPage>
// Provider.of<AppGeneralManager>(context, listen: false).giftActivityList();
// Provider.of<GeneralProvider>(context, listen: false).giftBackpack();
Provider.of<ChatVibeUserProfileManager>(context, listen: false).balance();
_pages.add(
GiftTabPage("ALL", (int checkedI) {
checkedGift = null;
var all =
Provider.of<AppGeneralManager>(
context,
listen: false,
).giftByTab["ALL"];
if (all != null) {
checkedGift = all[checkedI];
}
number = 1;
noShowNumber = false;
setState(() {
giftType = 0;
});
}),
);
// _pages.add(
// GiftTabPage("NATIONAL_FLAG", (int checkedI) {
// checkedGift = null;
// var flag =
// Provider.of<AppGeneralManager>(
// context,
// listen: false,
// ).giftByTab["NATIONAL_FLAG"];
// if (flag != null) {
// checkedGift = flag[checkedI];
// }
// number = 1;
// noShowNumber = false;
// setState(() {
// giftType = 0;
// });
// }),
// );
// _pages.add(
// GiftTabActivityPage("ACTIVITY", (int checkedI, String activityId) {
// checkedGift = null;
// var exclusive =
// Provider.of<AppGeneralManager>(
// context,
// listen: false,
// ).activityGiftByTab[activityId];
// if (exclusive != null) {
// checkedGift = exclusive[checkedI];
// }
// number = 1;
// noShowNumber = false;
// setState(() {
// giftType = 1;
// });
// }),
// );
_pages.add(
GiftTabPage("LUCKY_GIFT", (int checkedI) {
checkedGift = null;
var exclusive =
Provider.of<AppGeneralManager>(
context,
listen: false,
).giftByTab["LUCKY_GIFT"];
if (exclusive != null) {
checkedGift = exclusive[checkedI];
}
number = 1;
noShowNumber = false;
setState(() {
giftType = 2;
});
}),
);
_pages.add(
GiftTabPage("CP", (int checkedI) {
checkedGift = null;
var exclusive =
Provider.of<AppGeneralManager>(
context,
listen: false,
).giftByTab["CP"];
if (exclusive != null) {
checkedGift = exclusive[checkedI];
}
number = 1;
noShowNumber = false;
setState(() {
giftType = 3;
});
}),
);
// _pages.add(
// GiftTabPage("CUSTOMIZED", (int checkedI) {
// checkedGift = null;
// var exclusive =
// Provider.of<AppGeneralManager>(
// context,
// listen: false,
// ).giftByTab["CUSTOMIZED"];
//
// if (exclusive != null && exclusive.length > 1) {
// checkedGift = exclusive[checkedI];
// }
// number = 1;
// noShowNumber = false;
// setState(() {
// giftType = 4;
// });
// }),
// );
// _pages.add(
// GiftTabPage("MAGIC", (int checkedI) {
// checkedGift = null;
// var exclusive =
// Provider.of<AppGeneralManager>(
// context,
// listen: false,
// ).giftByTab["MAGIC"];
// if (exclusive != null) {
// checkedGift = exclusive[checkedI];
// }
// number = 1;
// noShowNumber = true;
// setState(() {
// giftType = 5;
// });
// }),
// );
_tabController = TabController(
length: _pages.length,
vsync: this,
initialIndex: widget.initialIndex,
);
_tabController.addListener(() {}); //
rtcProvider?.roomWheatMap.forEach((k, v) {
if (v.user != null) {
if (v.user?.id == AccountStorage().getCurrentUser()?.userProfile?.id) {
@ -249,39 +111,27 @@ class _GiftPageState extends State<GiftPage>
});
}
@override
void dispose() {
_tabController?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_tabs.clear();
_tabs.add(Tab(text: ATAppLocalizations.of(context)!.gift));
// _tabs.add(Tab(text: ATAppLocalizations.of(context)!.country));
// _tabs.add(Tab(text: ATAppLocalizations.of(context)!.activity));
_tabs.add(
Tab(
child: Directionality(textDirection: TextDirection.ltr, child: Stack(
clipBehavior: Clip.none,
children: [
Padding(
padding: EdgeInsets.only(right: 10.w),
child: Text(ATAppLocalizations.of(context)!.luck),
),
Positioned(
top: -6.w,
right: -3.w,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: _showLuckyGiftHelpDialog,
child: Icon(Icons.help_outline_rounded, size: 12.w),
),
),
],
)),
),
);
_tabs.add(Tab(text: ATAppLocalizations.of(context)!.cp));
// _tabs.add(Tab(text: ATAppLocalizations.of(context)!.customized));
// _tabs.add(Tab(text: ATAppLocalizations.of(context)!.magic));
return Consumer<AppGeneralManager>(
builder: (context, ref, child) {
final giftTabTypes = _giftTabTypes(ref);
final tabs = giftTabTypes.map(_buildGiftTab).toList();
final pages =
giftTabTypes
.map(
(giftTab) => GiftTabPage(giftTab, (int checkedI) {
_selectGift(giftTab, checkedI);
}),
)
.toList();
_syncTabController(giftTabTypes.length);
return SafeArea(
top: false,
child: Column(
@ -299,119 +149,129 @@ class _GiftPageState extends State<GiftPage>
child: Column(
children: [
SizedBox(height: 12.w),
Row(
children: [
SizedBox(width: 8.w),
widget.toUser == null
? Expanded(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children:
listMai
.map((e) => _maiHead(e))
.toList(),
if (!widget.isChatGift)
Row(
children: [
SizedBox(width: 8.w),
widget.toUser == null
? Expanded(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children:
listMai
.map((e) => _maiHead(e))
.toList(),
),
),
)
: Stack(
alignment: AlignmentDirectional.center,
children: [
Container(
padding: EdgeInsets.all(2.w),
child: netImage(
url: widget.toUser?.userAvatar ?? "",
width: 26.w,
defaultImg:
_strategy
.getMePageDefaultAvatarImage(),
shape: BoxShape.circle,
),
),
widget.toUser == null
? PositionedDirectional(
bottom: 0,
end: 0,
child: Image.asset(
"atu_images/login/at_icon_login_ser_select.png",
width: 10.w,
height: 10.w,
),
)
: Container(),
],
),
)
: Stack(
alignment: AlignmentDirectional.center,
children: [
Container(
padding: EdgeInsets.all(2.w),
child: netImage(
url: widget.toUser?.userAvatar ?? "",
width: 26.w,
defaultImg:
_strategy
.getMePageDefaultAvatarImage(),
shape: BoxShape.circle,
),
),
widget.toUser == null
? PositionedDirectional(
bottom: 0,
end: 0,
child: Image.asset(
"atu_images/login/at_icon_login_ser_select.png",
width: 10.w,
height: 10.w,
),
)
: Container(),
],
),
widget.toUser == null
? Builder(
builder: (ct) {
return GestureDetector(
child: Image.asset(
isAll
? "atu_images/room/at_icon_gift_all_en.png"
: "atu_images/room/at_icon_gift_all_no.png",
width: 28.w,
height: 28.w,
),
onTap: () {
isAll = !isAll;
for (var mai in listMai) {
mai.isSelect = isAll;
}
setState(() {});
// showGiveTypeDialog(ct);
},
);
},
)
: Container(),
SizedBox(width: 12.w),
],
),
widget.toUser == null
? Builder(
builder: (ct) {
return GestureDetector(
child: Image.asset(
isAll
? "atu_images/room/at_icon_gift_all_en.png"
: "atu_images/room/at_icon_gift_all_no.png",
width: 28.w,
height: 28.w,
),
onTap: () {
isAll = !isAll;
for (var mai in listMai) {
mai.isSelect = isAll;
}
setState(() {});
// showGiveTypeDialog(ct);
},
);
},
)
: Container(),
SizedBox(width: 12.w),
],
),
Row(
children: [
SizedBox(width: 5.w),
Expanded(
child: Container(
height: 28.w,
child: TabBar(
tabAlignment: TabAlignment.start,
labelPadding: EdgeInsets.symmetric(
horizontal: 8.w,
),
labelColor: Color(0xffFFD800),
child:
tabs.isEmpty
? Container()
: TabBar(
tabAlignment: TabAlignment.start,
labelPadding: EdgeInsets.symmetric(
horizontal: 8.w,
),
labelColor: Color(0xffFFD800),
indicatorWeight: 0,
isScrollable: true,
indicator: ATFixedWidthTabIndicator(
width: 15.w,
gradient: LinearGradient(
colors: [
Color(0xffFFA500),
Color(0xffFFD700),
],
),
),
unselectedLabelColor: Colors.white54,
labelStyle: TextStyle(fontSize: 14.sp),
unselectedLabelStyle: TextStyle(
fontSize: 12.sp,
),
indicatorColor: Colors.transparent,
dividerColor: Colors.transparent,
controller: _tabController,
tabs: _tabs,
),
indicatorWeight: 0,
isScrollable: true,
indicator: ATFixedWidthTabIndicator(
width: 15.w,
gradient: LinearGradient(
colors: [
Color(0xffFFA500),
Color(0xffFFD700),
],
),
),
unselectedLabelColor: Colors.white54,
labelStyle: TextStyle(fontSize: 14.sp),
unselectedLabelStyle: TextStyle(
fontSize: 12.sp,
),
indicatorColor: Colors.transparent,
dividerColor: Colors.transparent,
controller: _tabController,
tabs: tabs,
),
),
),
SizedBox(width: 5.w),
],
),
Expanded(
child: TabBarView(
physics: NeverScrollableScrollPhysics(),
controller: _tabController,
children: _pages,
),
child:
pages.isEmpty
? mainEmpty(
textColor: Colors.white54,
msg: ATAppLocalizations.of(context)!.noData,
)
: TabBarView(
physics: NeverScrollableScrollPhysics(),
controller: _tabController,
children: pages,
),
),
Row(
children: [
@ -544,6 +404,119 @@ class _GiftPageState extends State<GiftPage>
);
}
List<String> _giftTabTypes(AppGeneralManager ref) {
return ref.giftTabs.where((giftTab) {
return !widget.isChatGift || giftTab != ATGiftType.LUCKY_GIFT.name;
}).toList();
}
void _syncTabController(int length) {
if (length == 0) {
_tabController?.dispose();
_tabController = null;
return;
}
if (_tabController?.length == length) {
return;
}
final oldIndex = _tabController?.index ?? widget.initialIndex;
_tabController?.dispose();
_tabController = TabController(
length: length,
vsync: this,
initialIndex: oldIndex.clamp(0, length - 1).toInt(),
);
}
Tab _buildGiftTab(String giftTab) {
if (giftTab == ATGiftType.LUCKY_GIFT.name) {
return Tab(
child: Directionality(
textDirection: TextDirection.ltr,
child: Stack(
clipBehavior: Clip.none,
children: [
Padding(
padding: EdgeInsets.only(right: 10.w),
child: Text(_giftTabTitle(giftTab)),
),
Positioned(
top: -6.w,
right: -3.w,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: _showLuckyGiftHelpDialog,
child: Icon(Icons.help_outline_rounded, size: 12.w),
),
),
],
),
),
);
}
return Tab(text: _giftTabTitle(giftTab));
}
String _giftTabTitle(String giftTab) {
switch (giftTab) {
case "ALL":
return ATAppLocalizations.of(context)!.gift;
case "NATIONAL_FLAG":
return ATAppLocalizations.of(context)!.country;
case "ACTIVITY":
return ATAppLocalizations.of(context)!.activity;
case "LUCKY_GIFT":
return ATAppLocalizations.of(context)!.luck;
case "CP":
return ATAppLocalizations.of(context)!.cp;
case "CUSTOMIZED":
case "EXCLUSIVE":
return ATAppLocalizations.of(context)!.customized;
case "MAGIC":
return ATAppLocalizations.of(context)!.magic;
default:
return giftTab.replaceAll("_", " ");
}
}
void _selectGift(String giftTab, int checkedI) {
checkedGift = null;
final gifts =
Provider.of<AppGeneralManager>(
context,
listen: false,
).giftByTab[giftTab];
if (gifts != null && checkedI >= 0 && checkedI < gifts.length) {
final gift = gifts[checkedI];
if (gift.id != "-1000") {
checkedGift = gift;
}
}
number = 1;
noShowNumber = giftTab == ATGiftType.MAGIC.name;
setState(() {
giftType = _giftTypeValue(giftTab);
});
}
int _giftTypeValue(String giftTab) {
switch (giftTab) {
case "ACTIVITY":
return 1;
case "LUCKY_GIFT":
return 2;
case "CP":
return 3;
case "CUSTOMIZED":
case "EXCLUSIVE":
return 4;
case "MAGIC":
return 5;
default:
return 0;
}
}
void _showLuckyGiftHelpDialog() {
if (giftType != 2) {
return;
@ -865,6 +838,14 @@ class _GiftPageState extends State<GiftPage>
///
void giveGifts() {
if (widget.isChatGift) {
if (checkedGift == null) {
return;
}
widget.onChatGiftSend?.call(checkedGift!, number);
return;
}
List<String> acceptUserIds = [];
List<MicRes> acceptUsers = [];
@ -1055,7 +1036,7 @@ class _GiftPageState extends State<GiftPage>
}
_buildGiftHead() {
if (giftType == 1 || giftType == 5) {
if (giftType == 1 || giftType == 5) {
//
String basePath = _strategy.getGiftPageActivityGiftHeadBackground(
_giftTypeToString(giftType),

View File

@ -13,8 +13,6 @@ import 'package:aslan/app_localizations.dart';
import 'package:aslan/chatvibe_core/config/business_logic_strategy.dart';
import 'package:aslan/chatvibe_core/constants/at_global_config.dart';
import '../../chatvibe_data/models/enum/at_gift_type.dart';
class GiftTabPage extends StatefulWidget {
String type;
bool isDark = true;
@ -37,7 +35,7 @@ class _GiftTabPageState extends State<GiftTabPage> {
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (widget.type == "CUSTOMIZED") {
if (widget.type == "CUSTOMIZED" || widget.type == "EXCLUSIVE") {
widget.checkedCall(1);
} else {
widget.checkedCall(0);
@ -56,7 +54,7 @@ class _GiftTabPageState extends State<GiftTabPage> {
)
: Column(
children: [
SizedBox(height: 23.w,),
SizedBox(height: 23.w),
Expanded(
child: PageView.builder(
controller: _giftPageController,
@ -250,7 +248,7 @@ class _GiftTabPageState extends State<GiftTabPage> {
lineHeight: 1,
textAlign: TextAlign.center,
fontWeight: FontWeight.w600,
textColor: widget.isDark ? Colors.white : Colors.black,
textColor: widget.isDark ? Colors.white : Colors.black,
),
),
Row(

View File

@ -149,9 +149,9 @@ class _MedalsHonorTabPageState
for (final response in results) {
for (final group in response) {
for (final item in group.badgeTables ?? const <BadgeTables>[]) {
if (!(item.activation ?? false)) {
continue;
}
// if (!(item.activation ?? false)) {
// continue;
// }
final key =
item.badgeConfig?.id ??
item.badgeConfig?.badgeKey ??

View File

@ -264,8 +264,19 @@ class _HomeMinePageState extends ATPageListState<FollowRoomRes, HomeMinePage> {
),
],
),
onTap: () {
provider.createRoom(context);
onTap: () async {
final myRoom = await provider.createRoom(context);
if (!mounted) {
return;
}
final roomId = myRoom?.id ?? "";
if (roomId.isEmpty) {
return;
}
Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).joinRoom(context, roomId);
},
);
},

View File

@ -109,16 +109,35 @@ class _HomePartyPageState extends State<HomePartyPage>
msg: ATAppLocalizations.of(context)!.noData,
),
)
: ListView.separated(
shrinkWrap: true,
padding: EdgeInsets.symmetric(vertical: 8.w),
physics: const NeverScrollableScrollPhysics(),
itemCount: rooms.length,
itemBuilder: (context, index) {
return _buildItem(rooms[index], index);
},
separatorBuilder: (BuildContext context, int index) {
return SizedBox(height: 4.w);
: Selector<AppGeneralManager, List<ATIndexBannerRes>>(
selector:
(_, provider) =>
List<ATIndexBannerRes>.unmodifiable(
provider.roomListBanners,
),
builder: (context, roomListBanners, child) {
return ListView.separated(
shrinkWrap: true,
padding: EdgeInsets.symmetric(vertical: 8.w),
physics: const NeverScrollableScrollPhysics(),
itemCount: _partyRoomListItemCount(roomListBanners),
itemBuilder: (context, index) {
if (_isPartyBannerIndex(index, roomListBanners)) {
return _buildPartyBanner(roomListBanners);
}
final roomIndex = _roomIndexForListIndex(
index,
roomListBanners,
);
return _buildItem(rooms[roomIndex], roomIndex);
},
separatorBuilder: (
BuildContext context,
int index,
) {
return SizedBox(height: 4.w);
},
);
},
),
],
@ -130,6 +149,67 @@ class _HomePartyPageState extends State<HomePartyPage>
);
}
bool _shouldShowPartyBanner(List<ATIndexBannerRes> roomListBanners) {
return rooms.length >= 3 && roomListBanners.isNotEmpty;
}
int _partyRoomListItemCount(List<ATIndexBannerRes> roomListBanners) {
return rooms.length + (_shouldShowPartyBanner(roomListBanners) ? 1 : 0);
}
bool _isPartyBannerIndex(int index, List<ATIndexBannerRes> roomListBanners) {
return _shouldShowPartyBanner(roomListBanners) && index == 3;
}
int _roomIndexForListIndex(
int index,
List<ATIndexBannerRes> roomListBanners,
) {
return _shouldShowPartyBanner(roomListBanners) && index > 3
? index - 1
: index;
}
Widget _buildPartyBanner(List<ATIndexBannerRes> roomListBanners) {
return SizedBox(
height: 97.w,
child: Container(
margin: EdgeInsetsDirectional.symmetric(horizontal: 17.w),
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(12.w)),
child: CarouselSlider(
options: CarouselOptions(
height: 97.w,
autoPlay: false,
enlargeCenterPage: false,
enableInfiniteScroll: roomListBanners.length > 1,
viewportFraction: 1,
),
items:
roomListBanners.map((item) {
return _buildPartyBannerRemoteItem(item);
}).toList(),
),
),
);
}
Widget _buildPartyBannerRemoteItem(ATIndexBannerRes item) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
child: netImage(
url: item.cover ?? "",
width: double.infinity,
height: 97.w,
fit: BoxFit.cover,
borderRadius: BorderRadius.circular(12.w),
),
onTap: () {
ATBannerUtils.openBanner(item, context);
},
);
}
_banner(List<ATIndexBannerRes> exploreBanners) {
return Stack(
alignment: AlignmentDirectional.bottomCenter,
@ -431,9 +511,10 @@ class _HomePartyPageState extends State<HomePartyPage>
_countryDisplayName(country),
maxLines: 1,
overflow: TextOverflow.ellipsis,
textColor: isSelected
? const Color(0xff333333)
: const Color(0xff333333),
textColor:
isSelected
? const Color(0xff333333)
: const Color(0xff333333),
fontSize: 14.sp,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500,
lineHeight: 1.1,

View File

@ -160,7 +160,9 @@ class _VoiceRoomPageState extends State<ATVoiceChatRoomPage>
),
Consumer<GiftProvider>(
builder: (context, ref, child) {
return ref.hideLGiftAnimal
return ref.hideLGiftAnimal ||
ref.hideLGiftAnimalOnRoomMessagePage ||
ref.hideLGiftAnimalOnRoomH5Page
? Container()
: GiveRoomLuckWithOtherWidget();
},

View File

@ -159,8 +159,8 @@ class _RoomDetailPageState extends State<RoomDetailPage> {
ref
.currenRoom
?.roomProfile
?.roomProfile
?.roomAccount ??
?.userProfile
?.getID() ??
"",
),
);

View File

@ -179,7 +179,7 @@ class _SeatItemState extends State<SeatItem> with TickerProviderStateMixin {
children: [
SizedBox(height: 16.w),
text(
"NO.${widget.index}",
"NO.${widget.index + 1}",
fontSize: 10.sp,
fontWeight: FontWeight.w600,
),

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:aslan/app_localizations.dart';
@ -6,32 +5,38 @@ import 'package:provider/provider.dart';
import 'package:aslan/chatvibe_ui/components/appbar/chatvibe_appbar.dart';
import 'package:aslan/chatvibe_ui/components/text/at_text.dart';
import 'package:aslan/chatvibe_ui/theme/chatvibe_theme.dart';
import 'package:aslan/chatvibe_data/sources/local/data_persistence.dart';
import 'package:aslan/chatvibe_managers/localization_manager.dart';
import 'package:aslan/chatvibe_core/constants/at_global_config.dart';
///
class LanguagePage extends StatefulWidget {
const LanguagePage({super.key});
@override
_LanguagePageState createState() => _LanguagePageState();
State<LanguagePage> createState() => _LanguagePageState();
}
class _LanguagePageState extends State<LanguagePage> {
int selectType = 1;
static const List<_LanguageOption> _languageOptions = [
_LanguageOption("English", "en"),
_LanguageOption("العربية", "ar"),
_LanguageOption("Türkçe", "tr"),
_LanguageOption("বাংলা", "bn"),
_LanguageOption("Bahasa Indonesia", "id"),
_LanguageOption("Filipino", "fil"),
_LanguageOption("اردو", "ur"),
_LanguageOption("हिन्दी", "hi"),
];
String _selectedLanguageCode = "en";
@override
void initState() {
super.initState();
String langCode = DataPersistence.getLang();
if (langCode == "ar") {
selectType = 1;
}else if(langCode == "tr"){
selectType = 2;
}else if(langCode == "bn"){
selectType = 3;
} else {
selectType = 0;
if (_languageOptions.any((option) => option.languageCode == langCode)) {
_selectedLanguageCode = langCode;
}
}
@ -46,201 +51,79 @@ class _LanguagePageState extends State<LanguagePage> {
fit: BoxFit.fill,
),
Scaffold(
backgroundColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageScaffoldBackgroundColor(),
backgroundColor:
ATGlobalConfig.businessLogicStrategy
.getLanguagePageScaffoldBackgroundColor(),
resizeToAvoidBottomInset: false,
appBar: ChatVibeStandardAppBar(
title: ATAppLocalizations.of(context)!.language,
actions: [],
),
body: Column(
children: [
Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: text(
"English",
textColor: ATGlobalConfig.businessLogicStrategy.getLanguagePagePrimaryTextColor(),
fontSize: 15.sp,
),
),
Checkbox(
value: selectType == 0,
checkColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckColor(),
activeColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxActiveColor(),
onChanged: (b) {
if (selectType == 0) {
selectType = 1;
} else {
selectType = 0;
}
setState(() {});
if (b!) {
Provider.of<LocalizationManager>(
context,
listen: false,
).setLocale(const Locale('en', ''));
}
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderRadius()),
),
side: WidgetStateBorderSide.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}),
),
],
),
Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: text(
"العربية",
textColor: ATGlobalConfig.businessLogicStrategy.getLanguagePagePrimaryTextColor(),
fontSize: 15.sp,
),
),
Checkbox(
value: selectType == 1,
checkColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckColor(),
activeColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxActiveColor(),
onChanged: (b) {
if (selectType == 1) {
selectType = 0;
} else {
selectType = 1;
}
setState(() {});
if (b!) {
Provider.of<LocalizationManager>(
context,
listen: false,
).setLocale(const Locale('ar', ''));
}
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderRadius()),
),
side: WidgetStateBorderSide.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}),
),
],
),
Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: text(
"Türkçe",
textColor: ATGlobalConfig.businessLogicStrategy.getLanguagePagePrimaryTextColor(),
fontSize: 15.sp,
),
),
Checkbox(
value: selectType == 2,
checkColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckColor(),
activeColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxActiveColor(),
onChanged: (b) {
if (selectType == 2) {
selectType = 0;
} else {
selectType = 2;
}
setState(() {});
if (b!) {
Provider.of<LocalizationManager>(
context,
listen: false,
).setLocale(const Locale('tr', ''));
}
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderRadius()),
),
side: WidgetStateBorderSide.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}),
),
],
), Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: text(
"বাংলা",
textColor: ATGlobalConfig.businessLogicStrategy.getLanguagePagePrimaryTextColor(),
fontSize: 15.sp,
),
),
Checkbox(
value: selectType == 3,
checkColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckColor(),
activeColor: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxActiveColor(),
onChanged: (b) {
if (selectType == 3) {
selectType = 0;
} else {
selectType = 3;
}
setState(() {});
if (b!) {
Provider.of<LocalizationManager>(
context,
listen: false,
).setLocale(const Locale('bn', ''));
}
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderRadius()),
),
side: WidgetStateBorderSide.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}
return BorderSide(
color: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderColor(),
width: ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckboxBorderWidth(),
); //
}),
),
],
),
],
children: _languageOptions.map(_buildLanguageRow).toList(),
),
),
],
);
}
Widget _buildLanguageRow(_LanguageOption option) {
return Row(
children: [
SizedBox(width: 15.w),
Expanded(
child: text(
option.title,
textColor:
ATGlobalConfig.businessLogicStrategy
.getLanguagePagePrimaryTextColor(),
fontSize: 15.sp,
),
),
Checkbox(
value: _selectedLanguageCode == option.languageCode,
checkColor:
ATGlobalConfig.businessLogicStrategy.getLanguagePageCheckColor(),
activeColor:
ATGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxActiveColor(),
onChanged: (b) {
if (b != true) {
return;
}
setState(() {
_selectedLanguageCode = option.languageCode;
});
Provider.of<LocalizationManager>(
context,
listen: false,
).setLocale(Locale(option.languageCode, ''));
},
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
ATGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxBorderRadius(),
),
),
side: WidgetStateBorderSide.resolveWith((states) {
return BorderSide(
color:
ATGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxBorderColor(),
width:
ATGlobalConfig.businessLogicStrategy
.getLanguagePageCheckboxBorderWidth(),
);
}),
),
],
);
}
}
class _LanguageOption {
final String title;
final String languageCode;
const _LanguageOption(this.title, this.languageCode);
}

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_svga/flutter_svga.dart';
import 'package:aslan/chatvibe_data/sources/local/file_cache_manager.dart';
import 'package:aslan/chatvibe_data/sources/repositories/config_repository_imp.dart';
import 'package:aslan/chatvibe_data/sources/repositories/room_repository_imp.dart';
import 'package:aslan/chatvibe_core/utilities/at_path_utils.dart';
import 'package:aslan/chatvibe_core/utilities/at_gift_vap_svga_manager.dart';
import 'package:aslan/chatvibe_data/models/country_mode.dart';
import 'package:aslan/chatvibe_domain/models/res/at_banner_leaderboard_res.dart';
import 'package:aslan/chatvibe_domain/models/res/country_res.dart';
@ -25,6 +22,7 @@ class AppGeneralManager extends ChangeNotifier {
Map<String, ChatVibeGiftRes> _giftByIdMap = {};
Map<String, List<ChatVibeGiftRes>> giftByTab = {};
List<String> giftTabs = [];
Map<String, List<ChatVibeGiftRes>> activityGiftByTab = {};
///
@ -115,35 +113,52 @@ class AppGeneralManager extends ChangeNotifier {
try {
giftResList = await ChatRoomRepository().giftList();
giftByTab.clear();
giftTabs.clear();
final apiGiftTabs = <String>[];
for (var gift in giftResList) {
giftByTab[gift.giftTab];
var gmap = giftByTab[gift.giftTab];
final giftTab = gift.giftTab;
if (giftTab == null || giftTab.isEmpty) {
continue;
}
if (!apiGiftTabs.contains(giftTab)) {
apiGiftTabs.add(giftTab);
}
var gmap = giftByTab[giftTab];
gmap ??= [];
gmap.add(gift);
giftByTab[gift.giftTab!] = gmap;
giftByTab[giftTab] = gmap;
var gAllMap = giftByTab["ALL"];
gAllMap ??= [];
if (gift.giftTab != "NATIONAL_FLAG" &&
gift.giftTab != "ACTIVITY" &&
gift.giftTab != "LUCKY_GIFT" &&
gift.giftTab != "CP" &&
gift.giftTab != "CUSTOMIZED" &&
gift.giftTab != "MAGIC") {
if (!_isSpecialGiftTab(giftTab)) {
gAllMap.add(gift);
}
giftByTab["ALL"] = gAllMap;
_giftByIdMap[gift.id!] = gift;
if (gift.id != null) {
_giftByIdMap[gift.id!] = gift;
}
}
if (includeCustomized) {
giftByTab["CUSTOMIZED"] ??= [];
///
giftByTab["CUSTOMIZED"]?.insert(0, ChatVibeGiftRes(id: "-1000"));
for (final giftTab in apiGiftTabs) {
if (_isCustomizedGiftTab(giftTab) &&
(giftByTab[giftTab]?.isNotEmpty ?? false)) {
///
giftByTab[giftTab]?.insert(0, ChatVibeGiftRes(id: "-1000"));
}
}
} else {
giftByTab.remove("CUSTOMIZED");
giftByTab.remove("EXCLUSIVE");
apiGiftTabs.removeWhere(_isCustomizedGiftTab);
}
if (giftByTab["ALL"]?.isNotEmpty ?? false) {
giftTabs.add("ALL");
}
giftTabs.addAll(
apiGiftTabs.where((giftTab) => _isSpecialGiftTab(giftTab)),
);
notifyListeners();
///
@ -151,6 +166,19 @@ class AppGeneralManager extends ChangeNotifier {
} catch (e) {}
}
bool _isSpecialGiftTab(String giftTab) {
return giftTab == "NATIONAL_FLAG" ||
giftTab == "ACTIVITY" ||
giftTab == "LUCKY_GIFT" ||
giftTab == "CP" ||
_isCustomizedGiftTab(giftTab) ||
giftTab == "MAGIC";
}
bool _isCustomizedGiftTab(String giftTab) {
return giftTab == "CUSTOMIZED" || giftTab == "EXCLUSIVE";
}
void giftActivityList() async {
try {
activityList.clear();
@ -180,26 +208,9 @@ class AppGeneralManager extends ChangeNotifier {
void downLoad(List<ChatVibeGiftRes> giftResList) {
for (var gift in giftResList) {
if (gift.giftSourceUrl != null) {
if (ATPathUtils.fetchFileExtensionFunction(
gift.giftSourceUrl!,
).toLowerCase() ==
".svga") {
///
if (!ATGiftVapSvgaManager().videoItemCache.containsKey(
gift.giftSourceUrl,
)) {
SVGAParser.shared.decodeFromURL(gift.giftSourceUrl!).then((entity) {
entity.autorelease = false;
ATGiftVapSvgaManager().videoItemCache[gift.giftSourceUrl!] =
entity;
});
}
} else {
if ((gift.giftSourceUrl ?? "").isNotEmpty) {
FileCacheManager.getInstance().getFile(url: gift.giftSourceUrl!);
}
}
final sourceUrl = gift.giftSourceUrl;
if (sourceUrl != null && sourceUrl.isNotEmpty) {
FileCacheManager.getInstance().getFile(url: sourceUrl);
}
}
}
@ -207,6 +218,7 @@ class AppGeneralManager extends ChangeNotifier {
List<ATIndexBannerRes> homeBanners = [];
List<ATIndexBannerRes> exploreBanners = [];
List<ATIndexBannerRes> roomBanners = [];
List<ATIndexBannerRes> roomListBanners = [];
List<ATIndexBannerRes> gameBanners = [];
///banner
@ -215,22 +227,25 @@ class AppGeneralManager extends ChangeNotifier {
var banners = await ConfigRepositoryImp().getBanner();
homeBanners.clear();
roomBanners.clear();
roomListBanners.clear();
gameBanners.clear();
exploreBanners.clear();
for (var v in banners) {
if ((v.displayPosition ?? "").contains(
ATBannerType.EXPLORE_PAGE.name,
)) {
List<String> displayPositions = (v.displayPosition ?? "").split(',');
if (displayPositions.contains(ATBannerType.EXPLORE_PAGE.name)) {
exploreBanners.add(v);
}
if ((v.displayPosition ?? "").contains(ATBannerType.ROOM.name)) {
if (displayPositions.contains(ATBannerType.ROOM.name)) {
roomBanners.add(v);
}
if (displayPositions.contains(ATBannerType.ROOM_LIST.name)) {
roomListBanners.add(v);
}
if ((v.displayPosition ?? "").contains(ATBannerType.HOME_ALERT.name)) {
if (displayPositions.contains(ATBannerType.HOME_ALERT.name)) {
homeBanners.add(v);
}
if ((v.displayPosition ?? "").contains(ATBannerType.GAME.name)) {
if (displayPositions.contains(ATBannerType.GAME.name)) {
gameBanners.add(v);
}
}

View File

@ -11,6 +11,12 @@ class ChatVibeGiftSystemManager extends ChangeNotifier {
///
bool hideLGiftAnimal = false;
///
bool hideLGiftAnimalOnRoomMessagePage = false;
/// H5
bool hideLGiftAnimalOnRoomH5Page = false;
///
Map<num, bool> isPlayed = {
10: false,
@ -78,6 +84,22 @@ class ChatVibeGiftSystemManager extends ChangeNotifier {
notifyListeners();
}
void updateHideLGiftAnimalOnRoomMessagePage(bool isHide) {
if (hideLGiftAnimalOnRoomMessagePage == isHide) {
return;
}
hideLGiftAnimalOnRoomMessagePage = isHide;
notifyListeners();
}
void updateHideLGiftAnimalOnRoomH5Page(bool isHide) {
if (hideLGiftAnimalOnRoomH5Page == isHide) {
return;
}
hideLGiftAnimalOnRoomH5Page = isHide;
notifyListeners();
}
void reset() {
gift = null;
luckGiftObtainCoins = 0;

View File

@ -6,6 +6,17 @@ import 'package:aslan/chatvibe_core/constants/at_global_config.dart';
import 'package:aslan/chatvibe_data/sources/local/data_persistence.dart';
class LocalizationManager with ChangeNotifier {
static const List<String> _supportedLanguageCodes = [
'en',
'ar',
'tr',
'bn',
'id',
'fil',
'ur',
'hi',
];
Locale? _locale;
Locale? get locale => _locale;
@ -17,34 +28,29 @@ class LocalizationManager with ChangeNotifier {
init() {
String language = DataPersistence.getLang();
if (language.isEmpty) {
Locale systemLocale = ui.window.locale;
if (systemLocale.languageCode.startsWith("ar")) {
_locale = Locale('ar', '');
} else if (systemLocale.languageCode == "en") {
_locale = Locale('en', '');
} else if (systemLocale.languageCode == "tr") {
_locale = Locale('tr', '');
} else if (systemLocale.languageCode == "bn") {
_locale = Locale('bn', '');
} else {
_locale = Locale('en', '');
}
Locale systemLocale = ui.PlatformDispatcher.instance.locale;
_locale = Locale(_normalizeLanguageCode(systemLocale.languageCode), '');
} else {
if (language.startsWith("ar")) {
_locale = Locale('ar', '');
} else if (language == "tr") {
_locale = Locale('tr', '');
} else if (language == "bn") {
_locale = Locale('bn', '');
} else {
_locale = Locale('en', '');
}
_locale = Locale(_normalizeLanguageCode(language), '');
}
if (_locale != null) {
setLocale(_locale!);
}
}
String _normalizeLanguageCode(String languageCode) {
if (languageCode.startsWith("ar")) {
return 'ar';
}
if (languageCode == 'tl') {
return 'fil';
}
if (_supportedLanguageCodes.contains(languageCode)) {
return languageCode;
}
return 'en';
}
void setLocale(Locale locale) {
_locale = locale;
ATGlobalConfig.lang = locale.languageCode;

View File

@ -8,6 +8,7 @@ import 'package:aslan/chatvibe_domain/models/res/at_edit_room_info_res.dart';
import 'package:aslan/chatvibe_domain/models/res/my_room_res.dart';
import 'package:aslan/chatvibe_domain/models/res/at_room_contribute_level_res.dart';
class ChatVibeRoomManager extends ChangeNotifier {
MyRoomRes? myRoom;
ATRoomContributeLevelRes? roomContributeLevelRes;
@ -26,21 +27,23 @@ class ChatVibeRoomManager extends ChangeNotifier {
}
}
void createRoom(BuildContext context) async {
Future<MyRoomRes?> createRoom(BuildContext context) async {
final createRoomSuccessText =
ATAppLocalizations.of(context)!.createRoomSuccsess;
ATLoadingManager.exhibitOperation(context: context);
await AccountRepository().createRoom();
myRoom = await AccountRepository().myProfile();
ATTts.show(ATAppLocalizations.of(context)!.createRoomSuccsess);
ATTts.show(createRoomSuccessText);
notifyListeners();
ATLoadingManager.veilRoutine();
return myRoom;
}
void contributionLevel(String roomId) {
roomContributeLevelRes = null;
ChatRoomRepository().roomContributionActivity(roomId).then((value){
ChatRoomRepository().roomContributionActivity(roomId).then((value) {
roomContributeLevelRes = value;
notifyListeners();
});
}
}

View File

@ -655,66 +655,66 @@ class RealTimeCommunicationManager extends ChangeNotifier {
);
final int roomSessionId = _nextRoomSessionId();
if (currenRoom?.entrants?.roles == ATRoomRolesType.TOURIST.name) {
SmartDialog.show(
tag: "showJoinRoomMember",
alignment: Alignment.center,
animationType: SmartAnimationType.fade,
clickMaskDismiss: false,
backType: SmartBackType.block,
builder: (_) {
return JoinRoomMemberPage(
currenRoom?.roomProfile?.roomProfile?.id ?? "",
() {
ATLoadingManager.exhibitOperation(context: context);
//
ChatRoomRepository()
.changeRoomRole(
roomId,
ATRoomRolesType.ADMIN.name,
AccountStorage().getCurrentUser()?.userProfile?.id ??
"",
AccountStorage().getCurrentUser()?.userProfile?.id ??
"",
"ONESELF_JOIN",
)
.then(
(result) async {
currenRoom = currenRoom?.copyWith(
entrants: currenRoom?.entrants?.copyWith(
roles: ATRoomRolesType.MEMBER.name,
),
);
await initRoon(
roomSessionId: roomSessionId,
needOpenRedenvelope: needOpenRedenvelope,
redPackId: redPackId,
);
ATLoadingManager.veilRoutine();
notifyListeners();
},
onError: (e) {
currenRoom = null;
ATLoadingManager.veilRoutine();
},
);
},
() {
_nextRoomSessionId();
currenRoom = null;
},
() async {
await initRoon(
roomSessionId: roomSessionId,
needOpenRedenvelope: needOpenRedenvelope,
redPackId: redPackId,
);
ATLoadingManager.veilRoutine();
notifyListeners();
},
);
},
// SmartDialog.show(
// tag: "showJoinRoomMember",
// alignment: Alignment.center,
// animationType: SmartAnimationType.fade,
// clickMaskDismiss: false,
// backType: SmartBackType.block,
// builder: (_) {
// return JoinRoomMemberPage(
// currenRoom?.roomProfile?.roomProfile?.id ?? "",
// () {
// ATLoadingManager.exhibitOperation(context: context);
// //
// ChatRoomRepository()
// .changeRoomRole(
// roomId,
// ATRoomRolesType.ADMIN.name,
// AccountStorage().getCurrentUser()?.userProfile?.id ??
// "",
// AccountStorage().getCurrentUser()?.userProfile?.id ??
// "",
// "ONESELF_JOIN",
// )
// .then(
// (result) async {
// currenRoom = currenRoom?.copyWith(
// entrants: currenRoom?.entrants?.copyWith(
// roles: ATRoomRolesType.MEMBER.name,
// ),
// );
// await initRoon(
// roomSessionId: roomSessionId,
// needOpenRedenvelope: needOpenRedenvelope,
// redPackId: redPackId,
// );
// ATLoadingManager.veilRoutine();
// notifyListeners();
// },
// onError: (e) {
// currenRoom = null;
// ATLoadingManager.veilRoutine();
// },
// );
// },
// () {
// _nextRoomSessionId();
// currenRoom = null;
// },
// () async {
await initRoon(
roomSessionId: roomSessionId,
needOpenRedenvelope: needOpenRedenvelope,
redPackId: redPackId,
);
ATLoadingManager.veilRoutine();
notifyListeners();
// },
// );
// },
// );
ATLoadingManager.veilRoutine();
} else {
await initRoon(
roomSessionId: roomSessionId,
@ -1126,6 +1126,17 @@ class RealTimeCommunicationManager extends ChangeNotifier {
}
} else {
ChatVibeUserProfile? roomWheatUser = roomWheatMap[index]?.user;
if (roomWheatUser != null &&
roomWheatUser.id !=
AccountStorage().getCurrentUser()?.userProfile?.id &&
!isFz() &&
!isGL()) {
showBottomInBottomDialog(
context!,
ATRoomUserInfoCard(userId: roomWheatUser.id),
);
return;
}
showBottomInBottomDialog(
context!,
EmptyMaiSelect(index: index, clickUser: roomWheatUser),

View File

@ -2,6 +2,7 @@ import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:dio/dio.dart';
import 'package:extended_image/extended_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@ -14,7 +15,9 @@ import 'package:aslan/chatvibe_core/utilities/at_path_utils.dart';
import 'package:aslan/chatvibe_core/utilities/at_room_utils.dart';
import 'package:aslan/chatvibe_data/sources/local/floating_screen_manager.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:aslan/chatvibe_data/sources/repositories/room_repository_imp.dart';
import 'package:aslan/chatvibe_managers/rtc_manager.dart';
import 'package:aslan/main.dart';
import 'package:provider/provider.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart';
@ -558,6 +561,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
String msg,
V2TimConversation toConversation,
) async {
String? chatBubbleCustomData = _buildChatBubbleCustomData();
//
V2TimValueCallback<V2TimMsgCreateInfoResult> createTextMessageRes =
await TencentImSDKPlugin.v2TIMManager
@ -580,6 +584,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
id: id, // messageid
receiver: toConversation.userID!, // id
needReadReceipt: true,
cloudCustomData: chatBubbleCustomData,
groupID: '', //
);
if (sendMessageRes.code == 0) {
@ -593,6 +598,17 @@ class RealTimeMessagingManager extends ChangeNotifier {
}
}
String? _buildChatBubbleCustomData() {
PropsResources? chatBox = AccountStorage().getChatbox();
String chatBubbleUrl = (chatBox?.expand ?? "").trim();
if (chatBubbleUrl.isEmpty) {
return null;
}
return jsonEncode({
"chatBubble": {"id": chatBox?.id, "expand": chatBubbleUrl},
});
}
///
Future<void> sendC2CCustomMsg(
String msg,
@ -638,6 +654,51 @@ class RealTimeMessagingManager extends ChangeNotifier {
}
}
///
Future<double?> sendPrivateGift({
required String userID,
required ChatVibeGiftRes gift,
required int number,
}) async {
if (userID.isEmpty || (gift.id?.isEmpty ?? true)) {
ATTts.show('Gift parameter error');
return null;
}
try {
return await ChatRoomRepository().givePrivateGift(
userID,
gift.id!,
number,
);
} catch (e) {
String error = e.toString();
if (_isPrivateGiftInsufficientBalance(e)) {
if(e is DioException) {
final data = e.response?.data;
error = data["errorMsg"]?.toString() ?? e.toString();
}
}
ATTts.show(error);
return null;
}
}
bool _isPrivateGiftInsufficientBalance(Object error) {
if (error is! DioException) {
return false;
}
final data = error.response?.data;
if (data is! Map<String, dynamic>) {
return false;
}
final errorCode = data["errorCode"]?.toString();
final errorCodeName = data["errorCodeName"]?.toString();
final errorMsg = data["errorMsg"]?.toString();
return errorCodeName == "INSUFFICIENT_BALANCE" ||
errorCode == "5000" ||
errorMsg == "INSUFFICIENT_BALANCE";
}
///
Future<void> sendImageMsg({
List<File>? selectedList,
@ -693,7 +754,9 @@ class RealTimeMessagingManager extends ChangeNotifier {
}
} else if (ATPathUtils.receiveFileType(entity.path) == "video_pic") {
if (entity.lengthSync() > 50000000) {
ATTts.show(ATAppLocalizations.of(context!)!.theVideoSizeCannotExceed);
ATTts.show(
ATAppLocalizations.of(context!)!.theVideoSizeCannotExceed,
);
return;
}
//
@ -705,10 +768,11 @@ class RealTimeMessagingManager extends ChangeNotifier {
await entity.copy(newFile.path);
}
//
String? thumbImagePath = await ATMessageUtils.produceFileThumbnailProcess(
newFile.path,
128,
);
String? thumbImagePath =
await ATMessageUtils.produceFileThumbnailProcess(
newFile.path,
128,
);
V2TimValueCallback<V2TimMsgCreateInfoResult> createVideoMessageRes =
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
@ -920,7 +984,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
rocketLevel: fdata["giftWindowLevel"],
);
OverlayManager().addMessage(msg);
} else if (type == ATRoomMsgType.roomRedPacket) {
} else if (type == ATRoomMsgType.roomRedPacket) {
///
var fData = data["data"];
ATFloatingMessage msg = ATFloatingMessage(
@ -947,7 +1011,8 @@ class RealTimeMessagingManager extends ChangeNotifier {
///
var fdata = data["data"];
ATFloatingMessage msg = ATFloatingMessage.fromJson(fdata);
if (msg.toUserId == AccountStorage().getCurrentUser()?.userProfile?.id &&
if (msg.toUserId ==
AccountStorage().getCurrentUser()?.userProfile?.id &&
msg.roomId !=
Provider.of<RealTimeCommunicationManager>(
context!,
@ -1111,11 +1176,17 @@ class RealTimeMessagingManager extends ChangeNotifier {
} else {
res = ATRoomThemeListRes();
}
Provider.of<RealTimeCommunicationManager>(context!, listen: false).updateRoomBG(res);
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).updateRoomBG(res);
return;
}
if (msg.type == ATRoomMsgType.emoticons) {
Provider.of<RealTimeCommunicationManager>(context!, listen: false).starPlayEmoji(msg);
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).starPlayEmoji(msg);
return;
}
if (msg.type == ATRoomMsgType.micChange) {
@ -1128,7 +1199,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
timeId: micChangePush.data?.timeId,
);
} else if (msg.type == ATRoomMsgType.refreshOnlineUser) {
Provider.of<RealTimeCommunicationManager>(context!, listen: false).getOnlineUsers();
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).getOnlineUsers();
} else if (msg.type == ATRoomMsgType.gameLuckyGift) {
var broadCastRes = ATBroadCastLuckGiftPush.fromJson(data);
msg.gift = ChatVibeGiftRes(giftPhoto: broadCastRes.data?.giftCover);
@ -1264,7 +1338,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
return;
} else if (msg.type == ATRoomMsgType.roomRoleChange) {
///
Provider.of<RealTimeCommunicationManager>(context!, listen: false).getMicList();
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).getMicList();
if (msg.toUser?.id ==
AccountStorage().getCurrentUser()?.userProfile?.id) {
Provider.of<RealTimeCommunicationManager>(
@ -1313,7 +1390,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
).roomMannyGameClose();
return;
} else if (msg.type == ATRoomMsgType.roomGameCreate) {
Provider.of<RealTimeCommunicationManager>(context!, listen: false).getLudoGameInfo();
Provider.of<RealTimeCommunicationManager>(
context!,
listen: false,
).getLudoGameInfo();
return;
}
addMsg(msg);

View File

@ -344,12 +344,21 @@ class _ConversationItemState extends State<ConversationItem> {
MessageElemType.V2TIM_ELEM_TYPE_CUSTOM) {
V2TimCustomElem customElem = conversation.lastMessage!.customElem!;
content = customElem.desc ?? "";
/*if (customElem.extension == 'sendGift') {
content = "[礼物]";
} else {
content = "[收到一条消息]";
}*/
content = ATAppLocalizations.of(context)!.receivedAMessage;
try {
var data = jsonDecode(customElem.data ?? "");
if (customElem.desc == "PRIVATE_GIFT" ||
(data is Map<String, dynamic> &&
data["type"] == "PRIVATE_GIFT")) {
content = ATAppLocalizations.of(context)!.gift2;
} else {
content = ATAppLocalizations.of(context)!.receivedAMessage;
}
} catch (_) {
content =
customElem.desc == "PRIVATE_GIFT"
? ATAppLocalizations.of(context)!.gift2
: ATAppLocalizations.of(context)!.receivedAMessage;
}
}
}
}

View File

@ -2,10 +2,12 @@ import 'dart:convert';
import 'package:aslan/main.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:aslan/app_localizations.dart';
import 'package:aslan/chatvibe_ui/components/at_debounce_widget.dart';
import 'package:aslan/chatvibe_ui/components/at_tts.dart';
import 'package:aslan/chatvibe_ui/components/text/at_text.dart';
import 'package:aslan/chatvibe_data/sources/local/user_manager.dart';
import 'package:aslan/chatvibe_features/index/main_route.dart';
@ -261,6 +263,36 @@ class _ATRoomUserInfoCardState extends State<ATRoomUserInfoCard> {
0) >
13,
),
SizedBox(width: 4.w),
GestureDetector(
behavior:
HitTestBehavior.opaque,
onTap: () {
Clipboard.setData(
ClipboardData(
text:
ref
.userCardInfo
?.userProfile
?.getID() ??
"",
),
);
ATTts.show(
ATAppLocalizations.of(
context,
)!.copiedToClipboard,
);
},
child: Padding(
padding: EdgeInsets.all(2.w),
child: Image.asset(
"atu_images/index/at_icon_user_card_copy_id.png",
width: 16.w,
height: 16.w,
),
),
),
],
),
],

View File

@ -29,6 +29,7 @@ class _VapPlusSvgaPlayerState extends State<VapPlusSvgaPlayer>
@override
void dispose() {
ATGiftVapSvgaManager().dispose();
_svgaController.dispose();
super.dispose();
}

View File

@ -0,0 +1,726 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:aslan/app_localizations.dart';
import 'package:aslan/chatvibe_core/constants/at_global_config.dart';
import 'package:aslan/chatvibe_data/models/enum/at_activity_reward_props_type.dart';
import 'package:aslan/chatvibe_data/sources/repositories/room_repository_imp.dart';
import 'package:aslan/chatvibe_domain/models/res/at_room_rocket_config_res.dart';
import 'package:aslan/chatvibe_domain/models/res/at_room_rocket_status_res.dart';
import 'package:aslan/chatvibe_managers/rtc_manager.dart';
import 'package:aslan/chatvibe_ui/components/at_compontent.dart';
import 'package:aslan/chatvibe_ui/components/text/at_text.dart';
import 'package:provider/provider.dart';
class RoomRocketYellowPage extends StatefulWidget {
const RoomRocketYellowPage({super.key});
@override
State<RoomRocketYellowPage> createState() => _RoomRocketYellowPageState();
}
class _RoomRocketYellowPageState extends State<RoomRocketYellowPage> {
final List<ATRoomRocketConfigRes> _levels = [];
ATRoomRocketConfigRes? currernRocketLevel;
ATRoomRocketStatusRes? roomRocketStatus;
bool _isLoading = true;
int _selectedRewardTab = 0;
@override
void initState() {
super.initState();
roomRocketStatus =
Provider.of<RtcProvider>(context, listen: false).roomRocketStatus;
ChatRoomRepository()
.rocketConfigEnabled()
.then((res) {
if (!mounted) return;
_levels
..clear()
..addAll(res);
currernRocketLevel = _findCurrentLevel(res);
setState(() {
_isLoading = false;
});
})
.catchError((e) {
if (!mounted) return;
setState(() {
_isLoading = false;
});
});
}
ATRoomRocketConfigRes? _findCurrentLevel(List<ATRoomRocketConfigRes> levels) {
if (levels.isEmpty) return null;
final num currentLevel = roomRocketStatus?.level ?? levels.first.level ?? 1;
final match = levels.where((item) => item.level == currentLevel).toList();
return match.isNotEmpty ? match.first : levels.first;
}
@override
Widget build(BuildContext context) {
return SafeArea(
top: false,
child: Container(
width: ScreenUtil().screenWidth,
height: 623.w,
constraints: BoxConstraints(
maxHeight: ScreenUtil().screenHeight * 0.86,
),
child: Stack(
clipBehavior: Clip.none,
children: [
const Positioned.fill(child: _RocketYellowBackground()),
if (_isLoading)
Center(
child: CupertinoActivityIndicator(
color: Colors.white,
radius: 12.w,
),
)
else
_buildBody(),
],
),
),
);
}
Widget _buildBody() {
if (_levels.isEmpty || currernRocketLevel == null) {
return Center(
child: text(
ATAppLocalizations.of(context)!.noData,
textColor: Colors.white70,
fontSize: 14.sp,
fontWeight: FontWeight.w600,
),
);
}
return Stack(
children: [
PositionedDirectional(
top: 4.w,
start: 112.w,
width: 154.w,
height: 196.w,
child: Image.asset(
"atu_images/room/at_icon_room_rocket_lv${currernRocketLevel?.level ?? 1}.png",
fit: BoxFit.contain,
),
),
PositionedDirectional(
top: 164.w,
start: 16.w,
width: 26.w,
height: 26.w,
child: _buildMiniButton(
child: text(
"?",
textColor: Colors.white,
fontSize: 18.sp,
fontWeight: FontWeight.w700,
),
onTap: _showHelpDialog,
),
),
PositionedDirectional(
top: 164.w,
end: 16.w,
width: 54.w,
height: 26.w,
child: _buildMiniButton(
child: text(
ATAppLocalizations.of(context)!.roomRocketRecordAction,
textColor: Colors.white,
fontSize: 12.sp,
maxLines: 1,
),
onTap: _showRecordDialog,
),
),
PositionedDirectional(
top: 217.w,
start: 16.w,
end: 16.w,
height: 82.w,
child: _buildLevelRow(),
),
PositionedDirectional(
top: 312.w,
start: 16.w,
end: 16.w,
height: 12.w,
child: Consumer<RtcProvider>(
builder: (context, ref, child) {
return _buildProgressBar(ref.roomRocketStatus);
},
),
),
PositionedDirectional(
top: 332.w,
start: 16.w,
end: 16.w,
height: 14.w,
child: Consumer<RtcProvider>(
builder: (context, ref, child) {
final progress = _progressValue(ref.roomRocketStatus);
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
text(
"${ref.roomRocketStatus?.currentEnergy ?? 0}/${currernRocketLevel?.maxEnergy ?? 0}",
textColor: Color(0xFFFFDC37),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
SizedBox(width: 10.w),
text(
"${(progress * 100).clamp(0, 100).toInt()}%",
textColor: Color(0xFFFFDC37),
fontSize: 12.sp,
fontWeight: FontWeight.w500,
),
],
);
},
),
),
PositionedDirectional(
top: 354.w,
start: 16.w,
end: 16.w,
height: 20.w,
child: _buildRewardTabs(),
),
PositionedDirectional(
top: 386.w,
start: 16.w,
end: 16.w,
height: 148.w,
child: _buildRewardPanel(),
),
PositionedDirectional(
bottom: 28.w,
start: 56.w,
end: 56.w,
child: text(
ATAppLocalizations.of(context)!.roomRocketResetCountdown,
textColor: Color(0xFFFFDC37).withValues(alpha: 0.55),
fontSize: 12.sp,
maxLines: 1,
textAlign: TextAlign.center,
),
),
],
);
}
Widget _buildMiniButton({
required Widget child,
required VoidCallback onTap,
}) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: onTap,
child: Container(
alignment: AlignmentDirectional.center,
decoration: BoxDecoration(
color: Colors.white.withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(13.w),
),
child: child,
),
);
}
Widget _buildLevelRow() {
return ListView.builder(
scrollDirection: Axis.horizontal,
padding: EdgeInsets.zero,
itemCount: _levels.length * 2 - 1,
itemBuilder: (context, index) {
if (index.isOdd) {
return SizedBox(
width: 18.w,
child: Icon(
Icons.arrow_forward_rounded,
color: Color(0xFFFFC91D).withValues(alpha: 0.65),
size: 18.w,
),
);
}
final int levelIndex = index ~/ 2;
final item = _levels[levelIndex];
final bool selected = item.level == currernRocketLevel?.level;
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
currernRocketLevel = item;
});
},
child: SizedBox(
width: 54.w,
height: 82.w,
child: Stack(
alignment: AlignmentDirectional.topCenter,
children: [
PositionedDirectional(
top: 2.w,
width: 54.w,
height: 54.w,
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient:
selected
? RadialGradient(
colors: [
Color(0xFFFFFFFF),
Color(0xFFFFE263),
Color(0xFFFF9D00),
],
)
: RadialGradient(
colors: [
Colors.white.withValues(alpha: 0.22),
Colors.white.withValues(alpha: 0.08),
],
),
border: Border.all(
color:
selected
? Color(0xFFFFF1A3)
: Color(0xFFFFDC37).withValues(alpha: 0.45),
width: 1.w,
),
boxShadow:
selected
? [
BoxShadow(
color: Color(
0xFFFFE263,
).withValues(alpha: 0.7),
blurRadius: 8.w,
spreadRadius: 1.w,
),
]
: null,
),
),
),
PositionedDirectional(
top: 6.w,
width: 46.w,
height: 46.w,
child: Image.asset(
"atu_images/room/at_icon_room_rocket_lv${item.level ?? 1}.png",
fit: BoxFit.contain,
),
),
],
),
),
);
},
);
}
Widget _buildProgressBar(ATRoomRocketStatusRes? status) {
final double progress = _progressValue(status);
return LayoutBuilder(
builder: (context, constraints) {
final bool isRtl = Directionality.of(context) == TextDirection.rtl;
final double thumbWidth = 30.w;
final double thumbStart =
(constraints.maxWidth * progress) - thumbWidth / 2;
final double safeStart =
thumbStart.clamp(0, constraints.maxWidth - thumbWidth).toDouble();
return Stack(
clipBehavior: Clip.none,
children: [
Positioned.fill(
child: ClipRRect(
borderRadius: BorderRadius.circular(20.w),
child: Stack(
fit: StackFit.expand,
children: [
Container(color: Color(0xFFFFE940).withValues(alpha: 0.45)),
FractionallySizedBox(
alignment: AlignmentDirectional.centerStart,
widthFactor: progress,
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFFFFF1A3), Color(0xFFFFA000)],
),
),
),
),
],
),
),
),
PositionedDirectional(
start: safeStart,
top: -6.w,
width: thumbWidth,
height: 25.w,
child: RotatedBox(
quarterTurns: isRtl ? 3 : 1,
child: Image.asset(
"atu_images/room/at_icon_room_rocket_lv${currernRocketLevel?.level ?? 1}.png",
fit: BoxFit.contain,
),
),
),
],
);
},
);
}
double _progressValue(ATRoomRocketStatusRes? status) {
final num current =
status?.currentEnergy ?? roomRocketStatus?.currentEnergy ?? 0;
final num max = currernRocketLevel?.maxEnergy ?? status?.maxEnergy ?? 0;
if (max <= 0) return 0;
return (current / max).clamp(0.0, 1.0).toDouble();
}
Widget _buildRewardTabs() {
final l10n = ATAppLocalizations.of(context)!;
final labels = [
l10n.roomRocketRewardTop1,
l10n.roomRocketRewardSetOff,
l10n.roomRocketRewardInRoom,
];
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: List.generate(labels.length, (index) {
final bool selected = _selectedRewardTab == index;
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
setState(() {
_selectedRewardTab = index;
});
},
child: SizedBox(
width: 100.w,
child: text(
"\\\\\\ ${labels[index]} ///",
textColor:
selected
? Color(0xFFFFFD78)
: Colors.white.withValues(alpha: 0.5),
fontSize: 12.sp,
maxLines: 1,
textAlign: TextAlign.center,
),
),
);
}),
);
}
Widget _buildRewardPanel() {
final rewards = currernRocketLevel?.rewardConfig ?? [];
return Container(
padding: EdgeInsets.all(12.w),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: AlignmentDirectional.topStart,
end: AlignmentDirectional.bottomEnd,
colors: [
Color(0xFFFFB21D).withValues(alpha: 0.62),
Color(0xFFFF7A00).withValues(alpha: 0.48),
],
),
borderRadius: BorderRadius.circular(16.w),
border: Border.all(color: Color(0xFFFFE16A).withValues(alpha: 0.75)),
boxShadow: [
BoxShadow(
color: Color(0xFFFFD44A).withValues(alpha: 0.42),
blurRadius: 10.w,
spreadRadius: 0,
),
],
),
child:
rewards.isEmpty
? Center(
child: text(
ATAppLocalizations.of(context)!.noData,
textColor: Colors.white70,
fontSize: 13.sp,
),
)
: Row(
children: [
_buildRewardItem(rewards.first, 124.w, 108.w),
SizedBox(width: 6.w),
Expanded(
child: GridView.builder(
padding: EdgeInsets.zero,
physics: NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
mainAxisSpacing: 6.w,
crossAxisSpacing: 6.w,
),
itemCount: rewards.length > 7 ? 6 : rewards.length - 1,
itemBuilder: (context, index) {
return _buildRewardItem(rewards[index + 1], 59.w, 51.w);
},
),
),
],
),
);
}
Widget _buildRewardItem(
RewardConfig reward,
double boxSize,
double iconSize,
) {
return Container(
width: boxSize,
height: boxSize,
alignment: AlignmentDirectional.center,
decoration: BoxDecoration(
color: Color(0xFFFFF4C6).withValues(alpha: 0.18),
borderRadius: BorderRadius.circular(8.w),
border: Border.all(color: Color(0xFFFFD540).withValues(alpha: 0.35)),
),
child: _buildRewardIcon(reward, iconSize),
);
}
Widget _buildRewardIcon(RewardConfig reward, double size) {
if (reward.type == ATActivityRewardATPropsType.GOLD.name) {
return Image.asset(
"atu_images/general/at_icon_jb.png",
width: size,
height: size,
fit: BoxFit.contain,
);
}
final cover = reward.cover ?? "";
if (cover.isEmpty) return Container();
return netImage(
url: cover,
width: size,
height: size,
fit: BoxFit.contain,
noDefaultImg: true,
);
}
void _showHelpDialog() {
SmartDialog.show(
tag: "showRoomRocketHelpDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) {
return Container(
width: ScreenUtil().screenWidth,
margin: EdgeInsets.symmetric(horizontal: 15.w),
padding: EdgeInsets.symmetric(horizontal: 20.w),
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage(
"atu_images/room/at_icon_room_rocket_hepl_bg.png",
),
fit: BoxFit.fill,
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(height: 13.w),
Image.asset(
ATGlobalConfig.lang == "ar"
? "atu_images/room/at_icon_room_rocket_rule_text_ar.png"
: "atu_images/room/at_icon_room_rocket_rule_text_en.png",
width: 58.w,
),
SizedBox(height: 8.w),
text(
ATAppLocalizations.of(context)!.roomRocketHelpTips,
maxLines: 25,
fontSize: 14.sp,
fontWeight: FontWeight.bold,
),
SizedBox(height: 20.w),
],
),
);
},
);
}
void _showRecordDialog() {
SmartDialog.show(
tag: "showRoomRocketRecordDialog",
alignment: Alignment.center,
debounce: true,
animationType: SmartAnimationType.fade,
builder: (_) => const _RoomRocketRecordDialog(),
);
}
}
class _RoomRocketRecordDialog extends StatelessWidget {
const _RoomRocketRecordDialog();
@override
Widget build(BuildContext context) {
return SafeArea(
top: false,
child: SizedBox(
width: 360.w,
height: 576.w,
child: Stack(
children: [
Positioned.fill(
child: IgnorePointer(
child: Image.asset(
"atu_images/room/at_icon_room_rocket_record_bg.png",
fit: BoxFit.fill,
),
),
),
PositionedDirectional(
top: 12.w,
start: 0,
end: 0,
child: text(
ATAppLocalizations.of(context)!.roomRocketRecordAction,
textColor: Colors.white,
fontSize: 16.sp,
fontWeight: FontWeight.w600,
textAlign: TextAlign.center,
),
),
PositionedDirectional(
top: 27.w,
end: 24.w,
width: 24.w,
height: 24.w,
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
SmartDialog.dismiss(tag: "showRoomRocketRecordDialog");
},
child: Image.asset(
"atu_images/room/at_icon_room_game_close.png",
fit: BoxFit.contain,
color: Color(0xFFFFF3A8),
),
),
),
PositionedDirectional(
top: 49.w,
start: 52.w,
child: _buildHeaderLabel(
context,
ATAppLocalizations.of(context)!.roomRocketRecordRoom,
),
),
PositionedDirectional(
top: 49.w,
start: 214.w,
child: _buildHeaderLabel(
context,
ATAppLocalizations.of(context)!.roomRocketRecordReward,
),
),
PositionedDirectional(
top: 80.w,
start: 30.w,
end: 28.w,
bottom: 44.w,
child: Center(
child: text(
ATAppLocalizations.of(context)!.noData,
textColor: Color(0xFFFFFFFF),
fontSize: 14.sp,
fontWeight: FontWeight.w600,
),
),
),
PositionedDirectional(
start: 0,
end: 0,
bottom: 24.w,
child: text(
ATAppLocalizations.of(context)!.roomRocketRecordLast35Days,
textColor: Colors.white,
fontSize: 12.sp,
maxLines: 1,
textAlign: TextAlign.center,
),
),
],
),
),
);
}
Widget _buildHeaderLabel(BuildContext context, String label) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
_buildMark(),
SizedBox(width: 4.w),
text(
label,
textColor: Colors.white,
fontSize: 14.sp,
maxLines: 1,
textAlign: TextAlign.center,
),
SizedBox(width: 4.w),
Transform(
alignment: Alignment.center,
transform: Matrix4.diagonal3Values(-1, 1, 1),
child: _buildMark(),
),
],
);
}
Widget _buildMark() {
return Container(
width: 16.w,
height: 8.w,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Color(0x00FFFFFF), Color(0xFFFFF1A3)],
),
),
);
}
}
class _RocketYellowBackground extends StatelessWidget {
const _RocketYellowBackground();
@override
Widget build(BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.vertical(top: Radius.circular(24.w)),
child: Image.asset(
"atu_images/room/at_icon_room_rocket_yellow_bg.png",
fit: BoxFit.cover,
alignment: Alignment.topCenter,
),
);
}
}

View File

@ -6,6 +6,7 @@ import 'package:aslan/chatvibe_core/utilities/at_banner_utils.dart';
import 'package:provider/provider.dart';
import 'package:aslan/chatvibe_ui/components/at_compontent.dart';
import 'package:aslan/chatvibe_managers/app_general_manager.dart';
import 'package:aslan/chatvibe_managers/gift_system_manager.dart';
class RoomBannerView extends StatefulWidget {
@override
@ -55,9 +56,24 @@ class _RoomBannerViewState extends State<RoomBannerView> {
ref.roomBanners.map((item) {
return GestureDetector(
child: netImage(url: item.smallCover ?? ""),
onTap: () {
onTap: () async {
print('ads:${item.toJson()}');
ATBannerUtils.openBanner(item, context);
if (!ATBannerUtils.isWebBanner(item)) {
ATBannerUtils.openBanner(item, context);
return;
}
final giftProvider = Provider.of<GiftProvider>(
context,
listen: false,
);
giftProvider.updateHideLGiftAnimalOnRoomH5Page(true);
try {
await ATBannerUtils.openBanner(item, context);
} finally {
giftProvider.updateHideLGiftAnimalOnRoomH5Page(
false,
);
}
},
);
}).toList(),

View File

@ -1,10 +1,10 @@
import 'package:aslan/chatvibe_ui/widgets/room/redpack/room_redenvelope_list_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:aslan/chatvibe_ui/widgets/room/room_banner_view.dart';
import 'package:aslan/chatvibe_ui/widgets/room/room_task_page.dart';
import 'package:aslan/chatvibe_ui/widgets/room/rocket/room_rocket_yellow_page.dart';
import 'package:provider/provider.dart';
import 'package:aslan/chatvibe_ui/components/at_debounce_widget.dart';
@ -17,8 +17,10 @@ import '../../../chatvibe_managers/audio_manager.dart';
import '../../../chatvibe_managers/rtm_manager.dart';
class RoomPlayWidget extends StatefulWidget {
const RoomPlayWidget({super.key});
@override
_RoomPlayWidgetState createState() => _RoomPlayWidgetState();
State<RoomPlayWidget> createState() => _RoomPlayWidgetState();
}
class _RoomPlayWidgetState extends State<RoomPlayWidget> {
@ -44,46 +46,38 @@ class _RoomPlayWidgetState extends State<RoomPlayWidget> {
Selector<AudioManager, bool>(
selector:
(_, provider) =>
provider.currentMusicMode !=
null,
shouldRebuild:
(prev, next) => prev != next,
provider.currentMusicMode != null,
shouldRebuild: (prev, next) => prev != next,
builder: (context, hasMusicMode, _) {
return RepaintBoundary(
child:
hasMusicMode
? GestureDetector(
child: Container(
margin:
EdgeInsets.symmetric(
vertical: 5.w,
),
child: Image.asset(
"atu_images/room/at_icon_room_music_tag.png",
width: 45.w,
height: 45.w,
),
),
onTap: () {
SmartDialog.show(
tag:
"showRoomMusicControl",
alignment:
Alignment
.center,
debounce: true,
animationType:
SmartAnimationType
.fade,
clickMaskDismiss:
true,
builder: (_) {
return ATRoomMusicControlPage();
},
);
},
)
: Container(),
hasMusicMode
? GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(
vertical: 5.w,
),
child: Image.asset(
"atu_images/room/at_icon_room_music_tag.png",
width: 45.w,
height: 45.w,
),
),
onTap: () {
SmartDialog.show(
tag: "showRoomMusicControl",
alignment: Alignment.center,
debounce: true,
animationType:
SmartAnimationType.fade,
clickMaskDismiss: true,
builder: (_) {
return ATRoomMusicControlPage();
},
);
},
)
: Container(),
);
},
),
@ -144,46 +138,62 @@ class _RoomPlayWidgetState extends State<RoomPlayWidget> {
);
},
),
GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(vertical: 5.w),
child: Image.asset(
"atu_images/room/at_icon_room_rocket_lv1.png",
width: 45.w,
height: 45.w,
fit: BoxFit.contain,
),
),
onTap: () {
SmartDialog.show(
tag: "showRoomRocketYellowPage",
alignment: Alignment.bottomCenter,
maskColor: Colors.transparent,
animationType: SmartAnimationType.fade,
clickMaskDismiss: true,
builder: (_) {
return const RoomRocketYellowPage();
},
);
},
),
Selector<RtcProvider, bool>(
selector:
(_, p) =>
p.redPacketList.isNotEmpty,
shouldRebuild:
(prev, next) => prev != next,
selector: (_, p) => p.redPacketList.isNotEmpty,
shouldRebuild: (prev, next) => prev != next,
builder: (context, hasRedPacket, _) {
return RepaintBoundary(
child:
hasRedPacket
? GestureDetector(
child: Container(
margin:
EdgeInsets.symmetric(
vertical: 5.w,
),
child: Image.asset(
"atu_images/room/at_icon_room_redpack_tag.png",
width: 45.w,
height: 45.w,
),
),
onTap: () {
SmartDialog.show(
tag:
"showRoomRedenvelopeList",
alignment:
Alignment
.center,
animationType:
SmartAnimationType
.fade,
builder: (_) {
return RoomRedenvelopeListPage();
},
);
},
)
: Container(),
hasRedPacket
? GestureDetector(
child: Container(
margin: EdgeInsets.symmetric(
vertical: 5.w,
),
child: Image.asset(
"atu_images/room/at_icon_room_redpack_tag.png",
width: 45.w,
height: 45.w,
),
),
onTap: () {
SmartDialog.show(
tag:
"showRoomRedenvelopeList",
alignment: Alignment.center,
animationType:
SmartAnimationType.fade,
builder: (_) {
return RoomRedenvelopeListPage();
},
);
},
)
: Container(),
);
},
),

View File

@ -23,7 +23,7 @@ class ImagePick {
);
if (pickedFile != null) {
if (!ATPathUtils.fileTypeIsPicAndMp(pickedFile.path)) {
ATTts.show( "Please select atu_images in .jpg, .jpeg, .png format.");
ATTts.show("Please select atu_images in .jpg, .jpeg, .png format.");
return null;
}
return [File(pickedFile.path)];
@ -74,7 +74,7 @@ class ImagePick {
);
if (pickedFile != null) {
if (!ATPathUtils.fileTypeIsPic(pickedFile.path)) {
ATTts.show( "Please select atu_images in .jpg, .jpeg, .png format.");
ATTts.show("Please select atu_images in .jpg, .jpeg, .png format.");
return null;
}
return File(pickedFile.path);
@ -86,6 +86,26 @@ class ImagePick {
}
}
///
static Future<File?> pickVideoFromGallery(BuildContext context) async {
try {
final XFile? pickedFile = await _picker.pickVideo(
source: ImageSource.gallery,
);
if (pickedFile != null) {
if (ATPathUtils.receiveFileType(pickedFile.path) != "video_pic") {
ATTts.show("Please select a video in supported format.");
return null;
}
return File(pickedFile.path);
}
return null;
} catch (e) {
print("视频选择出错: $e");
return null;
}
}
/// 使
static Future<File?> pickFromCamera(BuildContext context) async {
try {

View File

@ -367,6 +367,10 @@ class _MyAppState extends State<MyApp> {
const Locale('ar', ''),
const Locale('tr', ''),
const Locale('bn', ''),
const Locale('id', ''),
const Locale('fil', ''),
const Locale('ur', ''),
const Locale('hi', ''),
],
navigatorKey: navigatorKey,
debugShowCheckedModeBanner: false,

View File

@ -0,0 +1,319 @@
## 16.0.2
* Fix issue that the caret offset is not right after pinyin(composing) is completed on windows desktop(#255)
## 16.0.1
* Fix issue that context menu click didn't work on desktop(#250)
## 16.0.0
* Migrate to Flutter 3.24.0
## 15.0.0
* Migrate to Flutter 3.22.0
## 14.0.0
* Migrate to Flutter 3.19.0
* Fix wrong postion of Magnifier
## 13.0.1
* Update readme about HarmonyOS
## 13.0.0
* Migrate to Flutter 3.16.0 (#229)
* Fix wrong caret position (#224,#226)
## 12.1.0
* Migrate to Flutter 3.13.0
## 12.0.1
* Fix issue that wrong cursor position on macos. (https://github.com/fluttercandies/extended_text_field/issues/210)
## 12.0.0
* Migrate to Flutter 3.10.0
* Refactoring codes and sync codes from 3.10.0
* Breaking change:
Remove [ExtendedText.textSelectionGestureDetectorBuilder],[ExtendedText.shouldShowSelectionHandles]
* Add ExtendedSelectableText
## 11.0.1
* fix issue on ios after flutter version 3.7.0. #191 #198
## 11.0.0
* Migrate to 3.7.0
## 10.2.0
* Add TextInputBindingMixin to prevent system keyboard show.
* Add No SystemKeyboard demo
## 10.1.1
* Fix issue selection not right #172
## 10.1.0
* Migrate to 3.0.0
* Support Scribble Handwriting for iPads
## 10.0.1
* Public ExtendedTextFieldState and add bringIntoView method to support jump to caret when insert text with TextEditingController
## 10.0.0
* Migrate to 2.10.0.
* Add shouldShowSelectionHandles and textSelectionGestureDetectorBuilder call back to define the behavior of handles and toolbar.
* Shortcut support for web and desktop.
## 9.0.3
* Fix hittest is not right #131
## 9.0.2
* Fix selectionWidthStyle and selectionHeightStyle are not working.
## 9.0.1
* Support to use keyboard move cursor for SpecialInlineSpan. #135
* Fix issue that backspace delete two chars. #141
## 9.0.0
* Migrate to 2.8
## 8.0.0
* Add [SpecialTextSpan.mouseCursor], [SpecialTextSpan.onEnter] and [SpecialTextSpan.onExit].
* merge code from 2.2.0
## 7.0.1
* Fix issue that composing is not updated.#122
## 7.0.0
* Breaking change: [SpecialText.getContent] is not include endflag now.(please check if you call getContent and your endflag length is more than 1)
* Fix demo manualDelete error #120
## 6.0.1
* Fix issue that toolbar is not shown when double tap
* Fix throw exception when selectWordAtOffset
## 6.0.0
* Support null-safety
## 5.0.4
* Fix toolbar is not show after some behaviour #107
## 5.0.3
* Fix miss TextStyle for specialTextSpanBuilder #89
## 5.0.2
* Fix wrong position of caret
## 5.0.1
* change handleSpecialText to hasSpecialInlineSpanBase(extended_text_library)
* add hasPlaceholderSpan(extended_text_library)
## 5.0.0
* Merge from Flutter v1.22
* Support cursorHeight, onAppPrivateCommand, restorationId
## 4.0.0
* Merge from Flutter v1.20
* Support Autofill
## 3.0.1
* Fix issue that text is clipped when maxLine is 1 and width is more than maxWidth.(#67,#76)
* Fix issue that handles are not shown when the height of TextStyle is big than 1.0.(#49)
## 3.0.0
* Breaking change: fix typos OverflowWidget.
## 2.0.0
* Breaking change: extended_text_library has changed to support OverFlowWidget ExtendedText
* Fix textSelectionControls is not working.
## 1.0.1
* Fix wrong calculation about selection handles.
## 1.0.0
* Merge code from 1.17.0
* Fix analysis_options
## 0.5.0
* Fix error caret offset on ios.
## 0.4.9
* Fix error about TargetPlatform.macOS
## 0.4.8
* Fix issue that the cursor returns to the top when deleting quickly in Multi-line text
* Fix issue that toolbar will not show if autofocus is true when longpress
## 0.4.7
* Codes base on 1.12.13+hotfix.5
* Set limitation of flutter sdk >=1.12.13 <1.12.16
* Add demo that how to delete text with code
* Fix issue that not showing text while entering text from keyboard
## 0.4.6
* Remove TargetPlatform.macOS
## 0.4.5
* Fix build error for flutter sdk 1.12
## 0.4.4
* Fix wrong caret hegiht and postion
* Make Ios/Android caret the same height
## 0.4.3
* Fix kMinInteractiveSize is missing in high version of flutter
## 0.4.2
* Support custom selection toolbar and handles
* Improve codes about selection overlay
* Select all SpecialTextSpan(which deleteAll is true) when double tap or long tap
* Support WidgetSpan hitTest
## 0.4.1
* Fix issue that type 'ImageSpan' is not a subtype of type 'textSpan'(https://github.com/fluttercandies/extended_text_field/issues/13)
## 0.4.0
* Fix issue tgat WidgetSpan wrong offset(https://github.com/fluttercandies/extended_text_field/issues/11)
* Fix wrong caret offset
## 0.3.9
* Improve codes base on v1.7.8
* Support WidgetSpan (ExtendedWidgetSpan)
## 0.3.7
* Update extended_text_library
## 0.3.4
* Remove un-used codes in extended_text_selection
## 0.3.3
* Update extended_text_library
## 0.3.2
* Update path_provider 1.1.0
## 0.3.0
* Uncomment getFullHeightForCaret method for 1.5.4-hotfix.2
* Corret selection handles visibility for _updateSelectionExtentsVisibility method
## 0.2.8
* Corret selection handles position for image textspan
* StrutStyle strutStyle is obsoleted, it will lead to bugs for image span size.
## 0.2.7
* Fix selection handles blinking
## 0.2.6
* Take care when TextSpan children is null
## 0.2.5
* Update extended_text_library
1.Remove caretIn parameter(SpecialTextSpan)
2.DeleteAll parameter has the same effect as caretIn parameter(SpecialTextSpan)
## 0.2.4
* Fix caret position about image span
* Add caretIn parameter(whether caret can move into special text for SpecialTextSpan(like a image span or @xxxx)) for SpecialTextSpan
## 0.2.3
* Disabled informationCollector to keep backwards compatibility for now (ExtendedNetworkImageProvider)
## 0.2.2
* Fix caret position for last one image span
* Add image text demo
* Fix position for specialTex
## 0.2.1
* Fix caret position for image span
## 0.2.0
* Only iterate textSpan.children to find SpecialTextSpan
## 0.1.9
* Add BackgroundTextSpan, support to paint custom background
## 0.1.8
* Handle TextEditingValue's composing
## 0.1.6
* Improve codes to avoid unnecessary computation
## 0.1.5
* Override compareTo method in SpecialTextSpan and ImageSpan to
Fix issue that image span or special text span was error rendering
## 0.1.4
* Update limitation
* Improve codes
## 0.1.3
* Update limitation
* Improve codes
## 0.1.1
* Support special text amd inline image

View File

@ -0,0 +1 @@
* @zmtzawqlp

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 zmtzawqlp
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,616 @@
# extended_text_field
[![pub package](https://img.shields.io/pub/v/extended_text_field.svg)](https://pub.dartlang.org/packages/extended_text_field) [![GitHub stars](https://img.shields.io/github/stars/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/stargazers) [![GitHub forks](https://img.shields.io/github/forks/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/network) [![GitHub license](https://img.shields.io/github/license/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/blob/master/LICENSE) [![GitHub issues](https://img.shields.io/github/issues/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/issues) <a target="_blank" href="https://jq.qq.com/?_wv=1027&k=5bcc0gy"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="flutter-candies" title="flutter-candies"></a>
文档语言: [English](README.md) | 中文简体
官方输入框的扩展组件,支持图片,@某人,自定义文字背景。也支持自定义菜单和选择器。
[ExtendedTextField 在线 Demo](https://fluttercandies.github.io/extended_text_field/)
ExtendedTextField 是 Flutter 官方 TextField 的三方扩展库,主要扩展功能如下:
| 功能 | ExtendedTextField | TextField |
|-----------------------------------------|---------------------------------------------------------|----------------------------------------------------------|
| 图文混合 | 支持,可以实现图文混合显示 | 仅支持显示文本,但在选择文本时会出现问题 |
| 支持复制真实值 | 支持,可以复制出文本的真实值 | 不支持 |
| 根据文本格式快速构建富文本 | 支持,可以根据文本格式快速构建富文本 | 不支持 |
> 已支持 `HarmonyOS`. 请使用最新的带有 `ohos` 标志的版本. 你可以在 `Versions` 签查找.
```yaml
dependencies:
extended_text_field: 11.0.1-ohos
```
- [extended\_text\_field](#extended_text_field)
- [限制](#限制)
- [特殊文本](#特殊文本)
- [创建特殊文本](#创建特殊文本)
- [特殊文本Builder](#特殊文本builder)
- [图片](#图片)
- [ImageSpan](#imagespan)
- [缓存图片](#缓存图片)
- [文本选择控制器](#文本选择控制器)
- [WidgetSpan](#widgetspan)
- [阻止系统键盘](#阻止系统键盘)
- [TextInputBindingMixin](#textinputbindingmixin)
- [TextInputFocusNode](#textinputfocusnode)
- [CustomKeyboard](#customkeyboard)
- [Buy me a coffee](#buy-me-a-coffee)
## 限制
- 不支持TextDirection.rtl从右向左.
- 不支持obscureText为true.
## 特殊文本
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/extended_text_field.gif)
### 创建特殊文本
extended_text 帮助将字符串文本快速转换为特殊的TextSpan
下面的例子告诉你怎么创建一个@xxx
具体思路是对字符串进行进栈遍历通过判断flag来判定是否是一个特殊字符。
例子:@zmtzawqlp ,以@开头并且以空格结束,我们就认为它是一个@的特殊文本
```dart
class AtText extends SpecialText {
static const String flag = "@";
final int start;
/// whether show background for @somebody
final bool showAtBackground;
AtText(TextStyle textStyle, SpecialTextGestureTapCallback onTap,
{this.showAtBackground: false, this.start})
: super(
flag,
" ",
textStyle,
);
@override
InlineSpan finishText() {
TextStyle textStyle =
this.textStyle?.copyWith(color: Colors.blue, fontSize: 16.0);
final String atText = toString();
return showAtBackground
? BackgroundTextSpan(
background: Paint()..color = Colors.blue.withOpacity(0.15),
text: atText,
actualText: atText,
start: start,
///caret can move into special text
deleteAll: true,
style: textStyle,
recognizer: (TapGestureRecognizer()
..onTap = () {
if (onTap != null) onTap(atText);
}))
: SpecialTextSpan(
text: atText,
actualText: atText,
start: start,
style: textStyle,
recognizer: (TapGestureRecognizer()
..onTap = () {
if (onTap != null) onTap(atText);
}));
}
}
```
### 特殊文本Builder
创建属于你自己规则的Builder上面说了你可以继承SpecialText来定义各种各样的特殊文本。
- build 方法中是通过具体思路是对字符串进行进栈遍历通过判断flag来判定是否是一个特殊文本。
感兴趣的可以看一下SpecialTextSpanBuilder里面build方法的实现当然你也可以写出属于自己的build逻辑
- createSpecialText 通过判断flag来判定是否是一个特殊文本
```dart
class MySpecialTextSpanBuilder extends SpecialTextSpanBuilder {
/// whether show background for @somebody
final bool showAtBackground;
final BuilderType type;
MySpecialTextSpanBuilder(
{this.showAtBackground: false, this.type: BuilderType.extendedText});
@override
TextSpan build(String data, {TextStyle textStyle, onTap}) {
var textSpan = super.build(data, textStyle: textStyle, onTap: onTap);
return textSpan;
}
@override
SpecialText createSpecialText(String flag,
{TextStyle textStyle, SpecialTextGestureTapCallback onTap, int index}) {
if (flag == null || flag == "") return null;
///index is end index of start flag, so text start index should be index-(flag.length-1)
if (isStart(flag, AtText.flag)) {
return AtText(textStyle, onTap,
start: index - (AtText.flag.length - 1),
showAtBackground: showAtBackground,
type: type);
} else if (isStart(flag, EmojiText.flag)) {
return EmojiText(textStyle, start: index - (EmojiText.flag.length - 1));
} else if (isStart(flag, DollarText.flag)) {
return DollarText(textStyle, onTap,
start: index - (DollarText.flag.length - 1), type: type);
}
return null;
}
}
```
其实你也不是一定要用这套代码将字符串转换为TextSpan你可以有自己的方法给最后的TextSpan就可以了。
## 图片
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/extended_text_field_image.gif)
### ImageSpan
使用ImageSpan 展示图片
```dart
ImageSpan(
ImageProvider image, {
Key key,
@required double imageWidth,
@required double imageHeight,
EdgeInsets margin,
int start: 0,
ui.PlaceholderAlignment alignment = ui.PlaceholderAlignment.bottom,
String actualText,
TextBaseline baseline,
TextStyle style,
BoxFit fit: BoxFit.scaleDown,
ImageLoadingBuilder loadingBuilder,
ImageFrameBuilder frameBuilder,
String semanticLabel,
bool excludeFromSemantics = false,
Color color,
BlendMode colorBlendMode,
AlignmentGeometry imageAlignment = Alignment.center,
ImageRepeat repeat = ImageRepeat.noRepeat,
Rect centerSlice,
bool matchTextDirection = false,
bool gaplessPlayback = false,
FilterQuality filterQuality = FilterQuality.low,
})
ImageSpan(AssetImage("xxx.jpg"),
imageWidth: size,
imageHeight: size,
margin: EdgeInsets.only(left: 2.0, bottom: 0.0, right: 2.0));
}
```
| 参数 | 描述 | 默认 |
| ----------- | ----------------------------------------------------------------- | ---------------- |
| image | 图片展示的Provider(ImageProvider) | - |
| imageWidth | 宽度,不包括 margin | 必填 |
| imageHeight | 高度,不包括 margin | 必填 |
| margin | 图片的margin | - |
| actualText | 真实的文本,当你开启文本选择功能的时候,必须设置,比如图片"\[love\] | 空占位符'\uFFFC' |
| start | 在文本字符串中的开始位置,当你开启文本选择功能的时候,必须设置 | 0 |
### 缓存图片
你可以用ExtendedNetworkImageProvider来缓存文本中的图片使用clearDiskCachedImages方法来清掉本地缓存
引入 extended_image_library
```dart
dependencies:
extended_image_library: ^0.1.4
```
```dart
ExtendedNetworkImageProvider(
this.url, {
this.scale = 1.0,
this.headers,
this.cache: false,
this.retries = 3,
this.timeLimit,
this.timeRetry = const Duration(milliseconds: 100),
CancellationToken cancelToken,
}) : assert(url != null),
assert(scale != null),
cancelToken = cancelToken ?? CancellationToken();
```
| 参数 | 描述 | 默认 |
| ----------- | ------------------- | ------------------- |
| url | 网络请求地址 | required |
| scale | ImageInfo中的scale | 1.0 |
| headers | HttpClient的headers | - |
| cache | 是否缓存到本地 | false |
| retries | 请求尝试次数 | 3 |
| timeLimit | 请求超时 | - |
| timeRetry | 请求重试间隔 | milliseconds: 100 |
| cancelToken | 用于取消请求的Token | CancellationToken() |
```dart
/// Clear the disk cache directory then return if it succeed.
/// <param name="duration">timespan to compute whether file has expired or not</param>
Future<bool> clearDiskCachedImages({Duration duration}) async
```
## 文本选择控制器
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/custom_toolbar.gif)
提供了默认的控制器MaterialExtendedTextSelectionControls/CupertinoExtendedTextSelectionControls
通过重写 [ExtendedTextField.extendedContextMenuBuilder] 和 [TextSelectionControls] 来自定义菜单和选择器。
```dart
const double _kHandleSize = 22.0;
/// Android Material styled text selection controls.
class MyTextSelectionControls extends TextSelectionControls
with TextSelectionHandleControls {
static Widget defaultContextMenuBuilder(
BuildContext context, ExtendedEditableTextState editableTextState) {
return AdaptiveTextSelectionToolbar.buttonItems(
buttonItems: <ContextMenuButtonItem>[
...editableTextState.contextMenuButtonItems,
ContextMenuButtonItem(
onPressed: () {
launchUrl(
Uri.parse(
'mailto:zmtzawqlp@live.com?subject=extended_text_share&body=${editableTextState.textEditingValue.text}',
),
);
editableTextState.hideToolbar(true);
editableTextState.textEditingValue
.copyWith(selection: const TextSelection.collapsed(offset: 0));
},
type: ContextMenuButtonType.custom,
label: 'like',
),
],
anchors: editableTextState.contextMenuAnchors,
);
// return AdaptiveTextSelectionToolbar.editableText(
// editableTextState: editableTextState,
// );
}
/// Returns the size of the Material handle.
@override
Size getHandleSize(double textLineHeight) =>
const Size(_kHandleSize, _kHandleSize);
/// Builder for material-style text selection handles.
@override
Widget buildHandle(
BuildContext context, TextSelectionHandleType type, double textLineHeight,
[VoidCallback? onTap, double? startGlyphHeight, double? endGlyphHeight]) {
final Widget handle = SizedBox(
width: _kHandleSize,
height: _kHandleSize,
child: Image.asset(
'assets/40.png',
),
);
// [handle] is a circle, with a rectangle in the top left quadrant of that
// circle (an onion pointing to 10:30). We rotate [handle] to point
// straight up or up-right depending on the handle type.
switch (type) {
case TextSelectionHandleType.left: // points up-right
return Transform.rotate(
angle: math.pi / 4.0,
child: handle,
);
case TextSelectionHandleType.right: // points up-left
return Transform.rotate(
angle: -math.pi / 4.0,
child: handle,
);
case TextSelectionHandleType.collapsed: // points up
return handle;
}
}
/// Gets anchor for material-style text selection handles.
///
/// See [TextSelectionControls.getHandleAnchor].
@override
Offset getHandleAnchor(TextSelectionHandleType type, double textLineHeight,
[double? startGlyphHeight, double? endGlyphHeight]) {
switch (type) {
case TextSelectionHandleType.left:
return const Offset(_kHandleSize, 0);
case TextSelectionHandleType.right:
return Offset.zero;
default:
return const Offset(_kHandleSize / 2, -4);
}
}
@override
bool canSelectAll(TextSelectionDelegate delegate) {
// Android allows SelectAll when selection is not collapsed, unless
// everything has already been selected.
final TextEditingValue value = delegate.textEditingValue;
return delegate.selectAllEnabled &&
value.text.isNotEmpty &&
!(value.selection.start == 0 &&
value.selection.end == value.text.length);
}
}
```
## WidgetSpan
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/widget_span.gif)
ExtendedWidgetSpan 支持选择以及hitTest, 所以你可以在输入框中加入任何的widget。
```dart
class EmailText extends SpecialText {
final TextEditingController controller;
final int start;
final BuildContext context;
EmailText(TextStyle textStyle, SpecialTextGestureTapCallback onTap,
{this.start, this.controller, this.context, String startFlag})
: super(startFlag, " ", textStyle, onTap: onTap);
@override
bool isEnd(String value) {
var index = value.indexOf("@");
var index1 = value.indexOf(".");
return index >= 0 &&
index1 >= 0 &&
index1 > index + 1 &&
super.isEnd(value);
}
@override
InlineSpan finishText() {
final String text = toString();
return ExtendedWidgetSpan(
actualText: text,
start: start,
alignment: ui.PlaceholderAlignment.middle,
child: GestureDetector(
child: Padding(
padding: EdgeInsets.only(right: 5.0, top: 2.0, bottom: 2.0),
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
child: Container(
padding: EdgeInsets.all(5.0),
color: Colors.orange,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
text.trim(),
//style: textStyle?.copyWith(color: Colors.orange),
),
SizedBox(
width: 5.0,
),
InkWell(
child: Icon(
Icons.close,
size: 15.0,
),
onTap: () {
controller.value = controller.value.copyWith(
text: controller.text
.replaceRange(start, start + text.length, ""),
selection: TextSelection.fromPosition(
TextPosition(offset: start)));
},
)
],
),
)),
),
onTap: () {
showDialog(
context: context,
barrierDismissible: true,
builder: (c) {
TextEditingController textEditingController =
TextEditingController()..text = text.trim();
return Column(
children: <Widget>[
Expanded(
child: Container(),
),
Material(
child: Padding(
padding: EdgeInsets.all(10.0),
child: TextField(
controller: textEditingController,
decoration: InputDecoration(
suffixIcon: FlatButton(
child: Text("OK"),
onPressed: () {
controller.value = controller.value.copyWith(
text: controller.text.replaceRange(
start,
start + text.length,
textEditingController.text + " "),
selection: TextSelection.fromPosition(
TextPosition(
offset: start +
(textEditingController.text + " ")
.length)));
Navigator.pop(context);
},
)),
),
)),
Expanded(
child: Container(),
)
],
);
});
},
),
deleteAll: true,
);
}
}
```
## 阻止系统键盘
我们不需要代码侵入到 [ExtendedTextField] 或者 [TextField] 当中, 就可以阻止系统键盘弹出,
### TextInputBindingMixin
我们通过阻止 Flutter Framework 发送 `TextInput.show` 到 Flutter 引擎来阻止系统键盘弹出
你可以直接使用 [TextInputBinding].
``` dart
void main() {
TextInputBinding();
runApp(const MyApp());
}
```
或者你如果有其他的 `binding`,你可以这样。
``` dart
class YourBinding extends WidgetsFlutterBinding with TextInputBindingMixin,YourBindingMixin {
}
void main() {
YourBinding();
runApp(const MyApp());
}
```
或者你需要重载 `ignoreTextInputShow` 方法,你可以这样。
``` dart
class YourBinding extends TextInputBinding {
@override
// ignore: unnecessary_overrides
bool ignoreTextInputShow() {
// you can override it base on your case
// if NoKeyboardFocusNode is not enough
return super.ignoreTextInputShow();
}
}
void main() {
YourBinding();
runApp(const MyApp());
}
```
### TextInputFocusNode
把 [TextInputFocusNode] 传递给 [ExtendedTextField] 或者 [TextField]。
``` dart
final TextInputFocusNode _focusNode = TextInputFocusNode();
@override
Widget build(BuildContext context) {
return ExtendedTextField(
// request keyboard if need
focusNode: _focusNode..debugLabel = 'ExtendedTextField',
);
}
@override
Widget build(BuildContext context) {
return TextField(
// request keyboard if need
focusNode: _focusNode..debugLabel = 'CustomTextField',
);
}
```
我们通过当前的 `FocusNode` 是否是 [TextInputFocusNode],来决定是否阻止系统键盘弹出的。
``` dart
final FocusNode? focus = FocusManager.instance.primaryFocus;
if (focus != null &&
focus is TextInputFocusNode &&
focus.ignoreSystemKeyboardShow) {
return true;
}
```
### CustomKeyboard
你可以通过当前焦点的变化的时候,来显示或者隐藏自定义的键盘。
当你的自定义键盘可以关闭而不让焦点失去,你应该在 [ExtendedTextField] 或者 [TextField]
`onTap` 事件中,再次判断键盘是否显示。
``` dart
@override
void initState() {
super.initState();
_focusNode.addListener(_handleFocusChanged);
}
void _onTextFiledTap() {
if (_bottomSheetController == null) {
_handleFocusChanged();
}
}
void _handleFocusChanged() {
if (_focusNode.hasFocus) {
// just demo, you can define your custom keyboard as you want
_bottomSheetController = showBottomSheet<void>(
context: FocusManager.instance.primaryFocus!.context!,
// set false, if don't want to drag to close custom keyboard
enableDrag: true,
builder: (BuildContext b) {
// your custom keyboard
return Container();
});
// maybe drag close
_bottomSheetController?.closed.whenComplete(() {
_bottomSheetController = null;
});
} else {
_bottomSheetController?.close();
_bottomSheetController = null;
}
}
@override
void dispose() {
_focusNode.removeListener(_handleFocusChanged);
super.dispose();
}
```
查看 [完整的例子](https://github.com/fluttercandies/extended_text_field/tree/master/example/lib/pages/simple/no_keyboard.dart)
## ☕Buy me a coffee
![img](http://zmtzawqlp.gitee.io/my_images/images/qrcode.png)

View File

@ -0,0 +1,605 @@
# extended_text_field
[![pub package](https://img.shields.io/pub/v/extended_text_field.svg)](https://pub.dartlang.org/packages/extended_text_field) [![GitHub stars](https://img.shields.io/github/stars/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/stargazers) [![GitHub forks](https://img.shields.io/github/forks/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/network) [![GitHub license](https://img.shields.io/github/license/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/blob/master/LICENSE) [![GitHub issues](https://img.shields.io/github/issues/fluttercandies/extended_text_field)](https://github.com/fluttercandies/extended_text_field/issues) <a target="_blank" href="https://jq.qq.com/?_wv=1027&k=5bcc0gy"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="flutter-candies" title="flutter-candies"></a>
Language: English | [中文简体](README-ZH.md)
Extended official text field to build special text like inline image, @somebody, custom background etc quickly.It also support to build custom seleciton toolbar and handles.
[Web demo for ExtendedTextField](https://fluttercandies.github.io/extended_text_field/)
ExtendedTextField is a third-party extension library for Flutter's official TextField component. The main extended features are as follows:
| Feature | ExtendedTextField | TextField |
|---------------------------------------|------------------------------------------------------|----------------------------------------------------|
| Inline images and text mixture | Supported, allows displaying inline images and mixed text | Only supports displaying text, but have issues with text selection |
| Copying the actual value | Supported, enables copying the actual value of the text | Not supported |
| Quick construction of rich text | Supported, enables quick construction of rich text based on text format | Not supported |
> `HarmonyOS` is supported. Please use the latest version which contains `ohos` tag. You can check it in `Versions` tab.
```yaml
dependencies:
extended_text_field: 11.0.1-ohos
```
Please note that the translation provided above is based on the information you provided in the original text.
- [extended\_text\_field](#extended_text_field)
- [Limitation](#limitation)
- [Special Text](#special-text)
- [Create Special Text](#create-special-text)
- [SpecialTextSpanBuilder](#specialtextspanbuilder)
- [Image](#image)
- [ImageSpan](#imagespan)
- [Cache Image](#cache-image)
- [TextSelectionControls](#textselectioncontrols)
- [WidgetSpan](#widgetspan)
- [NoSystemKeyboard](#nosystemkeyboard)
- [TextInputBindingMixin](#textinputbindingmixin)
- [TextInputFocusNode](#textinputfocusnode)
## Limitation
- Not support: it won't handle special text when TextDirection.rtl.
Image position calculated by TextPainter is strange.
- Not support:it won't handle special text when obscureText is true.
## Special Text
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/extended_text_field.gif)
### Create Special Text
extended text helps to convert your text to special textSpan quickly.
for example, follwing code show how to create @xxxx special textSpan.
```dart
class AtText extends SpecialText {
static const String flag = "@";
final int start;
/// whether show background for @somebody
final bool showAtBackground;
AtText(TextStyle textStyle, SpecialTextGestureTapCallback onTap,
{this.showAtBackground: false, this.start})
: super(
flag,
" ",
textStyle,
);
@override
InlineSpan finishText() {
TextStyle textStyle =
this.textStyle?.copyWith(color: Colors.blue, fontSize: 16.0);
final String atText = toString();
return showAtBackground
? BackgroundTextSpan(
background: Paint()..color = Colors.blue.withOpacity(0.15),
text: atText,
actualText: atText,
start: start,
///caret can move into special text
deleteAll: true,
style: textStyle,
recognizer: (TapGestureRecognizer()
..onTap = () {
if (onTap != null) onTap(atText);
}))
: SpecialTextSpan(
text: atText,
actualText: atText,
start: start,
style: textStyle,
recognizer: (TapGestureRecognizer()
..onTap = () {
if (onTap != null) onTap(atText);
}));
}
}
```
### SpecialTextSpanBuilder
create your SpecialTextSpanBuilder
```dart
class MySpecialTextSpanBuilder extends SpecialTextSpanBuilder {
/// whether show background for @somebody
final bool showAtBackground;
final BuilderType type;
MySpecialTextSpanBuilder(
{this.showAtBackground: false, this.type: BuilderType.extendedText});
@override
TextSpan build(String data, {TextStyle textStyle, onTap}) {
var textSpan = super.build(data, textStyle: textStyle, onTap: onTap);
return textSpan;
}
@override
SpecialText createSpecialText(String flag,
{TextStyle textStyle, SpecialTextGestureTapCallback onTap, int index}) {
if (flag == null || flag == "") return null;
///index is end index of start flag, so text start index should be index-(flag.length-1)
if (isStart(flag, AtText.flag)) {
return AtText(textStyle, onTap,
start: index - (AtText.flag.length - 1),
showAtBackground: showAtBackground,
type: type);
} else if (isStart(flag, EmojiText.flag)) {
return EmojiText(textStyle, start: index - (EmojiText.flag.length - 1));
} else if (isStart(flag, DollarText.flag)) {
return DollarText(textStyle, onTap,
start: index - (DollarText.flag.length - 1), type: type);
}
return null;
}
}
```
## Image
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/extended_text_field_image.gif)
### ImageSpan
show inline image by using ImageSpan.
```dart
ImageSpan(
ImageProvider image, {
Key key,
@required double imageWidth,
@required double imageHeight,
EdgeInsets margin,
int start: 0,
ui.PlaceholderAlignment alignment = ui.PlaceholderAlignment.bottom,
String actualText,
TextBaseline baseline,
TextStyle style,
BoxFit fit: BoxFit.scaleDown,
ImageLoadingBuilder loadingBuilder,
ImageFrameBuilder frameBuilder,
String semanticLabel,
bool excludeFromSemantics = false,
Color color,
BlendMode colorBlendMode,
AlignmentGeometry imageAlignment = Alignment.center,
ImageRepeat repeat = ImageRepeat.noRepeat,
Rect centerSlice,
bool matchTextDirection = false,
bool gaplessPlayback = false,
FilterQuality filterQuality = FilterQuality.low,
})
ImageSpan(AssetImage("xxx.jpg"),
imageWidth: size,
imageHeight: size,
margin: EdgeInsets.only(left: 2.0, bottom: 0.0, right: 2.0));
}
```
| parameter | description | default |
| ----------- | ----------------------------------------------------------------------------- | -------- |
| image | The image to display(ImageProvider). | - |
| imageWidth | The width of image(not include margin) | required |
| imageHeight | The height of image(not include margin) | required |
| margin | The margin of image | - |
| actualText | Actual text, take care of it when enable selection,something likes "\[love\]" | '\uFFFC' |
| start | Start index of text,take care of it when enable selection. | 0 |
### Cache Image
if you want cache the network image, you can use ExtendedNetworkImageProvider and clear them with clearDiskCachedImages
import extended_image_library
```dart
dependencies:
extended_image_library: ^0.1.4
```
```dart
ExtendedNetworkImageProvider(
this.url, {
this.scale = 1.0,
this.headers,
this.cache: false,
this.retries = 3,
this.timeLimit,
this.timeRetry = const Duration(milliseconds: 100),
CancellationToken cancelToken,
}) : assert(url != null),
assert(scale != null),
cancelToken = cancelToken ?? CancellationToken();
```
| parameter | description | default |
| ----------- | ------------------------------------------------------------------------------------- | ------------------- |
| url | The URL from which the image will be fetched. | required |
| scale | The scale to place in the [ImageInfo] object of the image. | 1.0 |
| headers | The HTTP headers that will be used with [HttpClient.get] to fetch image from network. | - |
| cache | whether cache image to local | false |
| retries | the time to retry to request | 3 |
| timeLimit | time limit to request image | - |
| timeRetry | the time duration to retry to request | milliseconds: 100 |
| cancelToken | token to cancel network request | CancellationToken() |
```dart
/// Clear the disk cache directory then return if it succeed.
/// <param name="duration">timespan to compute whether file has expired or not</param>
Future<bool> clearDiskCachedImages({Duration duration}) async
```
## TextSelectionControls
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/custom_toolbar.gif)
override [ExtendedTextField.extendedContextMenuBuilder] and [TextSelectionControls] to custom your toolbar widget or handle widget
```dart
const double _kHandleSize = 22.0;
/// Android Material styled text selection controls.
class MyTextSelectionControls extends TextSelectionControls
with TextSelectionHandleControls {
static Widget defaultContextMenuBuilder(
BuildContext context, ExtendedEditableTextState editableTextState) {
return AdaptiveTextSelectionToolbar.buttonItems(
buttonItems: <ContextMenuButtonItem>[
...editableTextState.contextMenuButtonItems,
ContextMenuButtonItem(
onPressed: () {
launchUrl(
Uri.parse(
'mailto:zmtzawqlp@live.com?subject=extended_text_share&body=${editableTextState.textEditingValue.text}',
),
);
editableTextState.hideToolbar(true);
editableTextState.textEditingValue
.copyWith(selection: const TextSelection.collapsed(offset: 0));
},
type: ContextMenuButtonType.custom,
label: 'like',
),
],
anchors: editableTextState.contextMenuAnchors,
);
// return AdaptiveTextSelectionToolbar.editableText(
// editableTextState: editableTextState,
// );
}
/// Returns the size of the Material handle.
@override
Size getHandleSize(double textLineHeight) =>
const Size(_kHandleSize, _kHandleSize);
/// Builder for material-style text selection handles.
@override
Widget buildHandle(
BuildContext context, TextSelectionHandleType type, double textLineHeight,
[VoidCallback? onTap, double? startGlyphHeight, double? endGlyphHeight]) {
final Widget handle = SizedBox(
width: _kHandleSize,
height: _kHandleSize,
child: Image.asset(
'assets/40.png',
),
);
// [handle] is a circle, with a rectangle in the top left quadrant of that
// circle (an onion pointing to 10:30). We rotate [handle] to point
// straight up or up-right depending on the handle type.
switch (type) {
case TextSelectionHandleType.left: // points up-right
return Transform.rotate(
angle: math.pi / 4.0,
child: handle,
);
case TextSelectionHandleType.right: // points up-left
return Transform.rotate(
angle: -math.pi / 4.0,
child: handle,
);
case TextSelectionHandleType.collapsed: // points up
return handle;
}
}
/// Gets anchor for material-style text selection handles.
///
/// See [TextSelectionControls.getHandleAnchor].
@override
Offset getHandleAnchor(TextSelectionHandleType type, double textLineHeight,
[double? startGlyphHeight, double? endGlyphHeight]) {
switch (type) {
case TextSelectionHandleType.left:
return const Offset(_kHandleSize, 0);
case TextSelectionHandleType.right:
return Offset.zero;
default:
return const Offset(_kHandleSize / 2, -4);
}
}
@override
bool canSelectAll(TextSelectionDelegate delegate) {
// Android allows SelectAll when selection is not collapsed, unless
// everything has already been selected.
final TextEditingValue value = delegate.textEditingValue;
return delegate.selectAllEnabled &&
value.text.isNotEmpty &&
!(value.selection.start == 0 &&
value.selection.end == value.text.length);
}
}
```
## WidgetSpan
![](https://github.com/fluttercandies/Flutter_Candies/blob/master/gif/extended_text_field/widget_span.gif)
support to select and hitTest ExtendedWidgetSpan, you can create any widget in ExtendedTextField.
```dart
class EmailText extends SpecialText {
final TextEditingController controller;
final int start;
final BuildContext context;
EmailText(TextStyle textStyle, SpecialTextGestureTapCallback onTap,
{this.start, this.controller, this.context, String startFlag})
: super(startFlag, " ", textStyle, onTap: onTap);
@override
bool isEnd(String value) {
var index = value.indexOf("@");
var index1 = value.indexOf(".");
return index >= 0 &&
index1 >= 0 &&
index1 > index + 1 &&
super.isEnd(value);
}
@override
InlineSpan finishText() {
final String text = toString();
return ExtendedWidgetSpan(
actualText: text,
start: start,
alignment: ui.PlaceholderAlignment.middle,
child: GestureDetector(
child: Padding(
padding: EdgeInsets.only(right: 5.0, top: 2.0, bottom: 2.0),
child: ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(5.0)),
child: Container(
padding: EdgeInsets.all(5.0),
color: Colors.orange,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
text.trim(),
//style: textStyle?.copyWith(color: Colors.orange),
),
SizedBox(
width: 5.0,
),
InkWell(
child: Icon(
Icons.close,
size: 15.0,
),
onTap: () {
controller.value = controller.value.copyWith(
text: controller.text
.replaceRange(start, start + text.length, ""),
selection: TextSelection.fromPosition(
TextPosition(offset: start)));
},
)
],
),
)),
),
onTap: () {
showDialog(
context: context,
barrierDismissible: true,
builder: (c) {
TextEditingController textEditingController =
TextEditingController()..text = text.trim();
return Column(
children: <Widget>[
Expanded(
child: Container(),
),
Material(
child: Padding(
padding: EdgeInsets.all(10.0),
child: TextField(
controller: textEditingController,
decoration: InputDecoration(
suffixIcon: FlatButton(
child: Text("OK"),
onPressed: () {
controller.value = controller.value.copyWith(
text: controller.text.replaceRange(
start,
start + text.length,
textEditingController.text + " "),
selection: TextSelection.fromPosition(
TextPosition(
offset: start +
(textEditingController.text + " ")
.length)));
Navigator.pop(context);
},
)),
),
)),
Expanded(
child: Container(),
)
],
);
});
},
),
deleteAll: true,
);
}
}
```
## NoSystemKeyboard
support to prevent system keyboard show without any code intrusion for [ExtendedTextField] or [TextField].
### TextInputBindingMixin
we prevent system keyboard show by stop Flutter Framework send `TextInput.show` message to Flutter Engine.
you can use [TextInputBinding] directly.
``` dart
void main() {
TextInputBinding();
runApp(const MyApp());
}
```
or if you have other `binding` you can do as following.
``` dart
class YourBinding extends WidgetsFlutterBinding with TextInputBindingMixin,YourBindingMixin {
}
void main() {
YourBinding();
runApp(const MyApp());
}
```
or you need to override `ignoreTextInputShow`, you can do as following.
``` dart
class YourBinding extends TextInputBinding {
@override
// ignore: unnecessary_overrides
bool ignoreTextInputShow() {
// you can override it base on your case
// if NoKeyboardFocusNode is not enough
return super.ignoreTextInputShow();
}
}
void main() {
YourBinding();
runApp(const MyApp());
}
```
### TextInputFocusNode
you should pass the [TextInputFocusNode] into [ExtendedTextField] or [TextField].
``` dart
final TextInputFocusNode _focusNode = TextInputFocusNode();
@override
Widget build(BuildContext context) {
return ExtendedTextField(
// request keyboard if need
focusNode: _focusNode..debugLabel = 'ExtendedTextField',
);
}
@override
Widget build(BuildContext context) {
return TextField(
// request keyboard if need
focusNode: _focusNode..debugLabel = 'CustomTextField',
);
}
```
we prevent system keyboard show base on current focus is [TextInputFocusNode] and `ignoreSystemKeyboardShow` is true。
``` dart
final FocusNode? focus = FocusManager.instance.primaryFocus;
if (focus != null &&
focus is TextInputFocusNode &&
focus.ignoreSystemKeyboardShow) {
return true;
}
### CustomKeyboard
show/hide your custom keyboard on [TextInputFocusNode] focus is changed.
if your custom keyboard can be close without unFocus, you need also handle
show custom keyboard when [ExtendedTextField] or [TextField] `onTap`.
``` dart
@override
void initState() {
super.initState();
_focusNode.addListener(_handleFocusChanged);
}
void _onTextFiledTap() {
if (_bottomSheetController == null) {
_handleFocusChanged();
}
}
void _handleFocusChanged() {
if (_focusNode.hasFocus) {
// just demo, you can define your custom keyboard as you want
_bottomSheetController = showBottomSheet<void>(
context: FocusManager.instance.primaryFocus!.context!,
// set false, if don't want to drag to close custom keyboard
enableDrag: true,
builder: (BuildContext b) {
// your custom keyboard
return Container();
});
// maybe drag close
_bottomSheetController?.closed.whenComplete(() {
_bottomSheetController = null;
});
} else {
_bottomSheetController?.close();
_bottomSheetController = null;
}
}
@override
void dispose() {
_focusNode.removeListener(_handleFocusChanged);
super.dispose();
}
```
see [Full Demo](https://github.com/fluttercandies/extended_text_field/tree/master/example/lib/pages/simple/no_keyboard.dart)

View File

@ -0,0 +1,203 @@
# Specify analysis options.
#
# Until there are meta linter rules, each desired lint must be explicitly enabled.
# See: https://github.com/dart-lang/linter/issues/288
#
# For a list of lints, see: http://dart-lang.github.io/linter/lints/
# See the configuration guide for more
# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
#
# There are other similar analysis options files in the flutter repos,
# which should be kept in sync with this file:
#
# - analysis_options.yaml (this file)
# - packages/flutter/lib/analysis_options_user.yaml
# - https://github.com/flutter/plugins/blob/master/analysis_options.yaml
# - https://github.com/flutter/engine/blob/master/analysis_options.yaml
#
# This file contains the analysis options used by Flutter tools, such as IntelliJ,
# Android Studio, and the `flutter analyze` command.
analyzer:
errors:
# treat missing required parameters as a warning (not a hint)
missing_required_param: warning
# treat missing returns as a warning (not a hint)
missing_return: warning
# allow having TODOs in the code
todo: ignore
# Ignore analyzer hints for updating pubspecs when using Future or
# Stream and not importing dart:async
# Please see https://github.com/flutter/flutter/pull/24528 for details.
# sdk_version_async_exported_from_core: ignore
# exclude:
# - "bin/cache/**"
# # the following two are relative to the stocks example and the flutter package respectively
# # see https://github.com/dart-lang/sdk/issues/28463
# - "lib/i18n/messages_*.dart"
# - "lib/src/http/**"
linter:
rules:
# these rules are documented on and in the same order as
# the Dart Lint rules page to make maintenance easier
# https://github.com/dart-lang/linter/blob/master/example/all.yaml
- always_declare_return_types
- always_put_control_body_on_new_line
# - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
# - always_require_non_null_named_parameters
- always_specify_types
- annotate_overrides
# - avoid_annotating_with_dynamic # conflicts with always_specify_types
# - avoid_as # required for implicit-casts: true
- avoid_bool_literals_in_conditional_expressions
# - avoid_catches_without_on_clauses # we do this commonly
# - avoid_catching_errors # we do this commonly
- avoid_classes_with_only_static_members
# - avoid_double_and_int_checks # only useful when targeting JS runtime
- avoid_empty_else
# - avoid_equals_and_hash_code_on_mutable_classes # not yet tested
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
# - avoid_implementing_value_types # not yet tested
- avoid_init_to_null
# - avoid_js_rounded_ints # only useful when targeting JS runtime
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters # not yet tested
# - avoid_print # not yet tested
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
# - avoid_redundant_argument_values # not yet tested
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
# - avoid_returning_null # there are plenty of valid reasons to return null
# - avoid_returning_null_for_future # not yet tested
- avoid_returning_null_for_void
# - avoid_returning_this # there are plenty of valid reasons to return this
# - avoid_setters_without_getters # not yet tested
# - avoid_shadowing_type_parameters # not yet tested
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_types_as_parameter_names
# - avoid_types_on_closure_parameters # conflicts with always_specify_types
# - avoid_unnecessary_containers # not yet tested
- avoid_unused_constructor_parameters
- avoid_void_async
# - avoid_web_libraries_in_flutter # not yet tested
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
# - cascade_invocations # not yet tested
# - close_sinks # not reliable enough
# - comment_references # blocked on https://github.com/flutter/flutter/issues/20765
# - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
- control_flow_in_finally
# - curly_braces_in_flow_control_structures # not yet tested
# - diagnostic_describe_all_properties # not yet tested
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
# - file_names # not yet tested
- flutter_style_todos
- hash_and_equals
- implementation_imports
# - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
# - iterable_contains_unrelated_type
# - join_return_with_assignment # not yet tested
- library_names
- library_prefixes
# - lines_longer_than_80_chars # not yet tested
# - list_remove_unrelated_type
# - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
# - missing_whitespace_between_adjacent_strings # not yet tested
- no_adjacent_strings_in_list
- no_duplicate_case_values
# - no_logic_in_create_state # not yet tested
# - no_runtimeType_toString # not yet tested
- non_constant_identifier_names
# - null_closures # not yet tested
# - omit_local_variable_types # opposite of always_specify_types
# - one_member_abstracts # too many false positives
# - only_throw_errors # https://github.com/flutter/flutter/issues/5792
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments # we do this commonly
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
# - prefer_asserts_with_message # not yet tested
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
# - prefer_constructors_over_static_methods # not yet tested
- prefer_contains
# - prefer_double_quotes # opposite of prefer_single_quotes
# - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
# - prefer_function_declarations_over_variables # not yet tested
- prefer_generic_function_type_aliases
- prefer_if_elements_to_conditional_expressions
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
# - prefer_int_literals # not yet tested
# - prefer_interpolation_to_compose_strings # not yet tested
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
# - prefer_mixin # https://github.com/dart-lang/language/issues/32
# - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932
# - prefer_relative_imports # not yet tested
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
# - provide_deprecation_message # not yet tested
# - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
- recursive_getters
- slash_for_doc_comments
# - sort_child_properties_last # not yet tested
- sort_constructors_first
# - sort_pub_dependencies
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
# - type_annotate_public_apis # subset of always_specify_types
- type_init_formals
# - unawaited_futures # too many false positives
# - unnecessary_await_in_return # not yet tested
- unnecessary_brace_in_string_interps
- unnecessary_const
# - unnecessary_final # conflicts with prefer_final_locals
- unnecessary_getters_setters
# - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_string_interpolations
- unnecessary_this
- unrelated_type_equality_checks
# - unsafe_html # not yet tested
- use_full_hex_values_for_flutter_colors
# - use_function_type_syntax_for_parameters # not yet tested
# - use_key_in_widget_constructors # not yet tested
- use_rethrow_when_possible
# - use_setters_to_change_properties # not yet tested
# - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
# - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
- valid_regexps
- void_checks

View File

@ -0,0 +1,16 @@
# example
A new Flutter application.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

View File

@ -0,0 +1,203 @@
# Specify analysis options.
#
# Until there are meta linter rules, each desired lint must be explicitly enabled.
# See: https://github.com/dart-lang/linter/issues/288
#
# For a list of lints, see: http://dart-lang.github.io/linter/lints/
# See the configuration guide for more
# https://github.com/dart-lang/sdk/tree/master/pkg/analyzer#configuring-the-analyzer
#
# There are other similar analysis options files in the flutter repos,
# which should be kept in sync with this file:
#
# - analysis_options.yaml (this file)
# - packages/flutter/lib/analysis_options_user.yaml
# - https://github.com/flutter/plugins/blob/master/analysis_options.yaml
# - https://github.com/flutter/engine/blob/master/analysis_options.yaml
#
# This file contains the analysis options used by Flutter tools, such as IntelliJ,
# Android Studio, and the `flutter analyze` command.
analyzer:
errors:
# treat missing required parameters as a warning (not a hint)
missing_required_param: warning
# treat missing returns as a warning (not a hint)
missing_return: warning
# allow having TODOs in the code
todo: ignore
# Ignore analyzer hints for updating pubspecs when using Future or
# Stream and not importing dart:async
# Please see https://github.com/flutter/flutter/pull/24528 for details.
# sdk_version_async_exported_from_core: ignore
# exclude:
# - "bin/cache/**"
# # the following two are relative to the stocks example and the flutter package respectively
# # see https://github.com/dart-lang/sdk/issues/28463
# - "lib/i18n/messages_*.dart"
# - "lib/src/http/**"
linter:
rules:
# these rules are documented on and in the same order as
# the Dart Lint rules page to make maintenance easier
# https://github.com/dart-lang/linter/blob/master/example/all.yaml
- always_declare_return_types
- always_put_control_body_on_new_line
# - always_put_required_named_parameters_first # we prefer having parameters in the same order as fields https://github.com/flutter/flutter/issues/10219
# - always_require_non_null_named_parameters
- always_specify_types
- annotate_overrides
# - avoid_annotating_with_dynamic # conflicts with always_specify_types
# - avoid_as # required for implicit-casts: true
- avoid_bool_literals_in_conditional_expressions
# - avoid_catches_without_on_clauses # we do this commonly
# - avoid_catching_errors # we do this commonly
- avoid_classes_with_only_static_members
# - avoid_double_and_int_checks # only useful when targeting JS runtime
- avoid_empty_else
# - avoid_equals_and_hash_code_on_mutable_classes # not yet tested
- avoid_field_initializers_in_const_classes
- avoid_function_literals_in_foreach_calls
# - avoid_implementing_value_types # not yet tested
- avoid_init_to_null
# - avoid_js_rounded_ints # only useful when targeting JS runtime
- avoid_null_checks_in_equality_operators
# - avoid_positional_boolean_parameters # not yet tested
# - avoid_print # not yet tested
# - avoid_private_typedef_functions # we prefer having typedef (discussion in https://github.com/flutter/flutter/pull/16356)
# - avoid_redundant_argument_values # not yet tested
- avoid_relative_lib_imports
- avoid_renaming_method_parameters
- avoid_return_types_on_setters
# - avoid_returning_null # there are plenty of valid reasons to return null
# - avoid_returning_null_for_future # not yet tested
- avoid_returning_null_for_void
# - avoid_returning_this # there are plenty of valid reasons to return this
# - avoid_setters_without_getters # not yet tested
# - avoid_shadowing_type_parameters # not yet tested
- avoid_single_cascade_in_expression_statements
- avoid_slow_async_io
- avoid_types_as_parameter_names
# - avoid_types_on_closure_parameters # conflicts with always_specify_types
# - avoid_unnecessary_containers # not yet tested
- avoid_unused_constructor_parameters
- avoid_void_async
# - avoid_web_libraries_in_flutter # not yet tested
- await_only_futures
- camel_case_extensions
- camel_case_types
- cancel_subscriptions
# - cascade_invocations # not yet tested
# - close_sinks # not reliable enough
# - comment_references # blocked on https://github.com/flutter/flutter/issues/20765
# - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204
- control_flow_in_finally
# - curly_braces_in_flow_control_structures # not yet tested
# - diagnostic_describe_all_properties # not yet tested
- directives_ordering
- empty_catches
- empty_constructor_bodies
- empty_statements
# - file_names # not yet tested
- flutter_style_todos
- hash_and_equals
- implementation_imports
# - invariant_booleans # too many false positives: https://github.com/dart-lang/linter/issues/811
# - iterable_contains_unrelated_type
# - join_return_with_assignment # not yet tested
- library_names
- library_prefixes
# - lines_longer_than_80_chars # not yet tested
# - list_remove_unrelated_type
# - literal_only_boolean_expressions # too many false positives: https://github.com/dart-lang/sdk/issues/34181
# - missing_whitespace_between_adjacent_strings # not yet tested
- no_adjacent_strings_in_list
- no_duplicate_case_values
# - no_logic_in_create_state # not yet tested
# - no_runtimeType_toString # not yet tested
- non_constant_identifier_names
# - null_closures # not yet tested
# - omit_local_variable_types # opposite of always_specify_types
# - one_member_abstracts # too many false positives
# - only_throw_errors # https://github.com/flutter/flutter/issues/5792
- overridden_fields
- package_api_docs
- package_names
- package_prefixed_library_names
# - parameter_assignments # we do this commonly
- prefer_adjacent_string_concatenation
- prefer_asserts_in_initializer_lists
# - prefer_asserts_with_message # not yet tested
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_const_constructors
- prefer_const_constructors_in_immutables
- prefer_const_declarations
- prefer_const_literals_to_create_immutables
# - prefer_constructors_over_static_methods # not yet tested
- prefer_contains
# - prefer_double_quotes # opposite of prefer_single_quotes
# - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods
- prefer_final_fields
- prefer_final_in_for_each
- prefer_final_locals
- prefer_for_elements_to_map_fromIterable
- prefer_foreach
# - prefer_function_declarations_over_variables # not yet tested
- prefer_generic_function_type_aliases
- prefer_if_elements_to_conditional_expressions
- prefer_if_null_operators
- prefer_initializing_formals
- prefer_inlined_adds
# - prefer_int_literals # not yet tested
# - prefer_interpolation_to_compose_strings # not yet tested
- prefer_is_empty
- prefer_is_not_empty
- prefer_is_not_operator
- prefer_iterable_whereType
# - prefer_mixin # https://github.com/dart-lang/language/issues/32
# - prefer_null_aware_operators # disable until NNBD, see https://github.com/flutter/flutter/pull/32711#issuecomment-492930932
# - prefer_relative_imports # not yet tested
- prefer_single_quotes
- prefer_spread_collections
- prefer_typing_uninitialized_variables
- prefer_void_to_null
# - provide_deprecation_message # not yet tested
# - public_member_api_docs # enabled on a case-by-case basis; see e.g. packages/analysis_options.yaml
- recursive_getters
- slash_for_doc_comments
#- sort_child_properties_last # not yet tested
- sort_constructors_first
#- sort_pub_dependencies
- sort_unnamed_constructors_first
- test_types_in_equals
- throw_in_finally
# - type_annotate_public_apis # subset of always_specify_types
- type_init_formals
# - unawaited_futures # too many false positives
# - unnecessary_await_in_return # not yet tested
- unnecessary_brace_in_string_interps
- unnecessary_const
# - unnecessary_final # conflicts with prefer_final_locals
- unnecessary_getters_setters
# - unnecessary_lambdas # has false positives: https://github.com/dart-lang/linter/issues/498
- unnecessary_new
- unnecessary_null_aware_assignments
- unnecessary_null_in_if_null_operators
- unnecessary_overrides
- unnecessary_parenthesis
- unnecessary_statements
- unnecessary_string_interpolations
- unnecessary_this
- unrelated_type_equality_checks
# - unsafe_html # not yet tested
- use_full_hex_values_for_flutter_colors
# - use_function_type_syntax_for_parameters # not yet tested
# - use_key_in_widget_constructors # not yet tested
- use_rethrow_when_possible
# - use_setters_to_change_properties # not yet tested
# - use_string_buffers # has false positives: https://github.com/dart-lang/sdk/issues/34182
# - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review
- valid_regexps
- void_checks

View File

@ -0,0 +1,67 @@
plugins {
id "com.android.application"
id "kotlin-android"
id "dev.flutter.flutter-gradle-plugin"
}
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
android {
namespace "com.example.example"
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.example"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {}

View File

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@ -0,0 +1,33 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:label="example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>

View File

@ -0,0 +1,6 @@
package com.example.example
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>

View File

@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View File

@ -0,0 +1,30 @@
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}

View File

@ -0,0 +1,3 @@
org.gradle.jvmargs=-Xmx4G
android.useAndroidX=true
android.enableJetifier=true

View File

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

View File

@ -0,0 +1,29 @@
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}
settings.ext.flutterSdkPath = flutterSdkPath()
includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
plugins {
id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "7.3.0" apply false
}
include ":app"

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Some files were not shown because too many files have changed in this diff Show More