mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-12 05:07:46 +02:00
refactor: common submodule
- organize import - remove unused xml
This commit is contained in:
@ -7,17 +7,8 @@ android {
|
||||
namespace = rootProject.ext["applicationId"].toString() + ".core"
|
||||
compileSdk = 34
|
||||
|
||||
buildFeatures {
|
||||
aidl = true
|
||||
buildConfig = true
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
minSdk = 28
|
||||
buildConfigField("String", "VERSION_NAME", "\"${rootProject.ext["appVersionName"]}\"")
|
||||
buildConfigField("int", "VERSION_CODE", "${rootProject.ext["appVersionCode"]}")
|
||||
buildConfigField("String", "APPLICATION_ID", "\"${rootProject.ext["applicationId"]}\"")
|
||||
buildConfigField("int", "BUILD_DATE", "${System.currentTimeMillis() / 1000}")
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
@ -25,13 +16,6 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("getVersion") {
|
||||
doLast {
|
||||
val versionFile = File("app/build/version.txt")
|
||||
versionFile.writeText(rootProject.ext["appVersionName"].toString())
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(files("libs/LSPosed-api-1.0-SNAPSHOT.jar"))
|
||||
implementation(libs.coroutines)
|
||||
@ -41,6 +25,7 @@ dependencies {
|
||||
implementation(libs.androidx.documentfile)
|
||||
implementation(libs.rhino)
|
||||
|
||||
implementation(project(":common"))
|
||||
implementation(project(":stub"))
|
||||
implementation(project(":mapper"))
|
||||
implementation(project(":native"))
|
||||
|
@ -1,88 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge;
|
||||
|
||||
import java.util.List;
|
||||
import me.rhunk.snapenhance.bridge.DownloadCallback;
|
||||
import me.rhunk.snapenhance.bridge.SyncCallback;
|
||||
import me.rhunk.snapenhance.bridge.scripting.IScripting;
|
||||
import me.rhunk.snapenhance.bridge.e2ee.E2eeInterface;
|
||||
import me.rhunk.snapenhance.bridge.MessageLoggerInterface;
|
||||
import me.rhunk.snapenhance.bridge.ConfigStateListener;
|
||||
|
||||
interface BridgeInterface {
|
||||
/**
|
||||
* broadcast a log message
|
||||
*/
|
||||
void broadcastLog(String tag, String level, String message);
|
||||
|
||||
/**
|
||||
* Execute a file operation
|
||||
* @param fileType the corresponding file type (see BridgeFileType)
|
||||
*/
|
||||
byte[] fileOperation(int action, int fileType, in @nullable byte[] content);
|
||||
|
||||
/**
|
||||
* Get the application APK path (assets for the conversation exporter)
|
||||
*/
|
||||
String getApplicationApkPath();
|
||||
|
||||
/**
|
||||
* Fetch the locales
|
||||
*
|
||||
* @return the map of locales (key: locale short name, value: locale data as json)
|
||||
*/
|
||||
Map<String, String> fetchLocales(String userLocale);
|
||||
|
||||
/**
|
||||
* Enqueue a download
|
||||
*/
|
||||
void enqueueDownload(in Intent intent, DownloadCallback callback);
|
||||
|
||||
/**
|
||||
* Get rules for a given user or conversation
|
||||
* @return list of rules (MessagingRuleType)
|
||||
*/
|
||||
List<String> getRules(String uuid);
|
||||
|
||||
/**
|
||||
* Get all ids for a specific rule
|
||||
* @param type rule type (MessagingRuleType)
|
||||
* @return list of ids
|
||||
*/
|
||||
List<String> getRuleIds(String type);
|
||||
|
||||
/**
|
||||
* Update rule for a giver user or conversation
|
||||
*
|
||||
* @param type rule type (MessagingRuleType)
|
||||
*/
|
||||
void setRule(String uuid, String type, boolean state);
|
||||
|
||||
/**
|
||||
* Sync groups and friends
|
||||
*/
|
||||
oneway void sync(SyncCallback callback);
|
||||
|
||||
/**
|
||||
* Trigger sync for an id
|
||||
*/
|
||||
void triggerSync(String scope, String id);
|
||||
|
||||
/**
|
||||
* Pass all groups and friends to be able to add them to the database
|
||||
* @param groups list of groups (MessagingGroupInfo as json string)
|
||||
* @param friends list of friends (MessagingFriendInfo as json string)
|
||||
*/
|
||||
oneway void passGroupsAndFriends(in List<String> groups, in List<String> friends);
|
||||
|
||||
IScripting getScriptingInterface();
|
||||
|
||||
E2eeInterface getE2eeInterface();
|
||||
|
||||
MessageLoggerInterface getMessageLogger();
|
||||
|
||||
void openSettingsOverlay();
|
||||
|
||||
void closeSettingsOverlay();
|
||||
|
||||
void registerConfigStateListener(in ConfigStateListener listener);
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge;
|
||||
|
||||
oneway interface ConfigStateListener {
|
||||
void onConfigChanged();
|
||||
void onRestartRequired();
|
||||
void onCleanCacheRequired();
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge;
|
||||
|
||||
oneway interface DownloadCallback {
|
||||
void onSuccess(String outputPath);
|
||||
void onProgress(String message);
|
||||
void onFailure(String message, @nullable String throwable);
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge;
|
||||
|
||||
interface MessageLoggerInterface {
|
||||
/**
|
||||
* Get the ids of the messages that are logged
|
||||
* @return message ids that are logged
|
||||
*/
|
||||
long[] getLoggedIds(in String[] conversationIds, int limit);
|
||||
|
||||
/**
|
||||
* Get the content of a logged message from the database
|
||||
*/
|
||||
@nullable byte[] getMessage(String conversationId, long id);
|
||||
|
||||
/**
|
||||
* Add a message to the message logger database if it is not already there
|
||||
*/
|
||||
boolean addMessage(String conversationId, long id, in byte[] message);
|
||||
|
||||
/**
|
||||
* Delete a message from the message logger database
|
||||
*/
|
||||
void deleteMessage(String conversationId, long id);
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge;
|
||||
|
||||
interface SyncCallback {
|
||||
/**
|
||||
* Called when the friend data has been synced
|
||||
* @param uuid The uuid of the friend to sync
|
||||
* @return The serialized friend data
|
||||
*/
|
||||
@nullable String syncFriend(String uuid);
|
||||
|
||||
/**
|
||||
* Called when the conversation data has been synced
|
||||
* @param uuid The uuid of the conversation to sync
|
||||
* @return The serialized conversation data
|
||||
*/
|
||||
@nullable String syncGroup(String uuid);
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge.e2ee;
|
||||
|
||||
import me.rhunk.snapenhance.bridge.e2ee.EncryptionResult;
|
||||
|
||||
interface E2eeInterface {
|
||||
/**
|
||||
* Start a new pairing process with a friend
|
||||
* @param friendId
|
||||
* @return the pairing public key
|
||||
*/
|
||||
@nullable byte[] createKeyExchange(String friendId);
|
||||
|
||||
/**
|
||||
* Accept a pairing request from a friend
|
||||
* @param friendId
|
||||
* @param publicKey the public key received from the friend
|
||||
* @return the encapsulated secret to send to the friend
|
||||
*/
|
||||
@nullable byte[] acceptPairingRequest(String friendId, in byte[] publicKey);
|
||||
|
||||
/**
|
||||
* Accept a pairing response from a friend
|
||||
* @param friendId
|
||||
* @param encapsulatedSecret the encapsulated secret received from the friend
|
||||
* @return true if the pairing was successful
|
||||
*/
|
||||
boolean acceptPairingResponse(String friendId, in byte[] encapsulatedSecret);
|
||||
|
||||
/**
|
||||
* Check if a friend key exists
|
||||
* @param friendId
|
||||
* @return true if the friend key exists
|
||||
*/
|
||||
boolean friendKeyExists(String friendId);
|
||||
|
||||
/**
|
||||
* Get the fingerprint of a secret key
|
||||
* @param friendId
|
||||
* @return the fingerprint of the secret key
|
||||
*/
|
||||
@nullable String getSecretFingerprint(String friendId);
|
||||
|
||||
@nullable EncryptionResult encryptMessage(String friendId, in byte[] message);
|
||||
|
||||
@nullable byte[] decryptMessage(String friendId, in byte[] message, in byte[] iv);
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge.e2ee;
|
||||
|
||||
parcelable EncryptionResult {
|
||||
byte[] ciphertext;
|
||||
byte[] iv;
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge.scripting;
|
||||
|
||||
|
||||
interface IPCListener {
|
||||
void onMessage(in String[] args);
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
package me.rhunk.snapenhance.bridge.scripting;
|
||||
|
||||
import me.rhunk.snapenhance.bridge.scripting.IPCListener;
|
||||
|
||||
interface IScripting {
|
||||
List<String> getEnabledScripts();
|
||||
|
||||
@nullable String getScriptContent(String path);
|
||||
|
||||
void registerIPCListener(String channel, String eventName, IPCListener listener);
|
||||
|
||||
void sendIPCMessage(String channel, String eventName, in String[] args);
|
||||
}
|
@ -1,447 +0,0 @@
|
||||
{
|
||||
"category": {
|
||||
"spying_privacy": "التخفي و الخصوصية",
|
||||
"media_manager": "إدارة الوسائط",
|
||||
"ui_tweaks": "الواجهة و الأدوات",
|
||||
"camera": "الكاميرا",
|
||||
"updates": "التحديثات",
|
||||
"experimental_debugging": "تجريبي"
|
||||
},
|
||||
"action": {
|
||||
"clean_cache": "تنظيف ذاكرة التخزين المؤقت",
|
||||
"clear_message_logger": "مسح مسجّل الرسائل",
|
||||
"refresh_mappings": "إعادة تحميل الأداة",
|
||||
"open_map": "إختيار الموقع على الخريطة",
|
||||
"check_for_updates": "التحقق من توفر تحديثات",
|
||||
"export_chat_messages": "تصدير رسائل الدردشة"
|
||||
},
|
||||
"property": {
|
||||
"message_logger": {
|
||||
"name": "تسجيل الرسائل",
|
||||
"description": "يمنع حذف الرسائل"
|
||||
},
|
||||
"prevent_read_receipts": {
|
||||
"name": "منع إيصالات القراءة",
|
||||
"description": "يمنع أي شخص من معرفة أنك فتحت السنابات الخاصة به"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "إخفاء وجود Bitmoji",
|
||||
"description": "يخفي وجود Bitmoji الخاص بك من الدردشة"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "إشعارات أفضل",
|
||||
"description": "يعرض المزيد من المعلومات في الإشعارات"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "الإشعارات المحظورة",
|
||||
"description": "يخفي نوع إشعار محدد"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "تعطيل المقاييس",
|
||||
"description": "يعطّل المقاييس المرسلة إلى Snapchat"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "حجب الإعلانات",
|
||||
"description": "يمنع الإعلانات من الظهور"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "عرض السنابة لوقت غير محدود",
|
||||
"description": "يزيل الحد الزمني لعرض السنابات"
|
||||
},
|
||||
"prevent_sending_messages": {
|
||||
"name": "منع إرسال الرسائل",
|
||||
"description": "يمنع إرسال أنواع معينة من الرسائل"
|
||||
},
|
||||
"anonymous_story_view": {
|
||||
"name": "مشاهدة القصة كمجهول",
|
||||
"description": "يمنع أي شخص من معرفة أنك رأيت قصته"
|
||||
},
|
||||
"hide_typing_notification": {
|
||||
"name": "إخفاء إشعار جارٍ الكتابة",
|
||||
"description": "يمنع إرسال إشعارات الكتابة"
|
||||
},
|
||||
"save_folder": {
|
||||
"name": "مجلد الحفظ",
|
||||
"description": "المجلد الذي يتم فيه حفظ جميع الوسائط"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"name": "خيارات التنزيل التلقائي",
|
||||
"description": "حدد الوسائط التي سيتم تنزيلها تلقائيًا"
|
||||
},
|
||||
"download_options": {
|
||||
"name": "خيارات التنزيل",
|
||||
"description": "تحديد تنسيق مسار الملَفّ"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "قائمة سياق التنزيل بالدردشة",
|
||||
"description": "تمكين قائمة التنزيل في الدردشة"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "تجاوز إرسال الوسائط المرسلة من المعرض",
|
||||
"description": "يرسل وسائط المعرض كسنابة مباشرة"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"name": "حفظ الرسائل تلقائيًا",
|
||||
"description": "تحديد نوع الرسائل التي سيتم حفظها تلقائيًا"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "فرض جودة مصدر الوسائط",
|
||||
"description": "يتجاوز جودة مصدر الوسائط"
|
||||
},
|
||||
"download_logging": {
|
||||
"name": "تنزيل السجل",
|
||||
"description": "عرض إشعار عند تنزيل الوسائط"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "شريط قائمة موجز الأصدقاء",
|
||||
"description": "يمكّن شريط قائمة موجز الأصدقاء الجديد"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "أزرار قائمة موجز الأصدقاء",
|
||||
"description": "حدد الأزرار التي تريد عرضها في شريط قائمة موجز الأصدقاء"
|
||||
},
|
||||
"friend_feed_menu_buttons_position": {
|
||||
"name": "ترتيب موضع أزرار موجز الأصدقاء",
|
||||
"description": "موضع أزرار قائمة موجز الأصدقاء"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"name": "إخفاء عناصر واجهة المستخدم",
|
||||
"description": "تحديد عناصر واجهة المستخدم التي تريد إخفاءها"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"name": "إخفاء قسم القصص",
|
||||
"description": "إخفاء بعض عناصر واجهة المستخدم المعروضة في قسم القصص"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "تجاوز عارض القصة",
|
||||
"description": "يقوم بتشغيل ميزات معينة أخفاها Snapchat"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "عرض معلومات انتهاء صَلاحِيَة سلسلة اللقطات المتتالية",
|
||||
"description": "يعرض معلومات انتهاء صَلاحِيَة سلسلة اللقطات المتتالية بجانب اللقطات"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "تعطيل تقسيم السنابة",
|
||||
"description": "يمنع السنابات من الانقسام إلى أجزاء متعددة"
|
||||
},
|
||||
"disable_video_length_restriction": {
|
||||
"name": "تعطيل قيود طول الفيديو",
|
||||
"description": "يعطّل قيود طول الفيديو"
|
||||
},
|
||||
"snapchat_plus": {
|
||||
"name": "سناب شات+",
|
||||
"description": "يمكّن ميزات Snapchat Plus"
|
||||
},
|
||||
"new_map_ui": {
|
||||
"name": "واجهة الخريطة الجديدة",
|
||||
"description": "يمكّن واجهة الخرائط الجديدة"
|
||||
},
|
||||
"location_spoof": {
|
||||
"name": "تزوير الموقع بخريطة السناب",
|
||||
"description": "يقوم بتغيير موقعك في خريطة السناب"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "طول معاينة الرسالة",
|
||||
"description": "تحديد كَمّيَّة الرسائل التي سيتم معاينتها"
|
||||
},
|
||||
"unlimited_conversation_pinning": {
|
||||
"name": "تثبيت محادثة غير محدود",
|
||||
"description": "تمكن من القدرة على تثبيت محادثات غير محدودة"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "تعطيل منصة الأضواء",
|
||||
"description": "يعطّل صفحة منصة الأضواء"
|
||||
},
|
||||
"enable_app_appearance": {
|
||||
"name": "تمكين إعدادات مظهر التطبيق",
|
||||
"description": "لتمكين إعدادات مظهر التطبيق المخفية"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"name": "تجاوز صفحة بَدْء التشغيل",
|
||||
"description": "يتجاوز صفحة بَدْء التشغيل"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "تعطيل مربعات حوار خدمات Google Play",
|
||||
"description": "يمنع ظهور مربعات حوار توفر خدمات Google Play"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "التحديث التلقائي",
|
||||
"description": "الفاصل الزمني للتحقق من توفر تحديثات"
|
||||
},
|
||||
"disable_camera": {
|
||||
"name": "تعطيل الكاميرا",
|
||||
"description": "يمنع Snapchat من القدرة على استخدام الكاميرا"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "عرض الكاميرا المغمورة",
|
||||
"description": "يمنع Snapchat من اقتصاص عرض الكاميرا"
|
||||
},
|
||||
"preview_resolution": {
|
||||
"name": "دِّقَّة العرض",
|
||||
"description": "يتجاوز دِقَّة عرض الكاميرا"
|
||||
},
|
||||
"picture_resolution": {
|
||||
"name": "دِقَّة الصورة",
|
||||
"description": "يتجاوز دِقَّة الصورة"
|
||||
},
|
||||
"force_highest_frame_rate": {
|
||||
"name": "فرض أعلى معدل إطارات",
|
||||
"description": "يفرض أعلى معدل إطارات ممكن"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "فرض ترميز مصدر الكاميرا",
|
||||
"description": "يفرض ترميز مصدر الكاميرا"
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "تعيين رمز مرور التطبيق",
|
||||
"description": "يعيّن رمز مرور لقفل التطبيق"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "قفل التطبيق عند الإستئناف",
|
||||
"description": "يقفل التطبيق عند إعادة فتحه"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "تعزيز القصّة بلا حدود",
|
||||
"description": "يعزز قصتك بلا حدود"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "تجاوز رمز مرور خاصية خاص بي فقط",
|
||||
"description": "تجاوز رمز مرور خاصية خاص بي فقط\nلن يعمل هذا إلا إذا تم إدخال رمز المرور بشكل صحيح من قبل"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "الوضع الداكن AMOLED",
|
||||
"description": "يمكّن وضع AMOLED الداكن\nتأكد من تمكين الوضع المظلم في إعدادات Snapchat"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "سناب متعدد غير محدود",
|
||||
"description": "يسمح لك بأخذ كمية غير محدودة من السنابات المتعددة"
|
||||
},
|
||||
"device_spoof": {
|
||||
"name": "خداع قِيَم الجهاز",
|
||||
"description": "محاكاة لقيم الأجهزة"
|
||||
},
|
||||
"device_fingerprint": {
|
||||
"name": "بصمة الجهاز",
|
||||
"description": "Spoofs the device fingerprint"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "Android ID",
|
||||
"description": "Spoofs the devices Android ID"
|
||||
}
|
||||
},
|
||||
"option": {
|
||||
"property": {
|
||||
"better_notifications": {
|
||||
"chat": "عرض رسائل الدردشة",
|
||||
"snap": "عرض الوسائط",
|
||||
"reply_button": "إضافة زر الرد",
|
||||
"download_button": "إضافة زر التنزيل"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download_blacklist": "⬇️ قائمة التنزيل التلقائي المحظورة",
|
||||
"anti_auto_save": "💬 منع حفظ الرسائل تلقائياً",
|
||||
"stealth_mode": "👻 وضع التخفي",
|
||||
"conversation_info": "👤 معلومات المحادثة"
|
||||
},
|
||||
"download_options": {
|
||||
"allow_duplicate": "السماح بالتنزيلات المكررة",
|
||||
"create_user_folder": "إنشاء مجلد لكل مستخدم",
|
||||
"append_hash": "إضافة هاش فريد إلى اسم الملَفّ",
|
||||
"append_username": "إضافة اسم المستخدم إلى اسم الملَفّ",
|
||||
"append_date_time": "إضافة التاريخ والوقت إلى اسم الملَفّ",
|
||||
"append_type": "إضافة نوع الوسائط إلى اسم الملَفّ",
|
||||
"merge_overlay": "دمج تداخل النص مع السنابة"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"friend_snaps": "سنابات الأصدقاء",
|
||||
"friend_stories": "قصص الأصدقاء",
|
||||
"public_stories": "القصص العامة",
|
||||
"spotlight": "منصة الأضواء"
|
||||
},
|
||||
"download_logging": {
|
||||
"started": "بدأ",
|
||||
"success": "نجح",
|
||||
"progress": "مستوى التقدُّم",
|
||||
"failure": "فشل"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"NOTE": "الملاحظات الصوتية",
|
||||
"CHAT": "الدردشة",
|
||||
"EXTERNAL_MEDIA": "الوسائط الخارجية",
|
||||
"SNAP": "السنابة",
|
||||
"STICKER": "الملصقات"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "لقطة الشاشة",
|
||||
"chat_screen_record": "تسجيل الشاشة",
|
||||
"camera_roll_save": "حُفظ بالمعرض",
|
||||
"chat": "الدردشة",
|
||||
"chat_reply": "الرد على الدردشة",
|
||||
"snap": "السنابة",
|
||||
"typing": "جارٍ الكتابة",
|
||||
"stories": "القصص",
|
||||
"initiate_audio": "مكالمة صوتية واردة",
|
||||
"abandon_audio": "مكالمة صوتية فائتة",
|
||||
"initiate_video": "مكالمة فيديو واردة",
|
||||
"abandon_video": "مكالمة فيديو فائتة"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "الأصل",
|
||||
"NOTE": "الملاحظات الصوتية",
|
||||
"SNAP": "السنابة",
|
||||
"LIVE_SNAP": "السنابة مع الصوت"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"remove_call_buttons": "إزالة أزرار المكالمات",
|
||||
"remove_cognac_button": "إزالة زر Cognac",
|
||||
"remove_live_location_share_button": "إزالة زر مشاركة الموقع المباشر",
|
||||
"remove_stickers_button": "إزالة زر الملصقات",
|
||||
"remove_voice_record_button": "إزالة زر تسجيل الصوت",
|
||||
"remove_camera_borders": "إزالة حدود الكاميرا"
|
||||
},
|
||||
"auto_updater": {
|
||||
"DISABLED": "معطّل",
|
||||
"EVERY_LAUNCH": "كل عملية تشغيل",
|
||||
"DAILY": "يوميًا",
|
||||
"WEEKLY": "إسبوعيٍا"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "إيقاف",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "تمكين اكتشاف شريط التقدم عن التشغيل",
|
||||
"VERTICAL_STORY_VIEWER": "تمكين عارض شريط تقدم عداد القصة بأعلى السنابات"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"hide_friend_suggestions": "إخفاء اقتراحات الأصدقاء",
|
||||
"hide_friends": "إخفاء قسم الأصدقاء",
|
||||
"hide_following": "إخفاء قسم المتابعة",
|
||||
"hide_for_you": "إخفاء قسم اكتشف"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"OFF": "إيقاف",
|
||||
"ngs_map_icon_container": "الخريطة",
|
||||
"ngs_chat_icon_container": "الدردشة",
|
||||
"ngs_camera_icon_container": "الكاميرا",
|
||||
"ngs_community_icon_container": "المجتمع / القصص",
|
||||
"ngs_spotlight_icon_container": "منصة الأضواء",
|
||||
"ngs_search_icon_container": "البحث"
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_menu_option": {
|
||||
"preview": "معاينة",
|
||||
"stealth_mode": "وضع التخفي",
|
||||
"auto_download_blacklist": "قائمة التنزيل التلقائي المحظورة",
|
||||
"anti_auto_save": "منع الحفظ التلقائي"
|
||||
},
|
||||
"message_context_menu_option": {
|
||||
"download": "تنزيل",
|
||||
"preview": "معاينة"
|
||||
},
|
||||
"chat_action_menu": {
|
||||
"preview_button": "معاينة",
|
||||
"download_button": "تنزيل",
|
||||
"delete_logged_message_button": "حذف الرسالة المسجلة"
|
||||
},
|
||||
"opera_context_menu": {
|
||||
"download": "تنزيل الوسائط"
|
||||
},
|
||||
"modal_option": {
|
||||
"profile_info": "معلومات الملَفّ الشخصي",
|
||||
"close": "إغلاق"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "يمكنك إرسال مِلَفّ وسائط واحد فقط في وقت واحد"
|
||||
},
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "تنتهي الصَّلاحِيَة في {day} يوم {hour} ساعة {minute} دقيقة",
|
||||
"total_messages": "مجموع الرسائل المرسلة/المستلمة: {count}",
|
||||
"title": "معاينة",
|
||||
"unknown_user": "مستخدم مجهول"
|
||||
},
|
||||
"profile_info": {
|
||||
"title": "معلومات الملَفّ الشخصي",
|
||||
"username": "اسم المستخدم",
|
||||
"display_name": "اسم العرض",
|
||||
"added_date": "تاريخ الإضافة",
|
||||
"birthday": "تاريخ الميلاد: {month} {day}"
|
||||
},
|
||||
"auto_updater": {
|
||||
"no_update_available": "لا يوجد تحديث متوفر!",
|
||||
"dialog_title": "تحديث جديد متوفر!",
|
||||
"dialog_message": "يتوفر تحديث جديد لـ SnapEnhance! ({version})\n\n{body}",
|
||||
"dialog_positive_button": "تنزيل و تثبيت",
|
||||
"dialog_negative_button": "إلغاء",
|
||||
"downloading_toast": "جارٍ تنزيل التحديث...",
|
||||
"download_manager_notification_title": "جارٍ تنزيل SnapEnhance APK..."
|
||||
},
|
||||
"chat_export": {
|
||||
"select_export_format": "تحديد تنسيق التصدير",
|
||||
"select_media_type": "تحديد أنواع الوسائط للتصدير",
|
||||
"select_conversation": "حدد محادثة للتصدير",
|
||||
"dialog_negative_button": "إلغاء",
|
||||
"dialog_neutral_button": "تصدير الكل",
|
||||
"dialog_positive_button": "تصدير",
|
||||
"exported_to": "تم التصدير إلى {path}",
|
||||
"exporting_chats": "تصدير الدردشة...",
|
||||
"processing_chats": "جارٍ معالجة {amount} من المحادثات...",
|
||||
"export_fail": "فشل في تصدير المحادثة {conversation}",
|
||||
"writing_output": "إخراج الكتابة...",
|
||||
"finished": "تم! يمكنك الآن إغلاق مربع الحوار هذا.",
|
||||
"no_messages_found": "لم يتم العثور على رسائل!",
|
||||
"exporting_message": "تصدير {conversation}..."
|
||||
},
|
||||
"button": {
|
||||
"ok": "موافق",
|
||||
"positive": "نعم",
|
||||
"negative": "لا",
|
||||
"cancel": "إلغاء",
|
||||
"open": "فتح"
|
||||
},
|
||||
"download_manager_activity": {
|
||||
"remove_all_title": "إزالة جميع التنزيلات",
|
||||
"remove_all_text": "هل أنت متأكد من أنك تريد القيام بهذا؟",
|
||||
"remove_all": "إزالة الكل",
|
||||
"no_downloads": "لا توجد تنزيلات",
|
||||
"cancel": "إلغاء",
|
||||
"file_not_found_toast": "الملَفّ غير موجود!",
|
||||
"category": {
|
||||
"all_category": "الكل",
|
||||
"pending_category": "معلّقة",
|
||||
"snap_category": "السنابات",
|
||||
"story_category": "القصص",
|
||||
"spotlight_category": "منصة الأضواء"
|
||||
},
|
||||
"debug_settings": "إعدادات التصحيح",
|
||||
"debug_settings_page": {
|
||||
"clear_file_title": "مسح ملَفّ {file_name}",
|
||||
"clear_file_confirmation": "هل أنت متأكد من أنك تريد مسح الملَفّ {file_name}؟",
|
||||
"clear_cache_title": "تنظيف ذاكرة التخزين المؤقت",
|
||||
"reset_all_title": "إعادة تعيين كل الإعدادات",
|
||||
"reset_all_confirmation": "هل أنت متأكد من أنك تريد إعادة تعيين كل الإعدادات؟",
|
||||
"success_toast": "نجح!",
|
||||
"device_spoofer": "خداع الجهاز"
|
||||
}
|
||||
},
|
||||
"download_processor": {
|
||||
"download_started_toast": "بدأ التنزيل",
|
||||
"unsupported_content_type_toast": "نوع المحتوى غير مدعوم!",
|
||||
"failed_no_longer_available_toast": "الوسائط لم تعد متوفرة",
|
||||
"already_queued_toast": "الوسائط موجودة بالفعل في قائمة الانتظار!",
|
||||
"already_downloaded_toast": "تم تنزيل الوسائط بالفعل!",
|
||||
"saved_toast": "تم الحفظ في {path}",
|
||||
"download_toast": "جارٍ تنزيل {path}...",
|
||||
"processing_toast": "جارٍ معالجة {path}...",
|
||||
"failed_generic_toast": "فشل التنزيل",
|
||||
"failed_to_create_preview_toast": "فشل إنشاء المعاينة",
|
||||
"failed_processing_toast": "فشل في معالجة {error}",
|
||||
"failed_gallery_toast": "فشل الحفظ في معرض الصور {error}"
|
||||
},
|
||||
"config_activity": {
|
||||
"title": "إعدادات SnapEnhance",
|
||||
"selected_text": "{count} المحدد",
|
||||
"invalid_number_toast": "رقم غير صالح!"
|
||||
},
|
||||
"spoof_activity": {
|
||||
"title": "خداع الإعدادات"
|
||||
}
|
||||
}
|
@ -1,447 +0,0 @@
|
||||
{
|
||||
"category": {
|
||||
"spying_privacy": "Spying & Privatsphäre",
|
||||
"media_manager": "Medien Verwaltung",
|
||||
"ui_tweaks": "UI & Tweaks",
|
||||
"camera": "Kamera",
|
||||
"updates": "Updates",
|
||||
"experimental_debugging": "Experimentell"
|
||||
},
|
||||
"action": {
|
||||
"clean_cache": "Cache bereinigen",
|
||||
"clear_message_logger": "Nachrichten Logger bereinigen",
|
||||
"refresh_mappings": "Mappings erneuern",
|
||||
"open_map": "Standort auf der Map auswählen",
|
||||
"check_for_updates": "Auf Updates überprüfen",
|
||||
"export_chat_messages": "Chat Nachrichten Exportieren"
|
||||
},
|
||||
"property": {
|
||||
"message_logger": {
|
||||
"name": "Nachrichten Logger",
|
||||
"description": "Verhindern, dass Nachrichten gelöscht werden"
|
||||
},
|
||||
"prevent_read_receipts": {
|
||||
"name": "Lesebestätigungen verhindern",
|
||||
"description": "Verhindern, dass jemand erfährt, dass ein Snap geöffnet wurde"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "Bitmoji Präsenz verstecken",
|
||||
"description": "Verstecke die Bitmoji-Präsenz im Chat"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "Bessere Benachrichtigungen",
|
||||
"description": "Zeige weitere Informationen in Benachrichtigungen an"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "Benachrichtigungs Blacklist",
|
||||
"description": "Blendet den ausgewählten Benachrichtigungstyp aus"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "Metriken deaktivieren",
|
||||
"description": "Snapchat-Metriken deaktivieren"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "Werbung blockieren",
|
||||
"description": "Blockiere das Anzeigen von Werbung"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "Unbegrenztes Ansehen von Snaps",
|
||||
"description": "Entfernt das Zeitlimit für die Anzeige von Snaps"
|
||||
},
|
||||
"prevent_sending_messages": {
|
||||
"name": "Unerwünschte Nachrichten abhalten",
|
||||
"description": "Verhindert das Versenden bestimmter Nachrichten"
|
||||
},
|
||||
"anonymous_story_view": {
|
||||
"name": "Anonyme Story Ansicht",
|
||||
"description": "Verhindert, dass jemand erfährt, dass seine Story gesehen wurde"
|
||||
},
|
||||
"hide_typing_notification": {
|
||||
"name": "Tippen-Benachrichtigung verbergen",
|
||||
"description": "Verhindert das Senden von Schreibbenachrichtigungen"
|
||||
},
|
||||
"save_folder": {
|
||||
"name": "Speicherverzeichnis",
|
||||
"description": "Der Ordner in dem alle Medien gespeichert werden"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"name": "Auto Download Optionen",
|
||||
"description": "Wähle aus welche Medien automatisch heruntergeladen werden sollen"
|
||||
},
|
||||
"download_options": {
|
||||
"name": "Download Optionen",
|
||||
"description": "Gebe das Dateiformat an"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "Kontextmenü für Chat-Download aktivieren",
|
||||
"description": "Aktivieren Sie das Kontextmenü zum Chat-Download"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "Überschreiben beim Senden von Gallerie Medien",
|
||||
"description": "Überschreibt die von der Galerie gesendeten Medien"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"name": "Automatisches Speichern von Nachrichten",
|
||||
"description": "Wähle aus welche Art von Nachrichten automatisch gespeichert werden sollen"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "Medien Qualität Überschreiben",
|
||||
"description": "Überschreibt die Qualität der Medienquelle"
|
||||
},
|
||||
"download_logging": {
|
||||
"name": "Download Protokollierung",
|
||||
"description": "Toast anzeigen, wenn Medien heruntergeladen werden"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "Freunde Feed Menüleiste",
|
||||
"description": "Aktiviert die \"neue Freunde\" Menüleiste"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "Schaltflächen für das Freunde Feed Menü",
|
||||
"description": "Wähle aus welche Schaltflächen in der Freunde Feed Menüleiste angezeigt werden sollen"
|
||||
},
|
||||
"friend_feed_menu_buttons_position": {
|
||||
"name": "Positionsindex der Freunde Feed Schaltflächen",
|
||||
"description": "Die Position der Freunde Feed Menüschaltflächen"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"name": "UI-Elemente ausblenden",
|
||||
"description": "Wähle aus welche UI-Elemente ausgeblendet werden sollen"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"name": "Story Abschnitt ausblenden",
|
||||
"description": "Blenden Sie bestimmte im Story Bereich angezeigte UI-Elemente aus"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "Story Viewer Überschreibung",
|
||||
"description": "Aktiviert bestimmte Funktionen die Snapchat ausgeblendet hat"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "Informationen zum Streak Ablauf anzeigen",
|
||||
"description": "Zeigt Informationen zum Streak Ablauf neben den Streaks an"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "Deaktivieren der Snap-Aufteilung",
|
||||
"description": "Verhindert, dass Snaps in mehrere Teile aufgeteilt werden"
|
||||
},
|
||||
"disable_video_length_restriction": {
|
||||
"name": "Deaktiviert die Beschränkung der Videolänge",
|
||||
"description": "Deaktiviert die Beschränkung der Videolänge"
|
||||
},
|
||||
"snapchat_plus": {
|
||||
"name": "Snapchat Plus",
|
||||
"description": "Aktiviert Snapchat Plus-Funktionen"
|
||||
},
|
||||
"new_map_ui": {
|
||||
"name": "Neue Karten UI",
|
||||
"description": "Aktiviert die neue Karten-Benutzeroberfläche"
|
||||
},
|
||||
"location_spoof": {
|
||||
"name": "Snapmap Standort Spoofer",
|
||||
"description": "Verfälscht den Standort auf der Snapmap"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "Länge der Nachrichtenvorschau",
|
||||
"description": "Gebe die Anzahl der Nachrichten an die in der Vorschau angezeigt werden sollen"
|
||||
},
|
||||
"unlimited_conversation_pinning": {
|
||||
"name": "Unbegrenztes Anpinnen von Unterhaltungen",
|
||||
"description": "Aktiviert die Fähigkeit, unbegrenzte Unterhaltungen anzupinnen"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "Deaktivieren des Spotlights",
|
||||
"description": "Deaktiviert die Spotlight Seite"
|
||||
},
|
||||
"enable_app_appearance": {
|
||||
"name": "Aktivieret die App Darstellungseinstellungen",
|
||||
"description": "Aktiviert die ausgeblendete Einstellung für die Darstellung der App"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"name": "Änderung des Startbildschirms",
|
||||
"description": "Verändert die Startseite"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "Google Play-Service-Warnungen Dialog deaktivieren",
|
||||
"description": "Verfügbarkeitsdialog für Google Play Services nicht anzeigen"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "Auto Updater",
|
||||
"description": "Der Intervall für die Suche nach Updates"
|
||||
},
|
||||
"disable_camera": {
|
||||
"name": "Kamera deaktivieren",
|
||||
"description": "Verhindert dass Snapchat die Kamera verwenden kann"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "Immersive Kamera-Vorschau",
|
||||
"description": "Verhindert, dass Snapchat die Kameravorschau zuschneidet"
|
||||
},
|
||||
"preview_resolution": {
|
||||
"name": "Vorschauauflösung",
|
||||
"description": "Überschreibt die Auflösung der Kameravorschau"
|
||||
},
|
||||
"picture_resolution": {
|
||||
"name": "Bildauflösung",
|
||||
"description": "Überschreibt die Bildauflösung"
|
||||
},
|
||||
"force_highest_frame_rate": {
|
||||
"name": "Höchste Bildwiederholrate erzwingen",
|
||||
"description": "Erzwingt die höchstmögliche Bildwiederholungsrate"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "Kodierung der Kameraquelle erzwingen",
|
||||
"description": "Kodierung der Kameraquelle erzwingen"
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "Lege ein App Passwort fest",
|
||||
"description": "Legt einen Passcode zum Entsperren der App fest"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "App-Sperre beim Fortsetzen",
|
||||
"description": "Sperrt die App, wenn sie erneut geöffnet wird"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "Unendlicher Story Boost",
|
||||
"description": "Unendlicher boost für deine Story"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "Passwortumgehung für privaten Bereich",
|
||||
"description": "Umgeht das Passwort für den privaten Ordner Funktioniert nur, wenn das richtige Passwort schon einmal eingegeben wurde"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "AMOLED Dark Mode",
|
||||
"description": "Aktiviert den AMOLED-Dunkelmodus\nStelle sicher, dass der Dunkelmodus von Snapchat aktiviert ist"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "Unbegrenzte Multi-Snaps",
|
||||
"description": "Ermöglicht die Aufnahme einer unbegrenzten Anzahl von Multi-Snaps"
|
||||
},
|
||||
"device_spoof": {
|
||||
"name": "Device Values Spoofen",
|
||||
"description": "Spoofed bestimmte Werte des Geräts"
|
||||
},
|
||||
"device_fingerprint": {
|
||||
"name": "Gerät Fingerabdruck",
|
||||
"description": "Spoofed den Geräte-Fingerabdruck"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "Android ID",
|
||||
"description": "Spoofed die Android-ID"
|
||||
}
|
||||
},
|
||||
"option": {
|
||||
"property": {
|
||||
"better_notifications": {
|
||||
"chat": "Chatnachrichten anzeigen",
|
||||
"snap": "Medien anzeigen",
|
||||
"reply_button": "Füge einen \"Antworten\" Knopf hinzu",
|
||||
"download_button": "Zeige Download-Button"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download_blacklist": "⬇️ Automatische Download-Blacklist",
|
||||
"anti_auto_save": "💬 Anti-Auto-Nachricht-Speichern",
|
||||
"stealth_mode": "👻 Heimlicher Modus",
|
||||
"conversation_info": "👤 Gesprächsinformationen"
|
||||
},
|
||||
"download_options": {
|
||||
"allow_duplicate": "Erlaube doppelte Downloads",
|
||||
"create_user_folder": "Erstelle einen Ordner für jeden Benutzer",
|
||||
"append_hash": "Fügt dem Dateinamen einen einzigartigen Hash hinzu",
|
||||
"append_username": "Füge den Benutzername zum Dateiname hinzu",
|
||||
"append_date_time": "Füge Datum und Uhrzeit zum Dateinamen hinzu",
|
||||
"append_type": "Füge den Medientyp zum Dateiname hinzu",
|
||||
"merge_overlay": "Snap-Bild-Overlays zusammenführen"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"friend_snaps": "Freund-Snaps",
|
||||
"friend_stories": "Freund Stories",
|
||||
"public_stories": "Öffentliche Stories",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"download_logging": {
|
||||
"started": "Gestartet",
|
||||
"success": "Abgeschlossen",
|
||||
"progress": "Fortschritt",
|
||||
"failure": "Fehler"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"NOTE": "Audio Hinweis",
|
||||
"CHAT": "Chat",
|
||||
"EXTERNAL_MEDIA": "Externe Medien",
|
||||
"SNAP": "Snap",
|
||||
"STICKER": "Sticker"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "Screenshot",
|
||||
"chat_screen_record": "Bildschirmaufnahme",
|
||||
"camera_roll_save": "Camera Roll speichern",
|
||||
"chat": "Chat",
|
||||
"chat_reply": "Chat Antwort",
|
||||
"snap": "Snap",
|
||||
"typing": "Typing",
|
||||
"stories": "Stories",
|
||||
"initiate_audio": "Eingehender Audioanruf",
|
||||
"abandon_audio": "Audioanruf in Abwesenheit",
|
||||
"initiate_video": "Eingehender Videoanruf",
|
||||
"abandon_video": "Verpasster Videoanruf"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "Original",
|
||||
"NOTE": "Audio Hinweis",
|
||||
"SNAP": "Snap",
|
||||
"LIVE_SNAP": "Snap mit ton"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"remove_call_buttons": "Entferne anruf buttons",
|
||||
"remove_cognac_button": "Cognac-Button entfernen",
|
||||
"remove_live_location_share_button": "Schaltfläche Live-Standortfreigabe entfernen",
|
||||
"remove_stickers_button": "Entferne Sticker Button",
|
||||
"remove_voice_record_button": "Knopf für Sprachaufzeichnung entfernen",
|
||||
"remove_camera_borders": "Kameraränder entfernen"
|
||||
},
|
||||
"auto_updater": {
|
||||
"DISABLED": "Aus",
|
||||
"EVERY_LAUNCH": "Bei jedem Start",
|
||||
"DAILY": "Täglich",
|
||||
"WEEKLY": "Wöchentlich"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "Aus",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "Aktivieren Sie die Discovery Playback-Suchleiste",
|
||||
"VERTICAL_STORY_VIEWER": "Aktiviere den vertikalen Story Viewer"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"hide_friend_suggestions": "Freundschaftsvorschläge verstecken",
|
||||
"hide_friends": "Freundesbereich ausblenden",
|
||||
"hide_following": "Folgenden Abschnitt ausblenden",
|
||||
"hide_for_you": "For You abschnitt ausblenden"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"OFF": "Aus",
|
||||
"ngs_map_icon_container": "Karte",
|
||||
"ngs_chat_icon_container": "Chat",
|
||||
"ngs_camera_icon_container": "Kamera",
|
||||
"ngs_community_icon_container": "Community / Stories",
|
||||
"ngs_spotlight_icon_container": "Spotlight",
|
||||
"ngs_search_icon_container": "Suche"
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_menu_option": {
|
||||
"preview": "Vorschau",
|
||||
"stealth_mode": "Inkognitomodus",
|
||||
"auto_download_blacklist": "Blacklist für automatische Downloads",
|
||||
"anti_auto_save": "Anti-Auto-Speichern"
|
||||
},
|
||||
"message_context_menu_option": {
|
||||
"download": "Download",
|
||||
"preview": "Vorschau"
|
||||
},
|
||||
"chat_action_menu": {
|
||||
"preview_button": "Vorschau",
|
||||
"download_button": "Download",
|
||||
"delete_logged_message_button": "Gespeicherte Nachrichten löschen"
|
||||
},
|
||||
"opera_context_menu": {
|
||||
"download": "Medien herunterladen"
|
||||
},
|
||||
"modal_option": {
|
||||
"profile_info": "Profil Info",
|
||||
"close": "Schließen"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "Du kannst nur eine Datei auf einmal senden"
|
||||
},
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "läuft in {day} Tagen, {hour} Stunden, {minute} Minuten ab",
|
||||
"total_messages": "Insgesamt gesendete/empfangene Nachrichten: {count}",
|
||||
"title": "Vorschau",
|
||||
"unknown_user": "Unbekannter Benutzer"
|
||||
},
|
||||
"profile_info": {
|
||||
"title": "Profil Info",
|
||||
"username": "Nutzername",
|
||||
"display_name": "Anzeigename",
|
||||
"added_date": "Datum hinzugefügt",
|
||||
"birthday": "Geburtstag: {month} {day}"
|
||||
},
|
||||
"auto_updater": {
|
||||
"no_update_available": "Kein Update verfügbar!",
|
||||
"dialog_title": "Neues Update verfügbar!",
|
||||
"dialog_message": "Ein neues Update für SnapEnhance ist verfügbar! ({version})\n\n{body}",
|
||||
"dialog_positive_button": "Herunterladen und installieren",
|
||||
"dialog_negative_button": "Abbrechen",
|
||||
"downloading_toast": "Update wird Heruntergeladen...",
|
||||
"download_manager_notification_title": "Lade SnapEnhance APK herunter..."
|
||||
},
|
||||
"chat_export": {
|
||||
"select_export_format": "Exportformat auswählen",
|
||||
"select_media_type": "Wähle den Medientyp für den Export aus",
|
||||
"select_conversation": "Wähle eine Unterhaltung zum Exportieren aus",
|
||||
"dialog_negative_button": "Abbrechen",
|
||||
"dialog_neutral_button": "Alle Exportieren",
|
||||
"dialog_positive_button": "Exportieren",
|
||||
"exported_to": "Exportiert zu {path}",
|
||||
"exporting_chats": "Chats exportieren...",
|
||||
"processing_chats": "{amount} Konversationen werden verarbeitet...",
|
||||
"export_fail": "Konversation {conversation} konnte nicht exportiert werden",
|
||||
"writing_output": "Ausgabe schreiben...",
|
||||
"finished": "Fertig! Du kannst diesen Dialog jetzt schließen.",
|
||||
"no_messages_found": "Keine Nachrichten gefunden!",
|
||||
"exporting_message": "{conversation} wird exportiert..."
|
||||
},
|
||||
"button": {
|
||||
"ok": "OK",
|
||||
"positive": "Ja",
|
||||
"negative": "Nein",
|
||||
"cancel": "Abbrechen",
|
||||
"open": "Öffnen"
|
||||
},
|
||||
"download_manager_activity": {
|
||||
"remove_all_title": "Entferne alle Downloads",
|
||||
"remove_all_text": "Bist du sicher, dass du das tun möchtest?",
|
||||
"remove_all": "Entferne Alle",
|
||||
"no_downloads": "Keine Downloads",
|
||||
"cancel": "Abbrechen",
|
||||
"file_not_found_toast": "Datei existiert nicht!",
|
||||
"category": {
|
||||
"all_category": "Alle",
|
||||
"pending_category": "Ausstehend",
|
||||
"snap_category": "Snaps",
|
||||
"story_category": "Stories",
|
||||
"spotlight_category": "Spotlight"
|
||||
},
|
||||
"debug_settings": "Debug Einstellungen",
|
||||
"debug_settings_page": {
|
||||
"clear_file_title": "Lösche {file_name}",
|
||||
"clear_file_confirmation": "Sind sie sicher, dass sie {file_name} löschen möchten?",
|
||||
"clear_cache_title": "Lösche den Zwischenspeicher",
|
||||
"reset_all_title": "Alle Einstellungen zurücksetzen",
|
||||
"reset_all_confirmation": "Bist du sicher, dass du alle Einstellungen zurücksetzen möchten?",
|
||||
"success_toast": "Erfolgreich!",
|
||||
"device_spoofer": "Device Spoofer"
|
||||
}
|
||||
},
|
||||
"download_processor": {
|
||||
"download_started_toast": "Download gestartet",
|
||||
"unsupported_content_type_toast": "Nicht unterstützter Content-Typ!",
|
||||
"failed_no_longer_available_toast": "Datei ist nicht mehr verfügbar",
|
||||
"already_queued_toast": "Datei wird bereits bearbeitet!",
|
||||
"already_downloaded_toast": "Datei wurde bereits heruntergeladen!",
|
||||
"saved_toast": "Gespeichert unter {path}",
|
||||
"download_toast": "{path} wird heruntergeladen...",
|
||||
"processing_toast": "Verarbeite {path}...",
|
||||
"failed_generic_toast": "Download fehlgeschlagen",
|
||||
"failed_to_create_preview_toast": "Fehler beim Erstellen der Vorschau",
|
||||
"failed_processing_toast": "Fehler beim Verarbeiten {error}",
|
||||
"failed_gallery_toast": "Speichern in der Galerie fehlgeschlagen {error}"
|
||||
},
|
||||
"config_activity": {
|
||||
"title": "SnapEnhance Einstellungen",
|
||||
"selected_text": "{count} ausgewählt",
|
||||
"invalid_number_toast": "Ungültige Nummer!"
|
||||
},
|
||||
"spoof_activity": {
|
||||
"title": "Spoof Einstellungen"
|
||||
}
|
||||
}
|
@ -1,807 +0,0 @@
|
||||
{
|
||||
"setup": {
|
||||
"dialogs": {
|
||||
"select_language": "Select Language",
|
||||
"save_folder": "SnapEnhance requires Storage permissions to download and Save Media from Snapchat.\nPlease choose the location where media should be downloaded to.",
|
||||
"select_save_folder_button": "Select Folder"
|
||||
},
|
||||
"mappings": {
|
||||
"dialog": "To dynamically support a wide range of Snapchat Versions, mappings are necessary for SnapEnhance to function properly, this should not take more than 5 seconds.",
|
||||
"generate_button": "Generate",
|
||||
"generate_failure_no_snapchat": "SnapEnhance was unable to detect Snapchat, please try reinstalling Snapchat.",
|
||||
"generate_failure": "An error occurred while trying to generate mappings, please try again.",
|
||||
"generate_success": "Mappings generated successfully."
|
||||
},
|
||||
"permissions": {
|
||||
"dialog": "To continue you need to fit the following requirements:",
|
||||
"notification_access": "Notification Access",
|
||||
"battery_optimization": "Battery Optimization",
|
||||
"request_button": "Request"
|
||||
}
|
||||
},
|
||||
|
||||
"manager": {
|
||||
"routes": {
|
||||
"downloads": "Downloads",
|
||||
"features": "Features",
|
||||
"home": "Home",
|
||||
"home_settings": "Settings",
|
||||
"home_logs": "Logs",
|
||||
"social": "Social",
|
||||
"scripts": "Scripts"
|
||||
},
|
||||
"sections": {
|
||||
"home": {
|
||||
"logs": {
|
||||
"clear_logs_button": "Clear Logs",
|
||||
"export_logs_button": "Export Logs"
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
"empty_download_list": "(empty)"
|
||||
},
|
||||
"features": {
|
||||
"disabled": "Disabled"
|
||||
},
|
||||
"social": {
|
||||
"e2ee_title": "End-to-End Encryption",
|
||||
"rules_title": "Rules",
|
||||
"participants_text": "{count} participants",
|
||||
"not_found": "Not found",
|
||||
"streaks_title": "Streaks",
|
||||
"streaks_length_text": "Length: {length}",
|
||||
"streaks_expiration_short": "{hours}h",
|
||||
"streaks_expiration_text": "Expires in {eta}",
|
||||
"reminder_button": "Set Reminder"
|
||||
}
|
||||
},
|
||||
"dialogs": {
|
||||
"add_friend": {
|
||||
"title": "Add Friend or Group",
|
||||
"search_hint": "Search",
|
||||
"fetch_error": "Failed to fetch data",
|
||||
"category_groups": "Groups",
|
||||
"category_friends": "Friends"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"rules": {
|
||||
"modes": {
|
||||
"blacklist": "Blacklist mode",
|
||||
"whitelist": "Whitelist mode"
|
||||
},
|
||||
"properties": {
|
||||
"auto_download": {
|
||||
"name": "Auto download",
|
||||
"description": "Automatically download Snaps when viewing them",
|
||||
"options": {
|
||||
"blacklist": "Exclude from Auto Download",
|
||||
"whitelist": "Auto Download"
|
||||
}
|
||||
},
|
||||
"stealth": {
|
||||
"name": "Stealth Mode",
|
||||
"description": "Prevents anyone from knowing you've opened their Snaps/Chats and conversations",
|
||||
"options": {
|
||||
"blacklist": "Exclude from Stealth Mode",
|
||||
"whitelist": "Stealth mode"
|
||||
}
|
||||
},
|
||||
"auto_save": {
|
||||
"name": "Auto Save",
|
||||
"description": "Saves Chat Messages when viewing them",
|
||||
"options": {
|
||||
"blacklist": "Exclude from Auto save",
|
||||
"whitelist": "Auto save"
|
||||
}
|
||||
},
|
||||
"hide_chat_feed": {
|
||||
"name": "Hide from Chat feed"
|
||||
},
|
||||
"e2e_encryption": {
|
||||
"name": "Use E2E Encryption"
|
||||
},
|
||||
"pin_conversation": {
|
||||
"name": "Pin Conversation"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"actions": {
|
||||
"clean_snapchat_cache": "Clean Snapchat Cache",
|
||||
"clear_message_logger": "Clear Message Logger",
|
||||
"refresh_mappings": "Refresh Mappings",
|
||||
"open_map": "Choose location on map",
|
||||
"check_for_updates": "Check for updates",
|
||||
"export_chat_messages": "Export Chat Messages"
|
||||
},
|
||||
|
||||
"features": {
|
||||
"notices": {
|
||||
"unstable": "\u26A0 Unstable",
|
||||
"ban_risk": "\u26A0 This feature may cause bans",
|
||||
"internal_behavior": "\u26A0 This may break Snapchat internal behavior"
|
||||
},
|
||||
"properties": {
|
||||
"downloader": {
|
||||
"name": "Downloader",
|
||||
"description": "Download Snapchat Media",
|
||||
"properties": {
|
||||
"save_folder": {
|
||||
"name": "Save Folder",
|
||||
"description": "Select the directory to which all media should be downloaded to"
|
||||
},
|
||||
"auto_download_sources": {
|
||||
"name": "Auto Download Sources",
|
||||
"description": "Select the sources to automatically download from"
|
||||
},
|
||||
"prevent_self_auto_download": {
|
||||
"name": "Prevent Self Auto Download",
|
||||
"description": "Prevents your own Snaps from being downloaded automatically"
|
||||
},
|
||||
"path_format": {
|
||||
"name": "Path Format",
|
||||
"description": "Specify the File Path Format"
|
||||
},
|
||||
"allow_duplicate": {
|
||||
"name": "Allow Duplicate",
|
||||
"description": "Allows the same media to be downloaded multiple times"
|
||||
},
|
||||
"merge_overlays": {
|
||||
"name": "Merge Overlays",
|
||||
"description": "Combines the Text and the media of a Snap into a single file"
|
||||
},
|
||||
"force_image_format": {
|
||||
"name": "Force Image Format",
|
||||
"description": "Forces images to be saved in a specified Format"
|
||||
},
|
||||
"force_voice_note_format": {
|
||||
"name": "Force Voice Note Format",
|
||||
"description": "Forces Voice Notes to be saved in a specified Format"
|
||||
},
|
||||
"download_profile_pictures": {
|
||||
"name": "Download Profile Pictures",
|
||||
"description": "Allows you to download Profile Pictures from the profile page"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "Chat Download Context Menu",
|
||||
"description": "Allows you to download media from a conversation by long-pressing them"
|
||||
},
|
||||
"ffmpeg_options": {
|
||||
"name": "FFmpeg Options",
|
||||
"description": "Specify additional FFmpeg options",
|
||||
"properties": {
|
||||
"threads": {
|
||||
"name": "Threads",
|
||||
"description": "The amount of threads to use"
|
||||
},
|
||||
"preset": {
|
||||
"name": "Preset",
|
||||
"description": "Set the speed of the conversion"
|
||||
},
|
||||
"constant_rate_factor": {
|
||||
"name": "Constant Rate Factor",
|
||||
"description": "Set the constant rate factor for the video encoder\nFrom 0 to 51 for libx264"
|
||||
},
|
||||
"video_bitrate": {
|
||||
"name": "Video Bitrate",
|
||||
"description": "Set the video bitrate (kbps)"
|
||||
},
|
||||
"audio_bitrate": {
|
||||
"name": "Audio Bitrate",
|
||||
"description": "Set the audio bitrate (kbps)"
|
||||
},
|
||||
"custom_video_codec": {
|
||||
"name": "Custom Video Codec",
|
||||
"description": "Set a custom Video Codec (e.g. libx264)"
|
||||
},
|
||||
"custom_audio_codec": {
|
||||
"name": "Custom Audio Codec",
|
||||
"description": "Set a custom Audio Codec (e.g. AAC)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"logging": {
|
||||
"name": "Logging",
|
||||
"description": "Shows toasts when media is downloading"
|
||||
}
|
||||
}
|
||||
},
|
||||
"user_interface": {
|
||||
"name": "User Interface",
|
||||
"description": "Change the look and feel of Snapchat",
|
||||
"properties": {
|
||||
"enable_app_appearance": {
|
||||
"name": "Enable App Appearance Settings",
|
||||
"description": "Enables the hidden App Appearance Setting\nMay not be required on newer Snapchat versions"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "AMOLED Dark Mode",
|
||||
"description": "Enables AMOLED dark mode\nMake sure Snapchats Dark mode is enabled"
|
||||
},
|
||||
"friend_feed_message_preview": {
|
||||
"name": "Friend Feed Message Preview",
|
||||
"description": "Shows a preview of the last messages in the Friend Feed",
|
||||
"properties": {
|
||||
"amount": {
|
||||
"name": "Amount",
|
||||
"description": "The amount of messages to get previewed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"bootstrap_override": {
|
||||
"name": "Bootstrap Override",
|
||||
"description": "Overrides user interface bootstrap settings",
|
||||
"properties": {
|
||||
"app_appearance": {
|
||||
"name": "App Appearance",
|
||||
"description": "Sets a persistent App Appearance"
|
||||
},
|
||||
"home_tab": {
|
||||
"name": "Home Tab",
|
||||
"description": "Overrides the startup tab when opening Snapchat"
|
||||
}
|
||||
}
|
||||
},
|
||||
"map_friend_nametags": {
|
||||
"name": "Enhanced Friend Map Nametags",
|
||||
"description": "Improves the Nametags of friends on the Snapmap"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "Show Streak Expiration Info",
|
||||
"description": "Shows a Streak Expiration timer next to the Streaks counter"
|
||||
},
|
||||
"hide_streak_restore": {
|
||||
"name": "Hide Streak Restore",
|
||||
"description": "Hides the Restore button in the friend feed"
|
||||
},
|
||||
"hide_story_sections": {
|
||||
"name": "Hide Story Section",
|
||||
"description": "Hide certain UI Elements shown in the story section"
|
||||
},
|
||||
"hide_ui_components": {
|
||||
"name": "Hide UI Components",
|
||||
"description": "Select which UI components to hide"
|
||||
},
|
||||
"2d_bitmoji_selfie": {
|
||||
"name": "2D Bitmoji Selfie",
|
||||
"description": "Brings back the 2D Bitmoji selfies from older Snapchat versions\nYou may need to clean the Snapchat cache for this to take effect"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "Disable Spotlight",
|
||||
"description": "Disables the Spotlight page"
|
||||
},
|
||||
"startup_tab": {
|
||||
"name": "Startup Tab",
|
||||
"description": "Change the tab that opens on startup"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "Story Viewer Override",
|
||||
"description": "Turns on certain features which Snapchat hid"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "Friend Feed Menu Buttons",
|
||||
"description": "Select which buttons to show in the Friend Feed Menu Bar"
|
||||
},
|
||||
"friend_feed_menu_position": {
|
||||
"name": "Friend Feed Position Index",
|
||||
"description": "The position of the Friend Feed Menu component"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "Friend Feed Menu Bar",
|
||||
"description": "Enables the new Friend Feed Menu Bar"
|
||||
}
|
||||
}
|
||||
},
|
||||
"messaging": {
|
||||
"name": "Messaging",
|
||||
"description": "Change how you interact with friends",
|
||||
"properties": {
|
||||
"anonymous_story_viewing": {
|
||||
"name": "Anonymous Story Viewing",
|
||||
"description": "Prevents anyone from knowing you've seen their story"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "Hide Bitmoji Presence",
|
||||
"description": "Prevents your Bitmoji from popping up while in Chat"
|
||||
},
|
||||
"hide_typing_notifications": {
|
||||
"name": "Hide Typing Notifications",
|
||||
"description": "Prevents anyone from knowing you're typing a message"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "Unlimited Snap View Time",
|
||||
"description": "Removes the Time Limit for viewing Snaps"
|
||||
},
|
||||
"disable_replay_in_ff": {
|
||||
"name": "Disable Replay in FF",
|
||||
"description": "Disables the ability to replay with a long press from the Friend Feed"
|
||||
},
|
||||
"prevent_message_sending": {
|
||||
"name": "Prevent Message Sending",
|
||||
"description": "Prevents sending certain types of messages"
|
||||
},
|
||||
"snap_to_chat_media": {
|
||||
"name": "Snap to Chat Media",
|
||||
"description": "Converts snaps to chat external media"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "Better Notifications",
|
||||
"description": "Adds more information in received notifications"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "Notification Blacklist",
|
||||
"description": "Select notifications which should get blocked"
|
||||
},
|
||||
"message_logger": {
|
||||
"name": "Message Logger",
|
||||
"description": "Prevents messages from being deleted"
|
||||
},
|
||||
"auto_save_messages_in_conversations": {
|
||||
"name": "Auto Save Messages",
|
||||
"description": "Automatically saves every message in conversations"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "Gallery Media Send Override",
|
||||
"description": "Spoofs the media source when sending from the Gallery"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "Message Preview Length",
|
||||
"description": "Specify the amount of messages to get previewed"
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"name": "Global",
|
||||
"description": "Tweak Global Snapchat Settings",
|
||||
"properties": {
|
||||
"snapchat_plus": {
|
||||
"name": "Snapchat Plus",
|
||||
"description": "Enables Snapchat Plus features\nSome Server-sided features may not work"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "Auto Updater",
|
||||
"description": "Automatically checks for new updates"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "Disable Metrics",
|
||||
"description": "Blocks sending specific analytic data to Snapchat"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "Block Ads",
|
||||
"description": "Prevents Advertisements from being displayed"
|
||||
},
|
||||
"bypass_video_length_restriction": {
|
||||
"name": "Bypass Video Length Restrictions",
|
||||
"description": "Single: sends a single video\nSplit: split videos after editing"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "Disable Google Play Services Dialogs",
|
||||
"description": "Prevent Google Play Services availability dialogs from being shown"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "Force Media Source Quality",
|
||||
"description": "Forces Snapchat's Media Quality to the specified value"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "Disable Snap Splitting",
|
||||
"description": "Prevents Snaps from being split into multiple parts\nPictures you send will turn into videos"
|
||||
}
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"name": "Rules",
|
||||
"description": "Manage Automatic Features for individual people"
|
||||
},
|
||||
"camera": {
|
||||
"name": "Camera",
|
||||
"description": "Adjust the right settings for the perfect snap",
|
||||
"properties": {
|
||||
"disable_camera": {
|
||||
"name": "Disable Camera",
|
||||
"description": "Prevents Snapchat from using the cameras available on your device"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "Immersive Preview",
|
||||
"description": "Prevents Snapchat from Cropping the Camera preview\nThis might cause the camera to flicker on some devices"
|
||||
},
|
||||
"override_preview_resolution": {
|
||||
"name": "Override Preview Resolution",
|
||||
"description": "Overrides the Camera Preview Resolution"
|
||||
},
|
||||
"override_picture_resolution": {
|
||||
"name": "Override Picture Resolution",
|
||||
"description": "Overrides the picture resolution"
|
||||
},
|
||||
"custom_frame_rate": {
|
||||
"name": "Custom Frame Rate",
|
||||
"description": "Overrides the camera frame rate"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "Force Camera Source Encoding",
|
||||
"description": "Forces the camera source encoding"
|
||||
}
|
||||
}
|
||||
},
|
||||
"streaks_reminder": {
|
||||
"name": "Streaks Reminder",
|
||||
"description": "Periodically notifies you about your Streaks",
|
||||
"properties": {
|
||||
"interval": {
|
||||
"name": "Interval",
|
||||
"description": "The interval between each reminder (hours)"
|
||||
},
|
||||
"remaining_hours": {
|
||||
"name": "Remaining Time",
|
||||
"description": "The remaining amount of time before the notification is shown"
|
||||
},
|
||||
"group_notifications": {
|
||||
"name": "Group Notifications",
|
||||
"description": "Group notifications into a single one"
|
||||
}
|
||||
}
|
||||
},
|
||||
"experimental": {
|
||||
"name": "Experimental",
|
||||
"description": "Experimental features",
|
||||
"properties": {
|
||||
"native_hooks": {
|
||||
"name": "Native Hooks",
|
||||
"description": "Unsafe Features that hook into Snapchat's native code",
|
||||
"properties": {
|
||||
"disable_bitmoji": {
|
||||
"name": "Disable Bitmoji",
|
||||
"description": "Disables Friends Profile Bitmoji"
|
||||
},
|
||||
"fix_gallery_media_override": {
|
||||
"name": "Fix Gallery Media Override",
|
||||
"description": "Fixes various issues with the Gallery Media Send Override feature (e.g. Save Snaps in chat)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"spoof": {
|
||||
"name": "Spoof",
|
||||
"description": "Spoof various information about you",
|
||||
"properties": {
|
||||
"location": {
|
||||
"name": "Location",
|
||||
"description": "Spoof your location",
|
||||
"properties": {
|
||||
"location_latitude": {
|
||||
"name": "Latitude",
|
||||
"description": "The latitude of the location"
|
||||
},
|
||||
"location_longitude": {
|
||||
"name": "Longitude",
|
||||
"description": "The longitude of the location"
|
||||
}
|
||||
}
|
||||
},
|
||||
"device": {
|
||||
"name": "Device",
|
||||
"description": "Spoof your device information",
|
||||
"properties": {
|
||||
"fingerprint": {
|
||||
"name": "Device Fingerprint",
|
||||
"description": "Spoofs your device Fingerprint"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "Android ID",
|
||||
"description": "Spoofs your Android ID to the specified value"
|
||||
},
|
||||
"installer_package_name": {
|
||||
"name": "Installer Package name",
|
||||
"description": "Spoofs the installers Package name"
|
||||
},
|
||||
"debug_flag": {
|
||||
"name": "Debug Flag",
|
||||
"description": "Makes Snapchat debuggable"
|
||||
},
|
||||
"mock_location": {
|
||||
"name": "Mock location",
|
||||
"description": "Spoofs the Mock Location device state"
|
||||
},
|
||||
"split_classloader": {
|
||||
"name": "Split Classloader",
|
||||
"description": "Spoofs splitClassloader\nRequested by org.chromium.base.JNIUtils"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "App Passcode",
|
||||
"description": "Sets a passcode to lock the app"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "App Lock On Resume",
|
||||
"description": "Locks the app when it's reopened"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "Infinite Story Boost",
|
||||
"description": "Bypass the Story Boost Limit delay"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "My Eyes Only Passcode Bypass",
|
||||
"description": "Bypass the My Eyes Only passcode\nThis will only work if the passcode has been entered correctly before"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "Unlimited Multi Snap",
|
||||
"description": "Allows you to take an Unlimited Amount of Multi Snaps"
|
||||
},
|
||||
"no_friend_score_delay": {
|
||||
"name": "No Friend Score Delay",
|
||||
"description": "Removes the delay when viewing a Friends Score"
|
||||
},
|
||||
"e2ee": {
|
||||
"name": "End-To-End Encryption",
|
||||
"description": "Encrypts your messages with AES using a shared secret key\nMake sure to save your key somewhere safe!",
|
||||
"properties": {
|
||||
"encrypted_message_indicator": {
|
||||
"name": "Encrypted Message Indicator",
|
||||
"description": "Adds a \uD83D\uDD12 emoji next to encrypted messages"
|
||||
},
|
||||
"force_message_encryption": {
|
||||
"name": "Force Message Encryption",
|
||||
"description": "Prevents sending encrypted messages to people who don't have E2E Encryption enabled only when multiple conversations are selected"
|
||||
}
|
||||
}
|
||||
},
|
||||
"add_friend_source_spoof": {
|
||||
"name": "Add Friend Source Spoof",
|
||||
"description": "Spoofs the source of a Friend Request"
|
||||
},
|
||||
"hidden_snapchat_plus_features": {
|
||||
"name": "Hidden Snapchat Plus Features",
|
||||
"description": "Enables unreleased/beta Snapchat Plus features\nMight not work on older Snapchat versions"
|
||||
}
|
||||
}
|
||||
},
|
||||
"scripting": {
|
||||
"name": "Scripting",
|
||||
"description": "Run custom scripts to extend SnapEnhance",
|
||||
"properties": {
|
||||
"developer_mode": {
|
||||
"name": "Developer Mode",
|
||||
"description": "Shows debug info on Snapchat's UI"
|
||||
},
|
||||
"module_folder": {
|
||||
"name": "Module Folder",
|
||||
"description": "The folder where the scripts are located"
|
||||
},
|
||||
"hot_reload": {
|
||||
"name": "Hot Reload",
|
||||
"description": "Automatically reloads scripts when they change"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"app_appearance": {
|
||||
"always_light": "Always Light",
|
||||
"always_dark": "Always Dark"
|
||||
},
|
||||
"better_notifications": {
|
||||
"chat": "Show chat messages",
|
||||
"snap": "Show media",
|
||||
"reply_button": "Add reply button",
|
||||
"download_button": "Add download button",
|
||||
"group": "Group notifications"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download": "\u2B07\uFE0F Auto Download",
|
||||
"auto_save": "\uD83D\uDCAC Auto Save Messages",
|
||||
"stealth": "\uD83D\uDC7B Stealth Mode",
|
||||
"conversation_info": "\uD83D\uDC64 Conversation Info",
|
||||
"e2e_encryption": "\uD83D\uDD12 Use E2E Encryption"
|
||||
},
|
||||
"path_format": {
|
||||
"create_author_folder": "Create folder for each author",
|
||||
"create_source_folder": "Create folder for each media source type",
|
||||
"append_hash": "Add a unique hash to the file name",
|
||||
"append_source": "Add the media source to the file name",
|
||||
"append_username": "Add the username to the file name",
|
||||
"append_date_time": "Add the date and time to the file name"
|
||||
},
|
||||
"auto_download_sources": {
|
||||
"friend_snaps": "Friend Snaps",
|
||||
"friend_stories": "Friend Stories",
|
||||
"public_stories": "Public Stories",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"logging": {
|
||||
"started": "Started",
|
||||
"success": "Success",
|
||||
"progress": "Progress",
|
||||
"failure": "Failure"
|
||||
},
|
||||
"auto_save_messages_in_conversations": {
|
||||
"NOTE": "Audio Note",
|
||||
"CHAT": "Chat",
|
||||
"EXTERNAL_MEDIA": "External Media",
|
||||
"SNAP": "Snap",
|
||||
"STICKER": "Sticker"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "Screenshot",
|
||||
"chat_screen_record": "Screen Record",
|
||||
"snap_replay": "Snap Replay",
|
||||
"camera_roll_save": "Camera Roll Save",
|
||||
"chat": "Chat",
|
||||
"chat_reply": "Chat Reply",
|
||||
"snap": "Snap",
|
||||
"typing": "Typing",
|
||||
"stories": "Stories",
|
||||
"initiate_audio": "Incoming Audio Call",
|
||||
"abandon_audio": "Missed Audio Call",
|
||||
"initiate_video": "Incoming Video Call",
|
||||
"abandon_video": "Missed Video Call"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "Original",
|
||||
"NOTE": "Audio Note",
|
||||
"SNAP": "Snap",
|
||||
"SAVABLE_SNAP": "Savable Snap"
|
||||
},
|
||||
"hide_ui_components": {
|
||||
"hide_profile_call_buttons": "Remove Profile Call Buttons",
|
||||
"hide_chat_call_buttons": "Remove Chat Call Buttons",
|
||||
"hide_live_location_share_button": "Remove Live Location Share Button",
|
||||
"hide_stickers_button": "Remove Stickers Button",
|
||||
"hide_voice_record_button": "Remove Voice Record Button"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "Off",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "Enable Discover Playback Seekbar",
|
||||
"VERTICAL_STORY_VIEWER": "Enable Vertical Story Viewer"
|
||||
},
|
||||
"hide_story_sections": {
|
||||
"hide_friend_suggestions": "Hide friend suggestions",
|
||||
"hide_friends": "Hide friends section",
|
||||
"hide_suggested": "Hide suggested section",
|
||||
"hide_for_you": "Hide For You section"
|
||||
},
|
||||
"home_tab": {
|
||||
"map": "Map",
|
||||
"chat": "Chat",
|
||||
"camera": "Camera",
|
||||
"discover": "Discover",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"add_friend_source_spoof": {
|
||||
"added_by_username": "By Username",
|
||||
"added_by_mention": "By Mention",
|
||||
"added_by_group_chat": "By Group Chat",
|
||||
"added_by_qr_code": "By QR Code",
|
||||
"added_by_community": "By Community"
|
||||
},
|
||||
"bypass_video_length_restriction": {
|
||||
"single": "Single media",
|
||||
"split": "Split media"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"friend_menu_option": {
|
||||
"preview": "Preview",
|
||||
"stealth_mode": "Stealth Mode",
|
||||
"auto_download_blacklist": "Auto Download Blacklist",
|
||||
"anti_auto_save": "Anti Auto Save"
|
||||
},
|
||||
|
||||
"chat_action_menu": {
|
||||
"preview_button": "Preview",
|
||||
"download_button": "Download",
|
||||
"delete_logged_message_button": "Delete Logged Message"
|
||||
},
|
||||
|
||||
"opera_context_menu": {
|
||||
"download": "Download Media"
|
||||
},
|
||||
|
||||
"modal_option": {
|
||||
"profile_info": "Profile Info",
|
||||
"close": "Close"
|
||||
},
|
||||
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "You can only send one media at a time"
|
||||
},
|
||||
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "expires in {day} days {hour} hours {minute} minutes",
|
||||
"total_messages": "Total sent/received messages: {count}",
|
||||
"title": "Preview",
|
||||
"unknown_user": "Unknown User"
|
||||
},
|
||||
|
||||
"profile_info": {
|
||||
"title": "Profile Info",
|
||||
"first_created_username": "First Created Username",
|
||||
"mutable_username": "Mutable Username",
|
||||
"display_name": "Display Name",
|
||||
"added_date": "Added Date",
|
||||
"birthday": "Birthday : {month} {day}",
|
||||
"friendship": "Friendship",
|
||||
"add_source": "Add Source",
|
||||
"snapchat_plus": "Snapchat Plus",
|
||||
"snapchat_plus_state": {
|
||||
"subscribed": "Subscribed",
|
||||
"not_subscribed": "Not Subscribed"
|
||||
},
|
||||
"friendship_link_type": {
|
||||
"mutual": "Mutual",
|
||||
"outgoing": "Outgoing",
|
||||
"blocked": "Blocked",
|
||||
"deleted": "Deleted",
|
||||
"following": "Following",
|
||||
"suggested": "Suggested",
|
||||
"incoming": "Incoming",
|
||||
"incoming_follower": "Incoming Follower"
|
||||
}
|
||||
},
|
||||
|
||||
"chat_export": {
|
||||
"select_export_format": "Select the Export Format",
|
||||
"select_media_type": "Select Media Types to export",
|
||||
"select_amount_of_messages": "Select the amount of messages to export (leave empty for all)",
|
||||
"select_conversation": "Select a Conversation to export",
|
||||
"dialog_negative_button": "Cancel",
|
||||
"dialog_neutral_button": "Export All",
|
||||
"dialog_positive_button": "Export",
|
||||
"exported_to": "Exported to {path}",
|
||||
"exporting_chats": "Exporting Chats...",
|
||||
"processing_chats": "Processing {amount} conversations...",
|
||||
"export_fail": "Failed to export conversation {conversation}",
|
||||
"writing_output": "Writing output...",
|
||||
"finished": "Done! You now can close this dialog.",
|
||||
"no_messages_found": "No messages found!",
|
||||
"exporting_message": "Exporting {conversation}..."
|
||||
},
|
||||
|
||||
"button": {
|
||||
"ok": "OK",
|
||||
"positive": "Yes",
|
||||
"negative": "No",
|
||||
"cancel": "Cancel",
|
||||
"open": "Open",
|
||||
"download": "Download"
|
||||
},
|
||||
|
||||
"profile_picture_downloader": {
|
||||
"button": "Download Profile Picture",
|
||||
"title": "Profile Picture Downloader",
|
||||
"avatar_option": "Avatar",
|
||||
"background_option": "Background"
|
||||
},
|
||||
|
||||
"download_processor": {
|
||||
"attachment_type": {
|
||||
"snap": "Snap",
|
||||
"sticker": "Sticker",
|
||||
"external_media": "External Media",
|
||||
"note": "Note",
|
||||
"original_story": "Original Story"
|
||||
},
|
||||
"select_attachments_title": "Select attachments to download",
|
||||
"download_started_toast": "Download started",
|
||||
"unsupported_content_type_toast": "Unsupported content type!",
|
||||
"failed_no_longer_available_toast": "Media no longer available",
|
||||
"no_attachments_toast": "No attachments found!",
|
||||
"already_queued_toast": "Media already in queue!",
|
||||
"already_downloaded_toast": "Media already downloaded!",
|
||||
"saved_toast": "Saved to {path}",
|
||||
"download_toast": "Downloading {path}...",
|
||||
"processing_toast": "Processing {path}...",
|
||||
"failed_generic_toast": "Failed to download",
|
||||
"failed_to_create_preview_toast": "Failed to create preview",
|
||||
"failed_processing_toast": "Failed processing {error}",
|
||||
"failed_gallery_toast": "Failed saving to gallery {error}"
|
||||
},
|
||||
|
||||
"streaks_reminder": {
|
||||
"notification_title": "Streaks",
|
||||
"notification_text": "You will lose your Streak with {friend} in {hoursLeft} hours"
|
||||
}
|
||||
}
|
@ -1,684 +0,0 @@
|
||||
{
|
||||
"setup": {
|
||||
"dialogs": {
|
||||
"select_language": "Choisissez votre langue",
|
||||
"save_folder": "SnapEnhance requiert des permissions de stockage pour télécharger et sauvegarder les médias de Snapchat\nChoisissez un emplacement de sauvegarde pour les médias téléchargés",
|
||||
"select_save_folder_button": "Choisir le dossier"
|
||||
},
|
||||
"mappings": {
|
||||
"dialog": "Pour prendre en charge de nombreuses versions de Snapchat de manière dynamique, des mappages sont nécessaires pour que SnapEnhance fonctionne correctement, ce qui ne devrait pas prendre plus de 5 secondes.",
|
||||
"generate_button": "Générer",
|
||||
"generate_failure_no_snapchat": "SnapEnhance n'a pas pu détecter Snapchat, veuillez essayer de réinstaller Snapchat.",
|
||||
"generate_failure": "Une erreur s'est produite lors de la génération des mappings, veuillez réessayer.",
|
||||
"generate_success": "Les mappages ont été générés avec succès."
|
||||
},
|
||||
"permissions": {
|
||||
"dialog": "Pour continuer, vous devez remplir les conditions suivantes :",
|
||||
"notification_access": "Accès aux notifications",
|
||||
"battery_optimization": "Désactiver l'optimisation de la batterie",
|
||||
"request_button": "Autoriser"
|
||||
}
|
||||
},
|
||||
|
||||
"manager": {
|
||||
"routes": {
|
||||
"downloads": "Téléchargements",
|
||||
"features": "Fonctionnalités",
|
||||
"home": "Accueil",
|
||||
"home_debug": "Débug",
|
||||
"home_logs": "Logs",
|
||||
"social": "Social",
|
||||
"plugins": "Plugins"
|
||||
},
|
||||
"sections": {
|
||||
"home": {
|
||||
"logs": {
|
||||
"clear_logs_button": "Effacer les logs",
|
||||
"export_logs_button": "Exporter les logs"
|
||||
}
|
||||
},
|
||||
"downloads": {
|
||||
"empty_download_list": "(vide)"
|
||||
},
|
||||
"features": {
|
||||
"disabled": "Désactivé"
|
||||
},
|
||||
"social": {
|
||||
"rules_title": "Règles",
|
||||
"participants_text": "{count} participants",
|
||||
"not_found": "Introuvable",
|
||||
"streaks_title": "Flammes",
|
||||
"streaks_length_text": "Durée {length}",
|
||||
"streaks_expiration_short": "{hours}h",
|
||||
"streaks_expiration_text": "Expire dans {eta}",
|
||||
"reminder_button": "Activer les rappels"
|
||||
}
|
||||
},
|
||||
"dialogs": {
|
||||
"add_friend": {
|
||||
"title": "Ajouter un ami ou un groupe",
|
||||
"search_hint": "Rechercher",
|
||||
"fetch_error": "Impossible de récupérer la liste de données",
|
||||
"category_groups": "Groupes",
|
||||
"category_friends": "Amis"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"rules": {
|
||||
"modes": {
|
||||
"blacklist": "Mode liste noire",
|
||||
"whitelist": "Mode liste blanche"
|
||||
},
|
||||
"properties": {
|
||||
"auto_download": {
|
||||
"name": "Téléchargement automatique",
|
||||
"description": "Télécharge automatiquement les médias de Snapchat lorsqu'ils sont vus",
|
||||
"options": {
|
||||
"blacklist": "Exclure du téléchargement automatique",
|
||||
"whitelist": "Téléchargement automatique"
|
||||
}
|
||||
},
|
||||
"stealth": {
|
||||
"name": "Mode furtif",
|
||||
"description": "Empêche quiconque de savoir que vous avez ouvert leurs Snaps/Chats et conversations",
|
||||
"options": {
|
||||
"blacklist": "Exclure du mode furtif",
|
||||
"whitelist": "Mode furtif"
|
||||
}
|
||||
},
|
||||
"auto_save": {
|
||||
"name": "Sauvegarde automatique",
|
||||
"description": "Sauvegarde automatiquement les messages de chat lorsqu'ils sont vus",
|
||||
"options": {
|
||||
"blacklist": "Exclure de la sauvegarde automatique",
|
||||
"whitelist": "Sauvegarde automatique"
|
||||
}
|
||||
},
|
||||
"hide_chat_feed": {
|
||||
"name": "Masquer du flux de chat"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"actions": {
|
||||
"clean_snapchat_cache": "Nettoyer le cache de Snapchat",
|
||||
"clear_message_logger": "Effacer le journal des messages",
|
||||
"refresh_mappings": "Rafraîchir les mappages",
|
||||
"open_map": "Ouvrir la carte",
|
||||
"export_chat_messages": "Exporter les messages de chat"
|
||||
},
|
||||
|
||||
"features": {
|
||||
"notices": {
|
||||
"unstable": "\u26A0 Instable",
|
||||
"ban_risk": "\u26A0 Cette fonctionnalité peut entraîner un bannissement",
|
||||
"internal_behavior": "\u26A0 Cette fonctionnalité peut causer des comportements internes inattendus"
|
||||
},
|
||||
"properties": {
|
||||
"downloader": {
|
||||
"name": "Téléchargements",
|
||||
"description": "Télécharger les médias de Snapchat",
|
||||
"properties": {
|
||||
"save_folder": {
|
||||
"name": "Dossier de sauvegarde",
|
||||
"description": "Sélectionnes le dossier dans lequel tous les médias doivent être téléchargés"
|
||||
},
|
||||
"auto_download_sources": {
|
||||
"name": "Sources de téléchargement automatique",
|
||||
"description": "Sélectionnez les sources à télécharger automatiquement"
|
||||
},
|
||||
"prevent_self_auto_download": {
|
||||
"name": "Empêcher l'auto téléchargement de soi-même",
|
||||
"description": "Empêche le téléchargement automatique de vos propres medias"
|
||||
},
|
||||
"path_format": {
|
||||
"name": "Format du chemin du fichier",
|
||||
"description": "Spécifie le format du chemin du fichier"
|
||||
},
|
||||
"allow_duplicate": {
|
||||
"name": "Autoriser les doublons",
|
||||
"description": "Autorise le même média à être téléchargé plusieurs fois"
|
||||
},
|
||||
"merge_overlays": {
|
||||
"name": "Fusionner les snaps contenant des superpositions",
|
||||
"description": "Combine le texte et le média d'un Snap dans un seul fichier"
|
||||
},
|
||||
"force_image_format": {
|
||||
"name": "Forcer le format d'image",
|
||||
"description": "Force les images à être enregistrées dans un format spécifié"
|
||||
},
|
||||
"force_voice_note_format": {
|
||||
"name": "Forcer le format des vocaux",
|
||||
"description": "Force les vocaux à être enregistrés dans un format spécifié"
|
||||
},
|
||||
"download_profile_pictures": {
|
||||
"name": "Télécharger les photos de profil",
|
||||
"description": "Permets de télécharger les photos de profil depuis la page de profil"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "Menu contextuel de téléchargement de chat",
|
||||
"description": "Permets de télécharger des médias d'une conversation en effectuant un appui long sur le message"
|
||||
},
|
||||
"ffmpeg_options": {
|
||||
"name": "Options de FFmpeg",
|
||||
"description": "Spécifie les options de FFmpeg",
|
||||
"properties": {
|
||||
"threads": {
|
||||
"name": "Threads",
|
||||
"description": "Le nombre de threads à utiliser pour le traitement"
|
||||
},
|
||||
"preset": {
|
||||
"name": "Pré-réglages",
|
||||
"description": "Défini la vitesse de traitement"
|
||||
},
|
||||
"constant_rate_factor": {
|
||||
"name": "Facteur de taux constant",
|
||||
"description": "Défini le facteur de taux constant pour l'encodeur vidéo\nDe 0 à 51 pour libx264"
|
||||
},
|
||||
"video_bitrate": {
|
||||
"name": "Débit vidéo",
|
||||
"description": "Défini le débit vidéo (en kbps)"
|
||||
},
|
||||
"audio_bitrate": {
|
||||
"name": "Débit audio",
|
||||
"description": "Défini le débit audio (en kbps)"
|
||||
},
|
||||
"custom_video_codec": {
|
||||
"name": "Codec vidéo personnalisé",
|
||||
"description": "Défini un codec vidéo personnalisé (par exemple libx264)"
|
||||
},
|
||||
"custom_audio_codec": {
|
||||
"name": "Codec audio personnalisé",
|
||||
"description": "Défini un codec audio personnalisé (par exemple aac)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"logging": {
|
||||
"name": "Journalisation",
|
||||
"description": "Affiche des indications éphémères lorsque les médias sont téléchargés"
|
||||
}
|
||||
}
|
||||
},
|
||||
"user_interface": {
|
||||
"name": "Interface utilisateur",
|
||||
"description": "Change l'apparence de Snapchat",
|
||||
"properties": {
|
||||
"enable_app_appearance": {
|
||||
"name": "Activer l'apparence de l'application",
|
||||
"description": "Active le paramètre d'apparence de l'application caché\nPeut ne pas être nécessaire sur les nouvelles versions de Snapchat"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "Mode sombre AMOLED",
|
||||
"description": "Active le mode sombre AMOLED\nAssurez-vous que le mode sombre de Snapchat est activé"
|
||||
},
|
||||
"map_friend_nametags": {
|
||||
"name": "Amélioration des nametags d'amis sur la carte",
|
||||
"description": "Améliore les nametags des amis sur la Snapmap"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "Afficher les informations d'expiration des flammes",
|
||||
"description": "Affiche un chronomètre d'expiration des flammes à côté du compteur de flammes"
|
||||
},
|
||||
"hide_story_sections": {
|
||||
"name": "Masquer les sections des stories",
|
||||
"description": "Masque certains éléments de l'interface utilisateur affichés dans la section des stories"
|
||||
},
|
||||
"hide_ui_components": {
|
||||
"name": "Masquer les composants de l'interface utilisateur",
|
||||
"description": "Sélectionne les composants de l'interface utilisateur à masquer"
|
||||
},
|
||||
"2d_bitmoji_selfie": {
|
||||
"name": "Selfie Bitmoji 2D",
|
||||
"description": "Restaure les selfies Bitmoji 2D des anciennes versions de Snapchat\nVous devrez peut-être nettoyer le cache de Snapchat pour que cela prenne effet"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "Désactiver Spotlight",
|
||||
"description": "Désactive la page Spotlight"
|
||||
},
|
||||
"startup_tab": {
|
||||
"name": "Onglet de démarrage",
|
||||
"description": "Change l'onglet qui s'ouvre au démarrage"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "Remplacement du visionneur de story",
|
||||
"description": "Active certaines fonctionnalités que Snapchat a cachées"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "Boutons du menu contextuel des amis",
|
||||
"description": "Séléctionne les boutons à afficher dans le menu contextuel des amis"
|
||||
},
|
||||
"friend_feed_menu_position": {
|
||||
"name": "Position du menu contextuel des amis",
|
||||
"description": "La position du menu contextuel des amis"
|
||||
}
|
||||
}
|
||||
},
|
||||
"messaging": {
|
||||
"name": "Messagerie",
|
||||
"description": "Change la façon dont vous interagissez avec vos amis",
|
||||
"properties": {
|
||||
"anonymous_story_viewing": {
|
||||
"name": "Visionnage anonyme des stories",
|
||||
"description": "Empêche quiconque de savoir que vous avez vu leur story"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "Masquer la présence Bitmoji",
|
||||
"description": "Empêche votre Bitmoji de s'afficher pendant que vous êtes dans une conversation"
|
||||
},
|
||||
"hide_typing_notifications": {
|
||||
"name": "Masquer les notifications de saisie",
|
||||
"description": "Empêche quiconque de savoir que vous êtes en train de taper un message"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "Temps de visionnage illimité",
|
||||
"description": "Supprime la limite de temps pour visionner les Snaps"
|
||||
},
|
||||
"disable_replay_in_ff": {
|
||||
"name": "Désactiver le revisionnage dans le flux d'amis",
|
||||
"description": "Désactive la possibilité de revisionner avec un appui long depuis le flux d'amis"
|
||||
},
|
||||
"prevent_message_sending": {
|
||||
"name": "Empêcher l'envoi de messages",
|
||||
"description": "Empêche l'envoi de certains types de messages"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "Notifications améliorées",
|
||||
"description": "Ajoute plus d'informations dans les notifications reçues"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "Liste noire des notifications",
|
||||
"description": "Sélectionnez les notifications qui doivent être bloquées"
|
||||
},
|
||||
"message_logger": {
|
||||
"name": "Journal des messages",
|
||||
"description": "Empêche les messages d'être supprimés par l'envoyeur"
|
||||
},
|
||||
"auto_save_messages_in_conversations": {
|
||||
"name": "Sauvegarde automatique des messages",
|
||||
"description": "Sauvegarde automatiquement chaque message dans les conversations"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "Remplacement de l'envoi de médias de la galerie",
|
||||
"description": "Modifie le type de média lors de l'envoi depuis la galerie"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "Longueur de l'aperçu des messages",
|
||||
"description": "Spécifie le nombre de messages à prévisualiser"
|
||||
}
|
||||
}
|
||||
},
|
||||
"global": {
|
||||
"name": "Global",
|
||||
"description": "Change les paramètres globaux de Snapchat",
|
||||
"properties": {
|
||||
"snapchat_plus": {
|
||||
"name": "Snapchat Plus",
|
||||
"description": "Active les fonctionnalités de Snapchat Plus\nCertaines fonctionnalités côté serveur peuvent ne pas fonctionner"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "Désactiver les métriques",
|
||||
"description": "Bloque l'envoi de données analytiques spécifiques à Snapchat"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "Bloquer les publicités",
|
||||
"description": "Empêche l'affichage des publicités"
|
||||
},
|
||||
"disable_video_length_restrictions": {
|
||||
"name": "Désactiver les restrictions de durée des vidéos",
|
||||
"description": "Désactive la restriction de durée maximale des vidéos de Snapchat"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "Désactiver les pop-up Google Play",
|
||||
"description": "Empêche l'affichage des pop-up de disponibilité des services Google Play"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "Forcer la qualité originale des médias",
|
||||
"description": "Force la qualité des médias de Snapchat à la valeur spécifiée"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "Désactiver la division des Snaps",
|
||||
"description": "Empêche les Snaps d'être divisés en plusieurs parties\nLes photos que vous envoyez se transformeront en vidéos"
|
||||
}
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"name": "Règles",
|
||||
"description": "Gérez les fonctionnalités automatiques pour chaque personne"
|
||||
},
|
||||
"camera": {
|
||||
"name": "Caméra",
|
||||
"description": "Ajustez les bons paramètres pour le snap parfait",
|
||||
"properties": {
|
||||
"disable_camera": {
|
||||
"name": "Désactiver la caméra",
|
||||
"description": "Empêche Snapchat d'utiliser les caméras disponibles sur votre appareil"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "Aperçu immersif de la caméra",
|
||||
"description": "Empêche Snapchat de recadrer l'aperçu de la caméra\nCela peut provoquer des scintillements de la caméra sur certains appareils"
|
||||
},
|
||||
"override_preview_resolution": {
|
||||
"name": "Remplacement de la résolution de l'aperçu de la caméra",
|
||||
"description": "Remplace la résolution de l'aperçu de la caméra"
|
||||
},
|
||||
"override_picture_resolution": {
|
||||
"name": "Remplacement de la résolution de l'image",
|
||||
"description": "Remplace la résolution de l'image"
|
||||
},
|
||||
"custom_frame_rate": {
|
||||
"name": "Taux d'image par seconde personnalisé",
|
||||
"description": "Remplace le taux d'image par seconde de la caméra"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "Forcer l'encodage de la source de la caméra",
|
||||
"description": "Force l'encodage de la source de la caméra"
|
||||
}
|
||||
}
|
||||
},
|
||||
"streaks_reminder": {
|
||||
"name": "Rappels des flammes",
|
||||
"description": "Vous rappelle périodiquement vos flammes",
|
||||
"properties": {
|
||||
"interval": {
|
||||
"name": "Intervalle",
|
||||
"description": "L'intervalle entre chaque rappel (heures)"
|
||||
},
|
||||
"remaining_hours": {
|
||||
"name": "Heures restantes",
|
||||
"description": "Le temps restant avant que la notification ne s'affiche"
|
||||
},
|
||||
"group_notifications": {
|
||||
"name": "Regrouper les notifications",
|
||||
"description": "Regroupe les notifications en une seule"
|
||||
}
|
||||
}
|
||||
},
|
||||
"experimental": {
|
||||
"name": "Expérimental",
|
||||
"description": "Active les fonctionnalités expérimentales",
|
||||
"properties": {
|
||||
"native_hooks": {
|
||||
"name": "Hooks natifs",
|
||||
"description": "Fonctionnalités non sûres qui se greffe au code natif de Snapchat",
|
||||
"properties": {
|
||||
"disable_bitmoji": {
|
||||
"name": "Désactiver les Bitmoji",
|
||||
"description": "Désactive les Bitmoji de profil d'amis"
|
||||
},
|
||||
"fix_gallery_media_override": {
|
||||
"name": "Correction de l'envoi de médias de la galerie",
|
||||
"description": "Corrige divers problèmes avec la fonctionnalité d'envoi de médias de la galerie (par exemple, enregistrer les Snaps dans le chat)"
|
||||
}
|
||||
}
|
||||
},
|
||||
"spoof": {
|
||||
"name": "Spoof",
|
||||
"description": "Spoof diverses informations vous concernant",
|
||||
"properties": {
|
||||
"location": {
|
||||
"name": "Localisation",
|
||||
"description": "Spoof votre localisation",
|
||||
"properties": {
|
||||
"location_latitude": {
|
||||
"name": "Latitude",
|
||||
"description": "La latitude de la localisation"
|
||||
},
|
||||
"location_longitude": {
|
||||
"name": "Longitude",
|
||||
"description": "La longitude de la localisation"
|
||||
}
|
||||
}
|
||||
},
|
||||
"device": {
|
||||
"name": "Appareil",
|
||||
"description": "Spoof diverses informations sur votre appareil",
|
||||
"properties": {
|
||||
"fingerprint": {
|
||||
"name": "Empreinte de l'appareil",
|
||||
"description": "Spoof l'empreinte de votre appareil"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "Android ID",
|
||||
"description": "Spoof l'ID Android de votre appareil"
|
||||
},
|
||||
"installer_package_name": {
|
||||
"name": "Nom du package de l'installateur",
|
||||
"description": "Spoof le nom du package de l'installateur"
|
||||
},
|
||||
"debug_flag": {
|
||||
"name": "Debug Flag",
|
||||
"description": "Makes Snapchat debuggable"
|
||||
},
|
||||
"mock_location": {
|
||||
"name": "Mock location",
|
||||
"description": "Spoofs the Mock Location device state"
|
||||
},
|
||||
"split_classloader": {
|
||||
"name": "Split Classloader",
|
||||
"description": "Spoofs splitClassloader\nRequested by org.chromium.base.JNIUtils"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "Code d'accès à l'application",
|
||||
"description": "Défini un code d'accès à l'application"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "Verrouillage de l'application à la reprise",
|
||||
"description": "Verrouille l'application lorsque vous revenez à Snapchat"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "Boost infini des stories",
|
||||
"description": "Contourne le délai de limite de boost de story"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "Contournement du code d'accès My Eyes Only",
|
||||
"description": "Contourne le code d'accès My Eyes Only\nCela ne fonctionnera que si le code d'accès a été entré correctement auparavant"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "Multi Snap illimité",
|
||||
"description": "Vous permet de prendre un nombre illimité de Multi Snaps"
|
||||
},
|
||||
"no_friend_score_delay": {
|
||||
"name": "Pas de délai de snap score d'ami",
|
||||
"description": "Supprime le délai lors de la visualisation du snap score d'un ami"
|
||||
},
|
||||
"add_friend_source_spoof": {
|
||||
"name": "Spoof de la source d'ajout d'ami",
|
||||
"description": "Spoof la source d'une demande d'ami"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"better_notifications": {
|
||||
"chat": "Afficher les messages de chat",
|
||||
"snap": "Afficher les médias de Snap",
|
||||
"reply_button": "Ajouter un bouton de réponse",
|
||||
"download_button": "Ajoouter un bouton de téléchargement",
|
||||
"group": "Grouper les notifications"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download": "\u2B07\uFE0F Téléchargement automatique",
|
||||
"auto_save": "\uD83D\uDCAC Sauvegarde automatique",
|
||||
"stealth": "\uD83D\uDC7B Mode furtif",
|
||||
"conversation_info": "\uD83D\uDC64 Informations de la conversation"
|
||||
},
|
||||
"path_format": {
|
||||
"create_author_folder": "Créer un dossier pour chaque auteur",
|
||||
"create_source_folder": "Créer un dossier pour chaque type de source de média",
|
||||
"append_hash": "Ajouter un hash unique au nom du fichier",
|
||||
"append_source": "Ajouter la source du média au nom du fichier",
|
||||
"append_username": "Ajouter le nom d'utilisateur au nom du fichier",
|
||||
"append_date_time": "Ajouter la date et l'heure au nom du fichier"
|
||||
},
|
||||
"auto_download_sources": {
|
||||
"friend_snaps": "Snaps d'amis",
|
||||
"friend_stories": "Stories d'amis",
|
||||
"public_stories": "Stories publiques",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"logging": {
|
||||
"started": "Au lancement",
|
||||
"success": "Succès",
|
||||
"progress": "En cours",
|
||||
"failure": "Échec"
|
||||
},
|
||||
"auto_save_messages_in_conversations": {
|
||||
"NOTE": "Messages vocaux",
|
||||
"CHAT": "Messages de chat",
|
||||
"EXTERNAL_MEDIA": "Médias externes",
|
||||
"SNAP": "Snaps",
|
||||
"STICKER": "Stickers"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "Capture d'écran de chat",
|
||||
"chat_screen_record": "Enregistrement d'écran de chat",
|
||||
"camera_roll_save": "Sauvegarde de la pellicule",
|
||||
"chat": "Chat",
|
||||
"chat_reply": "Réponse de chat",
|
||||
"snap": "Snap",
|
||||
"typing": "Saisie",
|
||||
"stories": "Stories",
|
||||
"initiate_audio": "Appel audio entrant",
|
||||
"abandon_audio": "Appel audio manqué",
|
||||
"initiate_video": "Appel vidéo entrant",
|
||||
"abandon_video": "Appel vidéo manqué"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "Contenu original",
|
||||
"NOTE": "Message vocal",
|
||||
"SNAP": "Snap",
|
||||
"SAVABLE_SNAP": "Snap sauvegardable"
|
||||
},
|
||||
"hide_ui_components": {
|
||||
"hide_call_buttons": "Supprimer les boutons d'appel",
|
||||
"hide_cognac_button": "Supprimer le bouton Cognac",
|
||||
"hide_live_location_share_button": "Supprimer le bouton de partage de la position en direct",
|
||||
"hide_stickers_button": "Supprimer le bouton des stickers",
|
||||
"hide_voice_record_button": "Supprimer le bouton d'enregistrement vocal"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "Désactivé",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "Activer la barre de lecture dans Discover",
|
||||
"VERTICAL_STORY_VIEWER": "Activer le visionneur de story vertical"
|
||||
},
|
||||
"hide_story_sections": {
|
||||
"hide_friend_suggestions": "Masquer la section des suggestions d'amis",
|
||||
"hide_friends": "Masquer la section des amis",
|
||||
"hide_following": "Masquer la section des abonnements",
|
||||
"hide_for_you": "Masquer la section Pour vous"
|
||||
},
|
||||
"startup_tab": {
|
||||
"ngs_map_icon_container": "Snapmap",
|
||||
"ngs_chat_icon_container": "Chat",
|
||||
"ngs_camera_icon_container": "Caméra",
|
||||
"ngs_community_icon_container": "Communauté / Stories",
|
||||
"ngs_spotlight_icon_container": "Spotlight",
|
||||
"ngs_search_icon_container": "Recherche"
|
||||
},
|
||||
"add_friend_source_spoof": {
|
||||
"added_by_username": "Par nom d'utilisateur",
|
||||
"added_by_mention": "Par mention",
|
||||
"added_by_group_chat": "Par group d'amis",
|
||||
"added_by_qr_code": "Par QR code",
|
||||
"added_by_community": "Par communauté"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"friend_menu_option": {
|
||||
"preview": "Aperçu"
|
||||
},
|
||||
|
||||
"chat_action_menu": {
|
||||
"preview_button": "Aperçu",
|
||||
"download_button": "Télécharger",
|
||||
"delete_logged_message_button": "Supprimer le message enregistré"
|
||||
},
|
||||
|
||||
"opera_context_menu": {
|
||||
"download": "Télécharger"
|
||||
},
|
||||
|
||||
"modal_option": {
|
||||
"profile_info": "Informations du profil",
|
||||
"close": "Fermer"
|
||||
},
|
||||
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "Vous ne pouvez envoyer qu'un seul média à la fois"
|
||||
},
|
||||
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "Expire dans {day} jours {hour} heures {minute} minutes",
|
||||
"total_messages": "Total des messages envoyés/reçus : {count}",
|
||||
"title": "Aperçu de la conversation",
|
||||
"unknown_user": "Utilisateur inconnu"
|
||||
},
|
||||
|
||||
"profile_info": {
|
||||
"title": "Informations du profil",
|
||||
"username": "Nom d'utilisateur",
|
||||
"display_name": "Nom d'affichage",
|
||||
"added_date": "Date d'ajout",
|
||||
"birthday": "Anniversaire : {day} {month}"
|
||||
},
|
||||
|
||||
"chat_export": {
|
||||
"select_export_format": "Sélectionnez le format d'exportation",
|
||||
"select_media_type": "Sélectionnez le type de média",
|
||||
"select_amount_of_messages": "Sélectionnez la quantité de messages à exporter (laissez vide pour tout)",
|
||||
"select_conversation": "Sélectionnez la conversation à exporter",
|
||||
"dialog_negative_button": "Annuler",
|
||||
"dialog_neutral_button": "Exporter tout",
|
||||
"dialog_positive_button": "Exporter",
|
||||
"exported_to": "Exporté vers {path}",
|
||||
"exporting_chats": "Exportation des conversations...",
|
||||
"processing_chats": "Traitement de {amount} conversations...",
|
||||
"export_fail": "Échec de l'exportation de la conversation {conversation}",
|
||||
"writing_output": "Écriture du fichier de sortie...",
|
||||
"finished": "Terminé ! Vous pouvez maintenant fermer cette fenêtre.",
|
||||
"no_messages_found": "Aucun message trouvé",
|
||||
"exporting_message": "Exportation de {conversation}..."
|
||||
},
|
||||
|
||||
"button": {
|
||||
"ok": "OK",
|
||||
"positive": "Oui",
|
||||
"negative": "Non",
|
||||
"cancel": "Annuler",
|
||||
"open": "Ouvrir",
|
||||
"download": "Télécharger"
|
||||
},
|
||||
|
||||
"profile_picture_downloader": {
|
||||
"button": "Télécharger la photo de profil",
|
||||
"title": "Télécharger la photo de profil",
|
||||
"avatar_option": "Avatar",
|
||||
"background_option": "Arrière-plan"
|
||||
},
|
||||
|
||||
"download_processor": {
|
||||
"download_started_toast": "Téléchargement démarré",
|
||||
"unsupported_content_type_toast": "Type de contenu non pris en charge",
|
||||
"failed_no_longer_available_toast": "Le média n'est plus disponible",
|
||||
"already_queued_toast": "Média déjà en file d'attente",
|
||||
"already_downloaded_toast": "Média déjà téléchargé",
|
||||
"saved_toast": "Sauvegardé dans {path}",
|
||||
"download_toast": "Téléchargement de {path}...",
|
||||
"processing_toast": "Traitement de {path}...",
|
||||
"failed_generic_toast": "Échec du téléchargement",
|
||||
"failed_to_create_preview_toast": "Échec de la création de l'aperçu",
|
||||
"failed_processing_toast": "Échec du traitement {error}",
|
||||
"failed_gallery_toast": "Échec de l'enregistrement dans la galerie {error}"
|
||||
},
|
||||
|
||||
"streaks_reminder": {
|
||||
"notification_title": "Flammes",
|
||||
"notification_text": "Vous allez perdre vos flammes avec {friend} dans {hoursLeft} heures"
|
||||
}
|
||||
}
|
@ -1,447 +0,0 @@
|
||||
{
|
||||
"category": {
|
||||
"spying_privacy": "जासूसी और गोपनीयता",
|
||||
"media_manager": "मीडिया प्रबंधक",
|
||||
"ui_tweaks": "यूआई और ट्वीक्स",
|
||||
"camera": "कैमरा",
|
||||
"updates": "अपडेट",
|
||||
"experimental_debugging": "प्रायोगिक"
|
||||
},
|
||||
"action": {
|
||||
"clean_cache": "कैश साफ़ करें",
|
||||
"clear_message_logger": "संदेश लॉगर साफ़ करें",
|
||||
"refresh_mappings": "मैपिंग रीफ़्रेश करें",
|
||||
"open_map": "मैप पर स्थान चुनें",
|
||||
"check_for_updates": "अपडेट जाँचें",
|
||||
"export_chat_messages": "चैट संदेश निर्यात करें"
|
||||
},
|
||||
"property": {
|
||||
"message_logger": {
|
||||
"name": "मैसेज लॉगर",
|
||||
"description": "संदेशों को हटाने से रोकता है"
|
||||
},
|
||||
"prevent_read_receipts": {
|
||||
"name": "पठित प्राप्ति रोकें",
|
||||
"description": "किसी को न बताएं कि आपने उनके स्नैप्स खोले हैं"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "बिटमोजी मौजूदगी छिपाएं",
|
||||
"description": "अपनी बिटमोजी मौजूदगी को चैट से छिपाएं"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "बेहतर अधिसूचनाएँ",
|
||||
"description": "अधिसूचनाओं में अधिक जानकारी दिखाएं"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "अधिसूचना ब्लैकलिस्ट",
|
||||
"description": "चयनित अधिसूचना प्रकार को छिपाएं"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "मैट्रिक्स अक्षम करें",
|
||||
"description": "Snapchat को भेजे जाने वाले मैट्रिक्स को अक्षम करें"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "विज्ञापन रोकें",
|
||||
"description": "विज्ञापनों को प्रदर्शित होने से रोकें"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "असीमित स्नैप देखें समय",
|
||||
"description": "स्नैप्स को देखने के लिए समय सीमा को हटा देता है"
|
||||
},
|
||||
"prevent_sending_messages": {
|
||||
"name": "संदेश भेजना रोकें",
|
||||
"description": "कुछ प्रकार के संदेश भेजना रोके"
|
||||
},
|
||||
"anonymous_story_view": {
|
||||
"name": "गुमनाम कहानी देखें",
|
||||
"description": "किसी को न बताएं कि आपने उनकी कहानी देखी है"
|
||||
},
|
||||
"hide_typing_notification": {
|
||||
"name": "टाइप करने की सूचना छिपाएं",
|
||||
"description": "टाइप करने की सूचनाएँ भेजने से रोकें"
|
||||
},
|
||||
"save_folder": {
|
||||
"name": "सहेजें फ़ोल्डर",
|
||||
"description": "सभी मीडिया को सहेजा जाने वाला निर्देशिका"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"name": "ऑटो डाउनलोड विकल्प",
|
||||
"description": "ऑटो डाउनलोड करने के लिए मीडिया का चयन करें"
|
||||
},
|
||||
"download_options": {
|
||||
"name": "डाउनलोड विकल्प",
|
||||
"description": "फ़ाइल पथ प्रारूप निर्दिष्ट करें"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "चैट डाउनलोड संदर्भ मेनू",
|
||||
"description": "चैट डाउनलोड संदर्भ मेनू को सक्षम करें"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "गैलरी मीडिया भेजें ओवरराइड",
|
||||
"description": "गैलरी से भेजे गए मीडिया को ओवरराइड करें"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"name": "ऑटो संदेश सहेजें",
|
||||
"description": "ऑटो सहेजने के लिए संदेश का प्रकार चुनें"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "मीडिया स्रोत गुणवत्ता को मजबूत करें",
|
||||
"description": "मीडिया स्रोत क्वालिटी को ओवरराइड करें"
|
||||
},
|
||||
"download_logging": {
|
||||
"name": "डाउनलोड लॉग करे",
|
||||
"description": "जब डाउनलोड हो रहा हो तब टोस्ट दिखाए"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "दोस्त फ़ीड मेनू बार सक्षम करें",
|
||||
"description": "नए दोस्त फ़ीड मेनू बार को सक्षम करें"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "दोस्त फ़ीड मेनू बटन",
|
||||
"description": "दोस्त फ़ीड मेनू बार में दिखाए जाने वाले बटन का चयन करें"
|
||||
},
|
||||
"friend_feed_menu_buttons_position": {
|
||||
"name": "दोस्त फ़ीड बटन स्थान सूचकांक",
|
||||
"description": "दोस्त फ़ीड मेनू बटन का स्थान सूचकांक"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"name": "यूआई तत्व छिपाएं",
|
||||
"description": "छिपाने के लिए यूआई तत्व का चयन करें"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"name": "स्टोरी खंड छिपाएं",
|
||||
"description": "स्टोरी खंड में दिखाए जाने वाले कुछ यूआई तत्वों को छिपाएं"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "स्टोरी देखने वाले को ओवरराइड करें",
|
||||
"description": "Snapchat द्वारा छिपाए गए कुछ सुविधाओं को सक्षम करें"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "स्ट्रीक समाप्ति जानकारी दिखाएं",
|
||||
"description": "स्ट्रीक के पास स्ट्रीक समाप्ति जानकारी दिखाएं"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "स्नैप स्प्लिटिंग अक्षम करें",
|
||||
"description": "स्नैप को एकाधिक भागों में विभाजित होने से रोकें"
|
||||
},
|
||||
"disable_video_length_restriction": {
|
||||
"name": "वीडियो लंबाई प्रतिबंध को अक्षम करें",
|
||||
"description": "वीडियो लंबाई प्रतिबंध को अक्षम करता है"
|
||||
},
|
||||
"snapchat_plus": {
|
||||
"name": "स्नैपचैट प्लस",
|
||||
"description": "स्नैपचैट प्लस सुविधाओं को सक्षम करता है"
|
||||
},
|
||||
"new_map_ui": {
|
||||
"name": "नई मानचित्र UI",
|
||||
"description": "नई मानचित्र UI को सक्षम करता है"
|
||||
},
|
||||
"location_spoof": {
|
||||
"name": "स्नैपमैप स्थान स्पूफ़र",
|
||||
"description": "स्नैपमैप पर अपने स्थान को स्पूफ़ करता है"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "संदेश पूर्वावलोकन लंबाई",
|
||||
"description": "पूर्वावलोकित किए जाने वाले संदेशों की मात्रा निर्दिष्ट करें"
|
||||
},
|
||||
"unlimited_conversation_pinning": {
|
||||
"name": "असीमित बातचीत पिन करना",
|
||||
"description": "असीमित बातचीत पिन करने की क्षमता को सक्षम करता है"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "स्पॉटलाइट को अक्षम करें",
|
||||
"description": "स्पॉटलाइट पेज को अक्षम करता है"
|
||||
},
|
||||
"enable_app_appearance": {
|
||||
"name": "ऐप उपस्थिति सेटिंग को सक्षम करें",
|
||||
"description": "छिपे हुए ऐप उपस्थिति सेटिंग को सक्षम करता है"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"name": "स्टार्टअप पेज को बदले",
|
||||
"description": "स्टार्टअप पेज को बदले"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "गूगल प्ले सर्विसेज़ की चेतावनी को रोके",
|
||||
"description": "गूगल प्ले सर्विसेज़ की उपलब्धता संवादों को दिखने से रोकें"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "ऑटो अपडेटर",
|
||||
"description": "अपडेट के लिए जांच करने का अंतराल"
|
||||
},
|
||||
"disable_camera": {
|
||||
"name": "कैमरा को अक्षम करें",
|
||||
"description": "स्नैपचैट को कैमरा का उपयोग करने से रोकता है"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "विस्मरणीय कैमरा पूर्वावलोकन",
|
||||
"description": "स्नैपचैट को कैमरा पूर्वावलोकन कट करने से रोकता है"
|
||||
},
|
||||
"preview_resolution": {
|
||||
"name": "पूर्वावलोकन रेज़ोल्यूशन",
|
||||
"description": "कैमरा पूर्वावलोकन रेज़ोल्यूशन को ओवरराइड करता है"
|
||||
},
|
||||
"picture_resolution": {
|
||||
"name": "तस्वीर का रेज़ोल्यूशन",
|
||||
"description": "तस्वीर का रेज़ोल्यूशन ओवरराइड करता है"
|
||||
},
|
||||
"force_highest_frame_rate": {
|
||||
"name": "सर्वोच्च फ्रेम दर को मजबूत करें",
|
||||
"description": "सर्वाधिक संभव फ्रेम दर को मजबूत करता है"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "कैमरा स्रोत कोडिंग को मजबूत करें",
|
||||
"description": "कैमरा स्रोत कोडिंग को मजबूत करता है"
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "ऐप पासकोड सेट करें",
|
||||
"description": "ऐप को लॉक करने के लिए पासकोड सेट करता है"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "ऐप लॉक ऑन रिज़्यूम",
|
||||
"description": "ऐप को दोबारा खोलने पर लॉक करता है"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "अनंत कहानी बढ़ावा",
|
||||
"description": "अपनी कहानी को अनंत बढ़ाएं"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "मेरी आंखों के लिए पासकोड बाईपास",
|
||||
"description": "मेरी आंखों के लिए पासकोड बाईपास करें\nयह केवल तब काम करेगा जब पासकोड सही तरीके से दर्ज किया गया हो"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "AMOLED डार्क मोड",
|
||||
"description": "AMOLED डार्क मोड को सक्षम करता है\nसुनिश्चित करें कि स्नैपचैट का डार्क मोड सक्षम है"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "अनलिमिटेड मल्टी स्नैप भेजे",
|
||||
"description": "आपको अनलिमिटेड मल्टी स्नैप भेजने दे"
|
||||
},
|
||||
"device_spoof": {
|
||||
"name": "डिवाइस की वैल्यू बदले",
|
||||
"description": "डिवाइस की वैल्यू छुपाये"
|
||||
},
|
||||
"device_fingerprint": {
|
||||
"name": "डिवाइस की फिंगगर्प्रिन्ट",
|
||||
"description": "डिवाइस की फिंगगर्प्रिन्ट बदले"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "एंड्रॉयड आइडी",
|
||||
"description": "एंड्रॉयड की आइडी बदले"
|
||||
}
|
||||
},
|
||||
"option": {
|
||||
"property": {
|
||||
"better_notifications": {
|
||||
"chat": "चैट संदेश दिखाएं",
|
||||
"snap": "मीडिया दिखाएं",
|
||||
"reply_button": "जवाब बटन जोड़ें",
|
||||
"download_button": "डाउनलोड बटन ऐड करे"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download_blacklist": "⬇️ ऑटो डाउनलोड ब्लैकलिस्ट",
|
||||
"anti_auto_save": "💬 आंतरिक ऑटो सेव संदेश",
|
||||
"stealth_mode": "👻 स्टेल्थ मोड",
|
||||
"conversation_info": "👤 वार्तालाप जानकारी"
|
||||
},
|
||||
"download_options": {
|
||||
"allow_duplicate": "डुप्लिकेट डाउनलोड स्वीकार करें",
|
||||
"create_user_folder": "प्रत्येक उपयोगकर्ता के लिए फ़ोल्डर बनाएं",
|
||||
"append_hash": "फ़ाइल नाम में एक अद्वितीय हैश जोड़ें",
|
||||
"append_username": "फ़ाइल नाम में उपयोगकर्ता नाम जोड़ें",
|
||||
"append_date_time": "फ़ाइल नाम में तिथि और समय जोड़ें",
|
||||
"append_type": "फ़ाइल नाम में मीडिया प्रकार जोड़ें",
|
||||
"merge_overlay": "स्नैप छवि ओवरले मर्ज करें"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"friend_snaps": "मित्र स्नैप्स",
|
||||
"friend_stories": "मित्र की कहानियाँ",
|
||||
"public_stories": "सार्वजनिक कहानियाँ",
|
||||
"spotlight": "स्पॉटलाइट"
|
||||
},
|
||||
"download_logging": {
|
||||
"started": "शुरू हो गया",
|
||||
"success": "सफलता",
|
||||
"progress": "प्रगति",
|
||||
"failure": "असफलता"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"NOTE": "ऑडियो नोट",
|
||||
"CHAT": "चैट",
|
||||
"EXTERNAL_MEDIA": "बाहरी मीडिया",
|
||||
"SNAP": "स्नैप",
|
||||
"STICKER": "स्टिकर"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "स्क्रीनशॉट",
|
||||
"chat_screen_record": "स्क्रीन रिकॉर्ड",
|
||||
"camera_roll_save": "कैमरा में सेव करे",
|
||||
"chat": "चैट",
|
||||
"chat_reply": "चैट रिप्लाइ",
|
||||
"snap": "स्नैप",
|
||||
"typing": "टायपिंग",
|
||||
"stories": "स्टोरीस",
|
||||
"initiate_audio": "इनकमिंग ऑडियो कॉल",
|
||||
"abandon_audio": "छूटी हुई ऑडियो कॉल",
|
||||
"initiate_video": "इनकमिंग वीडियो कॉल",
|
||||
"abandon_video": "छूटी हुई विडिओ कॉल"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "मूल",
|
||||
"NOTE": "ऑडियो नोट",
|
||||
"SNAP": "स्नैप",
|
||||
"LIVE_SNAP": "ऑडियो के साथ स्नैप"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"remove_call_buttons": "कॉल बटन हटाएं",
|
||||
"remove_cognac_button": "कोग्नाक बटन हटाएं",
|
||||
"remove_live_location_share_button": "लाइव स्थान साझा करने वाला बटन हटाएं",
|
||||
"remove_stickers_button": "स्टिकर बटन हटाएं",
|
||||
"remove_voice_record_button": "आवाज रिकॉर्ड बटन हटाएं",
|
||||
"remove_camera_borders": "कैमरा सीमाओं को हटाएं"
|
||||
},
|
||||
"auto_updater": {
|
||||
"DISABLED": "अक्षम",
|
||||
"EVERY_LAUNCH": "हर लॉन्च पर",
|
||||
"DAILY": "रोज़ाना",
|
||||
"WEEKLY": "साप्ताहिक"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "बंद",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "डिस्कवर प्लेबैक सीकबार सक्षम करें",
|
||||
"VERTICAL_STORY_VIEWER": "वर्टिकल स्टोरी व्यूअर सक्षम करें"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"hide_friend_suggestions": "मित्र सेक्शन छिपाएं",
|
||||
"hide_friends": "मित्र सेक्शन छिपाएं",
|
||||
"hide_following": "फ़ॉलोइंग सेक्शन छिपाएं",
|
||||
"hide_for_you": "आपके लिए सेक्शन छिपाएं"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"OFF": "बंद",
|
||||
"ngs_map_icon_container": "मैप",
|
||||
"ngs_chat_icon_container": "चैट",
|
||||
"ngs_camera_icon_container": "कैमरा",
|
||||
"ngs_community_icon_container": "समुदाय / स्टोरीस",
|
||||
"ngs_spotlight_icon_container": "स्पॉटलाइट",
|
||||
"ngs_search_icon_container": "ढुंढे"
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_menu_option": {
|
||||
"preview": "पूर्वावलोकन",
|
||||
"stealth_mode": "छिपे हुए मोड",
|
||||
"auto_download_blacklist": "ऑटो डाउनलोड ब्लैकलिस्ट",
|
||||
"anti_auto_save": "ऑटो सेव के खिलाफ"
|
||||
},
|
||||
"message_context_menu_option": {
|
||||
"download": "डाउनलोड करें",
|
||||
"preview": "पूर्वावलोकन"
|
||||
},
|
||||
"chat_action_menu": {
|
||||
"preview_button": "पूर्वावलोकन",
|
||||
"download_button": "डाउनलोड करें",
|
||||
"delete_logged_message_button": "लॉग किए गए संदेश को हटाएं"
|
||||
},
|
||||
"opera_context_menu": {
|
||||
"download": "मीडिया डाउनलोड करें"
|
||||
},
|
||||
"modal_option": {
|
||||
"profile_info": "प्रोफ़ाइल जानकारी",
|
||||
"close": "बंद करें"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "एक बार में बस 1 मीडिया भेज सकते है"
|
||||
},
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "{day} दिन {hour} घंटे {minute} मिनट में समाप्त होता है",
|
||||
"total_messages": "कुल मिल के भेजे/मिले मेसेजेस: {count}",
|
||||
"title": "पूर्वावलोकन",
|
||||
"unknown_user": "अज्ञात उपयोगकर्ता"
|
||||
},
|
||||
"profile_info": {
|
||||
"title": "प्रोफ़ाइल जानकारी",
|
||||
"username": "उपयोगकर्ता नाम",
|
||||
"display_name": "प्रदर्शित नाम",
|
||||
"added_date": "जोड़ने की तारीख",
|
||||
"birthday": "जन्मदिन: {month} {day}"
|
||||
},
|
||||
"auto_updater": {
|
||||
"no_update_available": "कोई अद्यतन उपलब्ध नहीं है!",
|
||||
"dialog_title": "नया अद्यतन उपलब्ध है!",
|
||||
"dialog_message": "SnapEnhance के लिए एक नया अद्यतन उपलब्ध है! ({version})\n\n{body}",
|
||||
"dialog_positive_button": "डाउनलोड और स्थापित करें",
|
||||
"dialog_negative_button": "रद्द करें",
|
||||
"downloading_toast": "अद्यतन डाउनलोड हो रहा है...",
|
||||
"download_manager_notification_title": "SnapEnhance APK डाउनलोड हो रहा है..."
|
||||
},
|
||||
"chat_export": {
|
||||
"select_export_format": "निर्यात प्रारूप का चयन करें",
|
||||
"select_media_type": "निर्यात करने के लिए मीडिया प्रकार का चयन करें",
|
||||
"select_conversation": "निर्यात करने के लिए एक बातचीत का चयन करें",
|
||||
"dialog_negative_button": "रद्द करें",
|
||||
"dialog_neutral_button": "सभी निर्यात करें",
|
||||
"dialog_positive_button": "निर्यात करें",
|
||||
"exported_to": "{path} में निर्यात किया गया",
|
||||
"exporting_chats": "बातचीत निर्यात कर रहा है...",
|
||||
"processing_chats": "{amount} बातचीतों का प्रसंस्करण कर रहा है...",
|
||||
"export_fail": "बातचीत {conversation} को निर्यात करने में विफल रहा",
|
||||
"writing_output": "आउटपुट लिख रहा है...",
|
||||
"finished": "तैयार हो गया! अब आप इस संवाद बॉक्स को बंद कर सकते हैं।",
|
||||
"no_messages_found": "कोई संदेश नहीं मिले!",
|
||||
"exporting_message": "{conversation} को निर्यात कर रहा है..."
|
||||
},
|
||||
"button": {
|
||||
"ok": "ठीक है",
|
||||
"positive": "हाँ",
|
||||
"negative": "नहीं",
|
||||
"cancel": "रद्द करें",
|
||||
"open": "खोलें"
|
||||
},
|
||||
"download_manager_activity": {
|
||||
"remove_all_title": "सभी डाउनलोड हटाएं",
|
||||
"remove_all_text": "क्या आप इसे करना चाहते हैं?",
|
||||
"remove_all": "सभी हटाएं",
|
||||
"no_downloads": "कोई डाउनलोड नहीं",
|
||||
"cancel": "रद्द करें",
|
||||
"file_not_found_toast": "फ़ाइल मौजूद नहीं है!",
|
||||
"category": {
|
||||
"all_category": "सभी",
|
||||
"pending_category": "अपूर्ण",
|
||||
"snap_category": "स्नैप",
|
||||
"story_category": "कहानी",
|
||||
"spotlight_category": "स्पॉटलाइट"
|
||||
},
|
||||
"debug_settings": "डीबग सेटिंग्स",
|
||||
"debug_settings_page": {
|
||||
"clear_file_title": "{file_name} फ़ाइल को साफ़ करें",
|
||||
"clear_file_confirmation": "क्या आप वाकई {file_name} फ़ाइल को साफ़ करना चाहते हैं?",
|
||||
"clear_cache_title": "कैश को साफ़ करें",
|
||||
"reset_all_title": "सभी सेटिंग्स रीसेट करें",
|
||||
"reset_all_confirmation": "क्या आप वाकई सभी सेटिंग्स को रीसेट करना चाहते हैं?",
|
||||
"success_toast": "सफलता!",
|
||||
"device_spoofer": "डिवाइस छुपाये"
|
||||
}
|
||||
},
|
||||
"download_processor": {
|
||||
"download_started_toast": "डाउनलोड शुरू...",
|
||||
"unsupported_content_type_toast": "असमर्थित फ़ाइल प्रकार!",
|
||||
"failed_no_longer_available_toast": "यह मीडिया अब उपलब्ध नहीं है",
|
||||
"already_queued_toast": "मीडिया पहले से कतार में है!",
|
||||
"already_downloaded_toast": "मीडिया पहले से डाउनलोड हो चुका है!",
|
||||
"saved_toast": "सवेड तु {path}",
|
||||
"download_toast": "डोनलोडिंग टू {path}...",
|
||||
"processing_toast": "प्रोसेसिंग {path}...",
|
||||
"failed_generic_toast": "डाउनलोड करने में असफल",
|
||||
"failed_to_create_preview_toast": "प्रीव्यू करने में असफल",
|
||||
"failed_processing_toast": "संसाधित करने में असफल {error}",
|
||||
"failed_gallery_toast": "गॅलरी में सेव करने में असफल {error}"
|
||||
},
|
||||
"config_activity": {
|
||||
"title": "SnapEnhance सेटिंग्स",
|
||||
"selected_text": "{count} चयनित",
|
||||
"invalid_number_toast": "अमान्य संख्या!"
|
||||
},
|
||||
"spoof_activity": {
|
||||
"title": "स्पूफ सेटिंग्स"
|
||||
}
|
||||
}
|
@ -1,447 +0,0 @@
|
||||
{
|
||||
"category": {
|
||||
"spying_privacy": "Kémkedés & Adatvédelem",
|
||||
"media_manager": "Médiakezelő",
|
||||
"ui_tweaks": "Felhasználói felület és Módosítások",
|
||||
"camera": "Kamera",
|
||||
"updates": "Frissítések",
|
||||
"experimental_debugging": "Kísérleti"
|
||||
},
|
||||
"action": {
|
||||
"clean_cache": "Gyorsítótár Törlése",
|
||||
"clear_message_logger": "Üzenetnapló Törlése",
|
||||
"refresh_mappings": "Hozzárendelések frissítése",
|
||||
"open_map": "Válassz egy helyet a térképen",
|
||||
"check_for_updates": "Frissítések keresése",
|
||||
"export_chat_messages": "Chat üzenetek exportálása"
|
||||
},
|
||||
"property": {
|
||||
"message_logger": {
|
||||
"name": "Üzenetnapló",
|
||||
"description": "Megakadályozza az üzenetek törlését"
|
||||
},
|
||||
"prevent_read_receipts": {
|
||||
"name": "Olvasási Visszaigazolások Megakadályozása",
|
||||
"description": "Megakadályozhatja, hogy bárki megtudja, hogy megnyitottad a Snapjeiket"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "Bitmojik elrejtése",
|
||||
"description": "Elrejti a Bitmojidat a beszélgetésből"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "Jobb Értesítések",
|
||||
"description": "Több információt mutat az értesítésekben"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "Értesítési Tiltólista",
|
||||
"description": "Elrejti a kiválasztott típusú értesítéseket"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "Mérések letiltása",
|
||||
"description": "Letiltja a Snapchatnek küldött adatokat"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "Hirdetések Blokkolása",
|
||||
"description": "Letiltja a megjelenő hirdetéseket"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "Korlátlan Snap Megtekintés",
|
||||
"description": "Eltávolítja a Snap megtekintési időkorlátot"
|
||||
},
|
||||
"prevent_sending_messages": {
|
||||
"name": "Üzenetek Küldésének Megakadályozása",
|
||||
"description": "Megakadályozza bizonyos típusú üzenenetek küldését"
|
||||
},
|
||||
"anonymous_story_view": {
|
||||
"name": "Anonim Story nézés",
|
||||
"description": "Megakadályozza, hogy megtudják, hogy láttad a történetüket"
|
||||
},
|
||||
"hide_typing_notification": {
|
||||
"name": "Gépelési értesítés elrejtése",
|
||||
"description": "Megakadályozza a gépelési értesítések küldését"
|
||||
},
|
||||
"save_folder": {
|
||||
"name": "Letöltések mappa",
|
||||
"description": "A mappa, ahová az összes médiát lemented"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"name": "Automatikus letöltési beállítások",
|
||||
"description": "Válaszd ki az automatikusan letölthető médiákat"
|
||||
},
|
||||
"download_options": {
|
||||
"name": "Letöltési beállítások",
|
||||
"description": "A fájl elérési útvonal formátumának megadása"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "Chat letöltés kontextusmenü",
|
||||
"description": "A chat letöltés kontextusmenüjének engedélyezése"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "Galéria Média küldés felülbírálása",
|
||||
"description": "A galériából küldött média felülírása"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"name": "Üzenetek automatikus mentése",
|
||||
"description": "Válaszd ki az automatikusan mentendő üzenetek típusát"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "Médiaforrás minőségének kikényszerítése",
|
||||
"description": "Felülírja a médiaforrás minőségét"
|
||||
},
|
||||
"download_logging": {
|
||||
"name": "Napló letöltése",
|
||||
"description": "Felugró buborék mutatása média letöltésekor"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "Barát beállítások menüsor",
|
||||
"description": "Engedélyezi az új barát beállítások menüsort"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "Barát beállítások menü gombok",
|
||||
"description": "Válaszd ki, hogy mely gombok jelenjenek meg a barát beállítások menüsorban"
|
||||
},
|
||||
"friend_feed_menu_buttons_position": {
|
||||
"name": "Barát beállítások pozíciójának indexe",
|
||||
"description": "A barát beállítások menügombok pozíciója"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"name": "UI Elemek elrejtése",
|
||||
"description": "Válaszd ki, mely UI-elemeket szeretnéd elrejteni"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"name": "Sztori rész elrejtése",
|
||||
"description": "Bizonyos UI-elemek elrejtése a történet szekcióban"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "Történet megtekintő felülírása",
|
||||
"description": "Bekapcsol bizonyos funkciókat, amelyeket a Snapchat elrejtett"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "Mutassa a streak lejárati adatait",
|
||||
"description": "Megjeleníti a streak lejárati adatait a streak-ek mellett"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "Snap osztás kikapcsolása",
|
||||
"description": "Megakadályozza a Snapek több részre osztását"
|
||||
},
|
||||
"disable_video_length_restriction": {
|
||||
"name": "Videóhossz-korlátozás letiltása",
|
||||
"description": "Letiltja a videó hosszára vonatkozó korlátozásokat"
|
||||
},
|
||||
"snapchat_plus": {
|
||||
"name": "Snapchat Plusz",
|
||||
"description": "Engedélyezi a Snapchat Plusz funkciókat"
|
||||
},
|
||||
"new_map_ui": {
|
||||
"name": "Új térkép UI",
|
||||
"description": "Engedélyezi a térkép új UI"
|
||||
},
|
||||
"location_spoof": {
|
||||
"name": "Snapmap helymeghatározás átállító",
|
||||
"description": "Meghamisítja az tartózkodási helyed a Snapmap-en"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "Üzenet előnézet hossza",
|
||||
"description": "Az előnézetben megjelenítendő üzenetek mennyiségének megadása"
|
||||
},
|
||||
"unlimited_conversation_pinning": {
|
||||
"name": "Korlátlan beszélgetés kitűzés",
|
||||
"description": "Lehetővé teszi korlátlan számú beszélgetés kitűzését"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "Spotlight letiltása",
|
||||
"description": "Letiltja a Spotlight oldalt"
|
||||
},
|
||||
"enable_app_appearance": {
|
||||
"name": "Az alkalmazás megjelenési beállításainak engedélyezése",
|
||||
"description": "Engedélyezi a rejtett alkalmazás megjelenési beállításait"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"name": "Kezdőoldal felülírása",
|
||||
"description": "Felülírja az indítóoldalt"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "A Google Play Szolgáltatások Párbeszédablakainak Letiltása",
|
||||
"description": "Elrejti a Google Play Szolgáltatások elérhetőségére vonatkozó párbeszédablakokat"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "Automatikus frissítő",
|
||||
"description": "A frissítések ellenőrzésének időintervalluma"
|
||||
},
|
||||
"disable_camera": {
|
||||
"name": "Kamera letiltása",
|
||||
"description": "Megakadályozza, hogy a Snapchat használhassa a kamerát"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "Merev kamera előnézet",
|
||||
"description": "Megakadályozza, hogy a Snapchat levágja a kamera előnézetét"
|
||||
},
|
||||
"preview_resolution": {
|
||||
"name": "Előnézet Felbontás",
|
||||
"description": "Felülírja a kamera előnézeti felbontását"
|
||||
},
|
||||
"picture_resolution": {
|
||||
"name": "Képfelbontás",
|
||||
"description": "Felülírja a képfelbontást"
|
||||
},
|
||||
"force_highest_frame_rate": {
|
||||
"name": "Legmagasabb képkocka sebesség kikényszerítése",
|
||||
"description": "A lehető legmagasabb képkocka sebességet kényszeríti ki"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "Kamera forráskódolás kikényszerítése",
|
||||
"description": "Kényszeríti a kamera forráskódolását"
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "App jelszó beállítása",
|
||||
"description": "Beállít egy jelszót az alkalmazás zárolásához"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "Alkalmazás zárolása folytatáskor",
|
||||
"description": "Zárolja az alkalmazást az újbóli megnyitásakor"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "Végtelen történet Boost",
|
||||
"description": "Végtelenül feldobja a történetedet"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "My Eyes Only jelszó megkerülése",
|
||||
"description": "A My Eyes Only jelszó megkerülése\nEz csak akkor működik, ha a jelszót korábban helyesen adta meg"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "AMOLED Sötét mód",
|
||||
"description": "Engedélyezi az AMOLED sötét üzemmódot\nGyőződj meg róla, hogy a Snapchat sötét módja engedélyezve van"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "Korlátlan Multi Snap",
|
||||
"description": "Lehetővé teszi, hogy korlátlan számú többszörös pillanatfelvételt készítsen"
|
||||
},
|
||||
"device_spoof": {
|
||||
"name": "Eszközértékek hamisítása",
|
||||
"description": "Meghamisítja az eszközök értékeit"
|
||||
},
|
||||
"device_fingerprint": {
|
||||
"name": "Eszköz Ujjlenyomata",
|
||||
"description": "Eszköz ujjlenyomatának meghamisítása"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "Android Azonosítója",
|
||||
"description": "Meghamísítja az eszköz Android Azonosítóját"
|
||||
}
|
||||
},
|
||||
"option": {
|
||||
"property": {
|
||||
"better_notifications": {
|
||||
"chat": "Chat-üzenetek megjelenítése",
|
||||
"snap": "Média megjelenítése",
|
||||
"reply_button": "Válasz gomb hozzáadása",
|
||||
"download_button": "Letöltés gomb hozzáadása"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download_blacklist": "⬇️ Automatikus letöltési kivételek",
|
||||
"anti_auto_save": "💬 Ne mentse le automatikusan az üzeneteket",
|
||||
"stealth_mode": "👻 Lopakodó üzemmód",
|
||||
"conversation_info": "👤 Beszélgetés információk"
|
||||
},
|
||||
"download_options": {
|
||||
"allow_duplicate": "Duplikált letöltések engedélyezése",
|
||||
"create_user_folder": "Mappa létrehozása minden felhasználó számára",
|
||||
"append_hash": "Egyedi hash hozzáadása a fájlnévhez",
|
||||
"append_username": "Felhasználónév hozzáadása a fájl nevéhez",
|
||||
"append_date_time": "Dátum és idő hozzáadása a fájl nevéhez",
|
||||
"append_type": "Média típusa hozzáadása a fájl nevéhez",
|
||||
"merge_overlay": "Snap képfelületek összevonása"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"friend_snaps": "Barát Snap-ek",
|
||||
"friend_stories": "Barát történetek",
|
||||
"public_stories": "Nyilvános történeket",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"download_logging": {
|
||||
"started": "Elkezdődött",
|
||||
"success": "Sikeres",
|
||||
"progress": "Folyamat",
|
||||
"failure": "Sikertelen"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"NOTE": "Hangüzenet",
|
||||
"CHAT": "Üzenet",
|
||||
"EXTERNAL_MEDIA": "Külső média",
|
||||
"SNAP": "Snap",
|
||||
"STICKER": "Matrica"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "Képernyőkép",
|
||||
"chat_screen_record": "Képernyőfelvétel",
|
||||
"camera_roll_save": "Camera Roll mentése",
|
||||
"chat": "Üzenet",
|
||||
"chat_reply": "Chat Válasz",
|
||||
"snap": "Snap",
|
||||
"typing": "Gépelés",
|
||||
"stories": "Történetek",
|
||||
"initiate_audio": "Bejövő Hanghívás",
|
||||
"abandon_audio": "Nem Fogadott Hanghívás",
|
||||
"initiate_video": "Bejövő Videohívás",
|
||||
"abandon_video": "Nem Fogadott Videohívás"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "Eredeti",
|
||||
"NOTE": "Hangüzenet",
|
||||
"SNAP": "Snap",
|
||||
"LIVE_SNAP": "Snap hanggal"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"remove_call_buttons": "Hívás gombok eltávolítása",
|
||||
"remove_cognac_button": "Cognac gomb eltávolítása",
|
||||
"remove_live_location_share_button": "Élő helymegosztó gomb eltávolítása",
|
||||
"remove_stickers_button": "Matricák eltávolítása gomb",
|
||||
"remove_voice_record_button": "Hangfelvétel gomb eltávolítása",
|
||||
"remove_camera_borders": "Kamerakeret eltávolítása"
|
||||
},
|
||||
"auto_updater": {
|
||||
"DISABLED": "Kikapcsolva",
|
||||
"EVERY_LAUNCH": "Minden indításnál",
|
||||
"DAILY": "Naponta",
|
||||
"WEEKLY": "Hetente"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "Ki",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "A lejátszás felfedezésének engedélyezése",
|
||||
"VERTICAL_STORY_VIEWER": "Függőleges történetnézegető engedélyezése"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"hide_friend_suggestions": "Barátjavaslatok elrejtése",
|
||||
"hide_friends": "Barátok szekció elrejtése",
|
||||
"hide_following": "Követések szakasz elrejtése",
|
||||
"hide_for_you": "Neked szakasz elrejtése"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"OFF": "Ki",
|
||||
"ngs_map_icon_container": "Térkép",
|
||||
"ngs_chat_icon_container": "Üzenetek",
|
||||
"ngs_camera_icon_container": "Kamera",
|
||||
"ngs_community_icon_container": "Közösség / Történetek",
|
||||
"ngs_spotlight_icon_container": "Spotlight",
|
||||
"ngs_search_icon_container": "Keresés"
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_menu_option": {
|
||||
"preview": "Előnézet",
|
||||
"stealth_mode": "Lopakodás mód",
|
||||
"auto_download_blacklist": "Automatikus letöltési kivételek",
|
||||
"anti_auto_save": "Ne mentse automatikusan"
|
||||
},
|
||||
"message_context_menu_option": {
|
||||
"download": "Letöltés",
|
||||
"preview": "Előnézet"
|
||||
},
|
||||
"chat_action_menu": {
|
||||
"preview_button": "Előnézet",
|
||||
"download_button": "Letöltés",
|
||||
"delete_logged_message_button": "Naplózott üzenet törlése"
|
||||
},
|
||||
"opera_context_menu": {
|
||||
"download": "Média letöltése"
|
||||
},
|
||||
"modal_option": {
|
||||
"profile_info": "Profil Infó",
|
||||
"close": "Bezár"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "Egyszerre csak egy médiát küldhet"
|
||||
},
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "Lejár {day} nap {hour} óra {minute} perc múlva",
|
||||
"total_messages": "Összes kapott/küldött üzenetek: {count}",
|
||||
"title": "Előnézet",
|
||||
"unknown_user": "Ismeretlen felhasználó"
|
||||
},
|
||||
"profile_info": {
|
||||
"title": "Profil Infó",
|
||||
"username": "Felhasználónév",
|
||||
"display_name": "Megjelenített név",
|
||||
"added_date": "Hozzáadás dátuma",
|
||||
"birthday": "Születésnap : {month} {day}"
|
||||
},
|
||||
"auto_updater": {
|
||||
"no_update_available": "Nincs elérhető frissítés!",
|
||||
"dialog_title": "Új frissítés elérhető!",
|
||||
"dialog_message": "Új frissítés érhető el a SnapEnhance számára! ({version})\n\n{body}",
|
||||
"dialog_positive_button": "Letöltés és telepítés",
|
||||
"dialog_negative_button": "Mégsem",
|
||||
"downloading_toast": "Frissítés letöltése...",
|
||||
"download_manager_notification_title": "SnapEnhance APK letöltése..."
|
||||
},
|
||||
"chat_export": {
|
||||
"select_export_format": "Válassz export formátumot",
|
||||
"select_media_type": "Válaszd ki az exportálandó médiatípusokat",
|
||||
"select_conversation": "Válaszd ki az exportálandó beszélgetést",
|
||||
"dialog_negative_button": "Mégsem",
|
||||
"dialog_neutral_button": "Minden exportálása",
|
||||
"dialog_positive_button": "Exportálás",
|
||||
"exported_to": "Exportálva ide {path}",
|
||||
"exporting_chats": "Üzenetek exportálása...",
|
||||
"processing_chats": "{amount} beszélgetések feldolgozása...",
|
||||
"export_fail": "Nem sikerült exportálni a beszélgetést {conversation}",
|
||||
"writing_output": "Kimenet írása...",
|
||||
"finished": "Kész! Most már ezt bezárhatod.",
|
||||
"no_messages_found": "Nincsenek üzenetek!",
|
||||
"exporting_message": "Expotálás {conversation}..."
|
||||
},
|
||||
"button": {
|
||||
"ok": "OK",
|
||||
"positive": "Igen",
|
||||
"negative": "Nem",
|
||||
"cancel": "Mégsem",
|
||||
"open": "Megnyitás"
|
||||
},
|
||||
"download_manager_activity": {
|
||||
"remove_all_title": "Összel letöltés eltávolítása",
|
||||
"remove_all_text": "Biztos vagy benne?",
|
||||
"remove_all": "Eltávolítás",
|
||||
"no_downloads": "Nincsenek letöltések",
|
||||
"cancel": "Mégsem",
|
||||
"file_not_found_toast": "A fájl nem létezik!",
|
||||
"category": {
|
||||
"all_category": "Összes",
|
||||
"pending_category": "Függőben",
|
||||
"snap_category": "Snapek",
|
||||
"story_category": "Sztorik",
|
||||
"spotlight_category": "Spotlight"
|
||||
},
|
||||
"debug_settings": "Hibakeresési beállítások",
|
||||
"debug_settings_page": {
|
||||
"clear_file_title": "{file_name} fájl törlése",
|
||||
"clear_file_confirmation": "Biztos, hogy törölni akarod a {file_name} fájlt?",
|
||||
"clear_cache_title": "Gyorsítótár törlése",
|
||||
"reset_all_title": "Beállítások visszaállítása",
|
||||
"reset_all_confirmation": "Biztos alapra szeretnéd helyezni?",
|
||||
"success_toast": "Siker!",
|
||||
"device_spoofer": "Eszköz hamisító"
|
||||
}
|
||||
},
|
||||
"download_processor": {
|
||||
"download_started_toast": "A letöltés megkezdődött",
|
||||
"unsupported_content_type_toast": "A tartalom típusa nem támogatott!",
|
||||
"failed_no_longer_available_toast": "A média már nem érhető el",
|
||||
"already_queued_toast": "A média már várólistán van!",
|
||||
"already_downloaded_toast": "Ez már le lett töltve!",
|
||||
"saved_toast": "Lementve {path}",
|
||||
"download_toast": "Letöltés {path}...",
|
||||
"processing_toast": "Feldolgozás {path}...",
|
||||
"failed_generic_toast": "Letöltés sikertelen",
|
||||
"failed_to_create_preview_toast": "Előnézet létrehozása sikertelen",
|
||||
"failed_processing_toast": "Nem sikerült feldolgozni {error}",
|
||||
"failed_gallery_toast": "Nem sikerült lementeni a galériába {error}"
|
||||
},
|
||||
"config_activity": {
|
||||
"title": "SnapEnhance Beállítások",
|
||||
"selected_text": "{count} kiváltasztva",
|
||||
"invalid_number_toast": "Érvénytelen szám!"
|
||||
},
|
||||
"spoof_activity": {
|
||||
"title": "Hamisítási Beállítások"
|
||||
}
|
||||
}
|
@ -1,447 +0,0 @@
|
||||
{
|
||||
"category": {
|
||||
"spying_privacy": "Spionaggio e Privacy",
|
||||
"media_manager": "Gestione Multimediale",
|
||||
"ui_tweaks": "UI e modifiche",
|
||||
"camera": "Fotocamera",
|
||||
"updates": "Aggiornamenti",
|
||||
"experimental_debugging": "Sperimentale"
|
||||
},
|
||||
"action": {
|
||||
"clean_cache": "Svuota la Cache",
|
||||
"clear_message_logger": "Cancella Registratore dei Messaggi",
|
||||
"refresh_mappings": "Aggiorna Mappature",
|
||||
"open_map": "Scegli la posizione sulla mappa",
|
||||
"check_for_updates": "Controlla gli aggiornamenti",
|
||||
"export_chat_messages": "Esporta i messaggi della chat"
|
||||
},
|
||||
"property": {
|
||||
"message_logger": {
|
||||
"name": "Registratore dei Messaggi",
|
||||
"description": "Impedisci l'eliminazione dei messaggi"
|
||||
},
|
||||
"prevent_read_receipts": {
|
||||
"name": "Impedisci le Ricevute di Lettura",
|
||||
"description": "Impedisci a chiunque di sapere di aver aperto i propri Snap"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "Nascondi Presenza Bitmoji",
|
||||
"description": "Nascondi la presenza della tua Bitmoji dalla chat"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "Migliori Notifiche",
|
||||
"description": "Mostra ulteriori informazioni nelle notifiche"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "Lista Nera delle Notifiche",
|
||||
"description": "Nascondi il tipo di notifiche selezionato"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "Disabilita le Metriche",
|
||||
"description": "Disabilita le metriche inviate a Snapchat"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "Blocca Annunci",
|
||||
"description": "Blocca la visualizzazione degli annunci"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "Tempo di Visualizzazione Illimitato degli Scatti",
|
||||
"description": "Rimuove il limite di tempo per la visualizzazione degli Snap"
|
||||
},
|
||||
"prevent_sending_messages": {
|
||||
"name": "Impedisci L'Invio Di Messaggi",
|
||||
"description": "Impedisce l'invio di determinati tipi di messaggi"
|
||||
},
|
||||
"anonymous_story_view": {
|
||||
"name": "Visualizzazione Anonima delle Storie",
|
||||
"description": "Impedisci a chiunque di sapere che hai visualizzato la sua storia"
|
||||
},
|
||||
"hide_typing_notification": {
|
||||
"name": "Nascondi le Notifiche di Digitazione",
|
||||
"description": "Impedisci l'invio di notifiche di digitazione"
|
||||
},
|
||||
"save_folder": {
|
||||
"name": "Cartella di salvataggio",
|
||||
"description": "La cartella dove tutti i media sono salvati"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"name": "Opzioni download automatico",
|
||||
"description": "Seleziona quali media scaricare automaticamente"
|
||||
},
|
||||
"download_options": {
|
||||
"name": "Opzioni download",
|
||||
"description": "Specifica il formato del percorso di salvataggio"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "Menu Contestuale Download Chat",
|
||||
"description": "Abilita il menu contestuale di download della chat"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "Sovrascrivi Invio Media della Galleria",
|
||||
"description": "Sovrascrive i media inviati dalla galleria"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"name": "Salvataggio Automatico Messaggi",
|
||||
"description": "Seleziona che tipo di messaggi salvare automaticamente"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "Forza Qualità Sorgente Media",
|
||||
"description": "Sovrascrive la qualità della sorgente multimediale"
|
||||
},
|
||||
"download_logging": {
|
||||
"name": "Scarica Log",
|
||||
"description": "Mostra un notifica durante il download del media"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "Barra dei Menu Feed Amici",
|
||||
"description": "Abilita la nuova Barra dei Menu Feed Amici"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "Pulsanti Menu Feed Amici",
|
||||
"description": "Seleziona quali pulsanti mostrare nella Barra dei Menu Feed Amici"
|
||||
},
|
||||
"friend_feed_menu_buttons_position": {
|
||||
"name": "Indice Posizione Pulsanti Feed Amici",
|
||||
"description": "La posizione dei pulsanti del menu Feed Amici"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"name": "Nascondi Elementi UI",
|
||||
"description": "Seleziona quali elementi UI sono da nascondere"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"name": "Nascondi Sezione Storia",
|
||||
"description": "Nascondi alcuni elementi della UI mostrati nella sezione storia"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "Sovrascrivi Visualizzatore Storia",
|
||||
"description": "Attiva alcune funzionalità che Snapchat ha nascosto"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "Mostra Le Informazioni Di Scadenza Streak",
|
||||
"description": "Mostra le informazioni sulla scadenza della Serie, affianco alle serie"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "Disabilita Divisione A Scatto",
|
||||
"description": "Impedisci la divisione in più parti degli Scatti"
|
||||
},
|
||||
"disable_video_length_restriction": {
|
||||
"name": "Disabilita la Limitazione della Lunghezza del Video",
|
||||
"description": "Disabilita le limitazioni della durata dei video"
|
||||
},
|
||||
"snapchat_plus": {
|
||||
"name": "Snapchat Plus",
|
||||
"description": "Abilita le funzionalità di Snapchat Plus"
|
||||
},
|
||||
"new_map_ui": {
|
||||
"name": "Nuova UI Mappa",
|
||||
"description": "Abilita l'UI della nuova mappa"
|
||||
},
|
||||
"location_spoof": {
|
||||
"name": "Falsificatore Posizione Snapmap",
|
||||
"description": "Falsifica la tua posizione sulla Snapmap"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "Durata Anteprima del Messaggio",
|
||||
"description": "Specifica la quantità di messaggi da visualizzare in anteprima"
|
||||
},
|
||||
"unlimited_conversation_pinning": {
|
||||
"name": "Fissazione Illimitata delle Conversazioni",
|
||||
"description": "Consente di fissare conversazioni illimitate"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "Disabilita Spotlight",
|
||||
"description": "Disabilita la pagina di Spotlight"
|
||||
},
|
||||
"enable_app_appearance": {
|
||||
"name": "Consenti Impostazioni d'Aspetto dell'App",
|
||||
"description": "Abilita le impostazioni di aspetto dell'app nascoste"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"name": "Sovrascrivi Pagina d'Avvio",
|
||||
"description": "Sovrascrive la pagina di avvio"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "Disabilita Finestre di Google Play Services",
|
||||
"description": "Impedisci la visualizzazione delle finestre di disponibilità di Google Play Services"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "Aggiornamento Automatico",
|
||||
"description": "L'intervallo di verifica degli aggiornamenti"
|
||||
},
|
||||
"disable_camera": {
|
||||
"name": "Disabilita Fotocamera",
|
||||
"description": "Impedisce a Snapchat di poter utilizzare la fotocamera"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "Anteprima Immersiva Fotocamera",
|
||||
"description": "Impedisce a Snapchat di ritagliare l'anteprima della fotocamera"
|
||||
},
|
||||
"preview_resolution": {
|
||||
"name": "Risoluzione dell'Anteprima",
|
||||
"description": "Sovrascrive la risoluzione d'anteprima della fotocamera"
|
||||
},
|
||||
"picture_resolution": {
|
||||
"name": "Risoluzione dell'Immagine",
|
||||
"description": "Sovrascrive la risoluzione dell'immagine"
|
||||
},
|
||||
"force_highest_frame_rate": {
|
||||
"name": "Forza Frame Rate Più Elevato",
|
||||
"description": "Forza la frequenza di fotogrammi maggiore possibile"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "Forza Codifica Fonte Fotocamera",
|
||||
"description": "Forza la codifica della fonte della fotocamera"
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "Imposta Passcode dell'App",
|
||||
"description": "Imposta un passcode per bloccare l'app"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "Blocca App Quando Riaperta",
|
||||
"description": "Blocca l'app quando è riaperta"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "Incremento Infinito Storie",
|
||||
"description": "Incrementa infinitamente le tue storie"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "Superamento Passcode My Eyes Only",
|
||||
"description": "Supera il passcode di My Eyes Only\nFunzionerà soltanto se il passcode è stato precedentemente inserito correttamente"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "Modalità Scura AMOLED",
|
||||
"description": "Abilita la modalità scura AMOLED\nAssicurati che la modalità scura di Snapchat sia abilitata"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "Snap Multipli Illimitati",
|
||||
"description": "Ti consente di scattare una quantità illimitata di scatti multipli"
|
||||
},
|
||||
"device_spoof": {
|
||||
"name": "Falsifica Valori Dispositivo",
|
||||
"description": "Falsifica i valori del dispositivo"
|
||||
},
|
||||
"device_fingerprint": {
|
||||
"name": "Impronta Digitale del Dispositivo",
|
||||
"description": "Falsifica l'impronta digitale del dispositivo"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "ID Android",
|
||||
"description": "Falsifica gli ID Android dei dispositivi"
|
||||
}
|
||||
},
|
||||
"option": {
|
||||
"property": {
|
||||
"better_notifications": {
|
||||
"chat": "Mostra messaggi della chat",
|
||||
"snap": "Mostra media",
|
||||
"reply_button": "Aggiungi pulsante di risposta",
|
||||
"download_button": "Aggiungi pulsante di download"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download_blacklist": "⬇️ Lista Nera Download Automatici",
|
||||
"anti_auto_save": "💬 Impedisci Salvataggio Automatico Messaggi",
|
||||
"stealth_mode": "👻 Modalità Stealth",
|
||||
"conversation_info": "👤 Info sulla Conversazione"
|
||||
},
|
||||
"download_options": {
|
||||
"allow_duplicate": "Consenti download duplicati",
|
||||
"create_user_folder": "Crea cartella per ogni utente",
|
||||
"append_hash": "Aggiungi un hash univoco al nome del file",
|
||||
"append_username": "Aggiungi il nome utente al nome del file",
|
||||
"append_date_time": "Aggiungi la data e l'ora al nome del file",
|
||||
"append_type": "Aggiungi il tipo di file multimediale al nome del file",
|
||||
"merge_overlay": "Unisci Sovrapposizioni delle Immagini Snap"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"friend_snaps": "Snap di Amici",
|
||||
"friend_stories": "Snap Storie",
|
||||
"public_stories": "Storie Pubbliche",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"download_logging": {
|
||||
"started": "Avviato",
|
||||
"success": "Riuscito",
|
||||
"progress": "Avanzamento",
|
||||
"failure": "Fallito"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"NOTE": "Nota Vocale",
|
||||
"CHAT": "Chat",
|
||||
"EXTERNAL_MEDIA": "Media Esterno",
|
||||
"SNAP": "Snap",
|
||||
"STICKER": "Adesivo"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "Istantanea",
|
||||
"chat_screen_record": "Registrazione Schermo",
|
||||
"camera_roll_save": "Salvataggo Rullino",
|
||||
"chat": "Chat",
|
||||
"chat_reply": "Risposta alla Chat",
|
||||
"snap": "Aggancia",
|
||||
"typing": "Sta scrivendo...",
|
||||
"stories": "Storie",
|
||||
"initiate_audio": "Chiamata Vocale in Arrivo",
|
||||
"abandon_audio": "Chiamata Vocale Persa",
|
||||
"initiate_video": "Videochiamata in Arrivo",
|
||||
"abandon_video": "Videochiamata Persa"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "Originale",
|
||||
"NOTE": "Nota Vocale",
|
||||
"SNAP": "Snap",
|
||||
"LIVE_SNAP": "Scatto con audio"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"remove_call_buttons": "Rimuovi Pulsanti di Chiamata",
|
||||
"remove_cognac_button": "Rimuovi Pulsante Cognac",
|
||||
"remove_live_location_share_button": "Rimuovi Pulsante Condividi Posizione Live",
|
||||
"remove_stickers_button": "Rimuovi Pulsante Adesivi",
|
||||
"remove_voice_record_button": "Rimuovi Pulsante Registrazione Vocale",
|
||||
"remove_camera_borders": "Rimuovi Bordi Fotocamera"
|
||||
},
|
||||
"auto_updater": {
|
||||
"DISABLED": "Disabilitato",
|
||||
"EVERY_LAUNCH": "A Ogni Avviio",
|
||||
"DAILY": "Ogni Giorno",
|
||||
"WEEKLY": "Ogni Settimana"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "Spento",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "Abilita Barra di Ricerca di Riproduzione Scopri",
|
||||
"VERTICAL_STORY_VIEWER": "Abilita Visualizzatore Verticale delle Storie"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"hide_friend_suggestions": "Nascondi i suggerimenti degli amici",
|
||||
"hide_friends": "Nascondi sezione degli amici",
|
||||
"hide_following": "Nascondi sezione dei seguiti",
|
||||
"hide_for_you": "Nascondi la sezione dei Per Te"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"OFF": "Off",
|
||||
"ngs_map_icon_container": "Mappa",
|
||||
"ngs_chat_icon_container": "Chat",
|
||||
"ngs_camera_icon_container": "Fotocamera",
|
||||
"ngs_community_icon_container": "Community / Storie",
|
||||
"ngs_spotlight_icon_container": "Riflettore",
|
||||
"ngs_search_icon_container": "Cerca"
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_menu_option": {
|
||||
"preview": "Anteprima",
|
||||
"stealth_mode": "Modalità Stealth",
|
||||
"auto_download_blacklist": "Scarica Automaticamente la Lista Nera",
|
||||
"anti_auto_save": "Anti-Salvataggio Automatico"
|
||||
},
|
||||
"message_context_menu_option": {
|
||||
"download": "Scarica",
|
||||
"preview": "Anteprima"
|
||||
},
|
||||
"chat_action_menu": {
|
||||
"preview_button": "Anteprima",
|
||||
"download_button": "Scarica",
|
||||
"delete_logged_message_button": "Elimina Messaggio Caricato"
|
||||
},
|
||||
"opera_context_menu": {
|
||||
"download": "Scarica Media"
|
||||
},
|
||||
"modal_option": {
|
||||
"profile_info": "Info Profilo",
|
||||
"close": "Chiudi"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "Puoi inviare soltanto un media per volta"
|
||||
},
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "scade tra {day} giorni, {hour} ore, {minute} minuti",
|
||||
"total_messages": "Messaggi inviati/ricevuti totali: {count}",
|
||||
"title": "Anteprima",
|
||||
"unknown_user": "Utente Sconosciuto"
|
||||
},
|
||||
"profile_info": {
|
||||
"title": "Info sul Profilo",
|
||||
"username": "Nome Utente",
|
||||
"display_name": "Nome Visualizzato",
|
||||
"added_date": "Data di Aggiunta",
|
||||
"birthday": "Compleanno: {day} {month}"
|
||||
},
|
||||
"auto_updater": {
|
||||
"no_update_available": "Nessun Aggiornamento disponibile!",
|
||||
"dialog_title": "Nuovo Aggiornamento disponibile!",
|
||||
"dialog_message": "Un nuovo Aggiornamento per SnapEnhance è disponibile! ({version})\n\n{body}",
|
||||
"dialog_positive_button": "Scarica e Installa",
|
||||
"dialog_negative_button": "Annulla",
|
||||
"downloading_toast": "Scaricando l'Aggiornamento...",
|
||||
"download_manager_notification_title": "Scaricando l'APK di SnapEnhance..."
|
||||
},
|
||||
"chat_export": {
|
||||
"select_export_format": "Seleziona il Formato d'Esportazione",
|
||||
"select_media_type": "Seleziona Tipi di Media da esportare",
|
||||
"select_conversation": "Seleziona un Conversazione da esportare",
|
||||
"dialog_negative_button": "Annulla",
|
||||
"dialog_neutral_button": "Esporta Tutto",
|
||||
"dialog_positive_button": "Esporta",
|
||||
"exported_to": "Esportato a {path}",
|
||||
"exporting_chats": "Esportando le Chat...",
|
||||
"processing_chats": "Elaborando {amount} conversazioni...",
|
||||
"export_fail": "Impossibile esportare la conversazione {conversation}",
|
||||
"writing_output": "Scrivendo il risultato...",
|
||||
"finished": "Fatto! Ora puoi chiudere questa finestra.",
|
||||
"no_messages_found": "Nessun messaggio trovato!",
|
||||
"exporting_message": "Esportando {conversation}..."
|
||||
},
|
||||
"button": {
|
||||
"ok": "OK",
|
||||
"positive": "Sì",
|
||||
"negative": "No",
|
||||
"cancel": "Annulla",
|
||||
"open": "Apri"
|
||||
},
|
||||
"download_manager_activity": {
|
||||
"remove_all_title": "Rimuovi tutti i Download",
|
||||
"remove_all_text": "Sei sicuro di volerlo fare?",
|
||||
"remove_all": "Rimuovi Tutto",
|
||||
"no_downloads": "Nessun download",
|
||||
"cancel": "Annulla",
|
||||
"file_not_found_toast": "Il file non esiste!",
|
||||
"category": {
|
||||
"all_category": "Tutto",
|
||||
"pending_category": "In Sospeso",
|
||||
"snap_category": "Scatti",
|
||||
"story_category": "Storie",
|
||||
"spotlight_category": "Spotlight"
|
||||
},
|
||||
"debug_settings": "Impostazioni di Debug",
|
||||
"debug_settings_page": {
|
||||
"clear_file_title": "Cancella il file {file_name}",
|
||||
"clear_file_confirmation": "Sei sicuro di voler cancellare il file {file_name}?",
|
||||
"clear_cache_title": "Svuota la Cache",
|
||||
"reset_all_title": "Ripristina tutte le impostazioni",
|
||||
"reset_all_confirmation": "Sei sicuro di voler ripristinare tutte le impostazioni?",
|
||||
"success_toast": "Successo!",
|
||||
"device_spoofer": "Falsificatore Dispositivo"
|
||||
}
|
||||
},
|
||||
"download_processor": {
|
||||
"download_started_toast": "Download avviato",
|
||||
"unsupported_content_type_toast": "Tipo di contenuto non supportato!",
|
||||
"failed_no_longer_available_toast": "Media non più disponibile",
|
||||
"already_queued_toast": "Media già in coda!",
|
||||
"already_downloaded_toast": "Media già scaricato!",
|
||||
"saved_toast": "Salvato in {path}",
|
||||
"download_toast": "Scaricando {path}...",
|
||||
"processing_toast": "Elaborando {path}...",
|
||||
"failed_generic_toast": "Impossibile scaricare",
|
||||
"failed_to_create_preview_toast": "Impossibile creare l'anteprima",
|
||||
"failed_processing_toast": "Impossibile elaborare {error}",
|
||||
"failed_gallery_toast": "Impossibile salvare sulla galleria {error}"
|
||||
},
|
||||
"config_activity": {
|
||||
"title": "Impostazioni di SnapEnhance",
|
||||
"selected_text": "{count} selezionati",
|
||||
"invalid_number_toast": "Numero non valido!"
|
||||
},
|
||||
"spoof_activity": {
|
||||
"title": "Falsifica Impostazioni"
|
||||
}
|
||||
}
|
@ -1,447 +0,0 @@
|
||||
{
|
||||
"category": {
|
||||
"spying_privacy": "Casusluk ve Gizlilik",
|
||||
"media_manager": "Medya Yöneticisi",
|
||||
"ui_tweaks": "Arayüz ve İnce Ayarlar",
|
||||
"camera": "Kamera",
|
||||
"updates": "Güncellemeler",
|
||||
"experimental_debugging": "Deneysel"
|
||||
},
|
||||
"action": {
|
||||
"clean_cache": "Temiz Önbellek",
|
||||
"clear_message_logger": "Mesaj Kaydediciyi Temizle",
|
||||
"refresh_mappings": "Haritalamaları Yenile",
|
||||
"open_map": "Harita üzerinde konum seçin",
|
||||
"check_for_updates": "Güncellemeleri kontrol edin",
|
||||
"export_chat_messages": "Sohbet mesajlarını dışa aktar"
|
||||
},
|
||||
"property": {
|
||||
"message_logger": {
|
||||
"name": "Mesaj Kaydedici",
|
||||
"description": "Mesajların silinmesini önler"
|
||||
},
|
||||
"prevent_read_receipts": {
|
||||
"name": "Okundu Bilgisini Önle",
|
||||
"description": "Herhangi birinin Snap'lerini açtığınızı bilmesini önleyin"
|
||||
},
|
||||
"hide_bitmoji_presence": {
|
||||
"name": "Bitmoji'yi Gizle",
|
||||
"description": "Bitmoji'nizi sohbetten gizler"
|
||||
},
|
||||
"better_notifications": {
|
||||
"name": "Daha İyi Bildirimler",
|
||||
"description": "Bildirimlerde daha fazla bilgi gösterir"
|
||||
},
|
||||
"notification_blacklist": {
|
||||
"name": "Bildirim Kara Listesi",
|
||||
"description": "Seçilen bildirimin türünü gizler"
|
||||
},
|
||||
"disable_metrics": {
|
||||
"name": "Ölçümleri Devre Dışı Bırak",
|
||||
"description": "Snapchat'e gönderilen ölçüm verilerini devre dışı bırakır"
|
||||
},
|
||||
"block_ads": {
|
||||
"name": "Reklamları Engelle",
|
||||
"description": "Reklamların görüntülenmesini engeller"
|
||||
},
|
||||
"unlimited_snap_view_time": {
|
||||
"name": "Sınırsız Snap Görüntüleme Süresi",
|
||||
"description": "Snap'leri görüntülemek için zaman sınırını kaldırır"
|
||||
},
|
||||
"prevent_sending_messages": {
|
||||
"name": "Mesaj Göndermeyi Engelle",
|
||||
"description": "Belirli mesaj türlerinin gönderilmesini engeller"
|
||||
},
|
||||
"anonymous_story_view": {
|
||||
"name": "Anonim Hikaye Görünümü",
|
||||
"description": "Herhangi birinin hikayelerini gördüğünüzü bilmesini engeller"
|
||||
},
|
||||
"hide_typing_notification": {
|
||||
"name": "Yazıyor Bildirimini Gizle",
|
||||
"description": "Yazma bildirimlerinin gönderilmesini önler"
|
||||
},
|
||||
"save_folder": {
|
||||
"name": "Kayıt Klasörü",
|
||||
"description": "Tüm medyanın kaydedildiği klasör"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"name": "Otomatik İndirme Seçenekleri",
|
||||
"description": "Hangi medyaların otomatik indirileceğini seçin"
|
||||
},
|
||||
"download_options": {
|
||||
"name": "İndirme Seçenekleri",
|
||||
"description": "Dosya yolu biçimini belirleyin"
|
||||
},
|
||||
"chat_download_context_menu": {
|
||||
"name": "Sohbet İndirme İçerik Menüsü",
|
||||
"description": "Sohbet indirme içerik menüsünü etkinleştirin"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"name": "Galeri Medya Yüklemesini Aç",
|
||||
"description": "Galeriden medya yüklenmesine olanak verir"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"name": "Mesajları Otomatik Kaydet",
|
||||
"description": "Hangi tür mesajların otomatik olarak kaydedileceğini seçin"
|
||||
},
|
||||
"force_media_source_quality": {
|
||||
"name": "Medya Kaynak Kalitesini Zorla",
|
||||
"description": "Medya kaynağı kalitesini düşürmez"
|
||||
},
|
||||
"download_logging": {
|
||||
"name": "İndirme Günlüğü",
|
||||
"description": "Medya indirilirken bir tost mesajı göster"
|
||||
},
|
||||
"enable_friend_feed_menu_bar": {
|
||||
"name": "Arkadaş Akışı Menü Çubuğu",
|
||||
"description": "Yeni Arkadaş Akışı Menü Çubuğunu etkinleştirir"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"name": "Arkadaş Akışı Menü Düğmeleri",
|
||||
"description": "Arkadaş Akışı Menü Çubuğunda hangi düğmelerin gösterileceğini seçin"
|
||||
},
|
||||
"friend_feed_menu_buttons_position": {
|
||||
"name": "Arkadaş Akışı Düğmeleri Pozisyonu Dizini",
|
||||
"description": "Arkadaş Akışı Menü Düğmelerinin konumu"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"name": "Arayüz Öğelerini Gizle",
|
||||
"description": "Hangi arayüz öğelerinin gizleneceğini seçin"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"name": "Hikaye Bölümünü Gizle",
|
||||
"description": "Hikaye bölümünde gösterilen belirli arayüz öğelerini gizle"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"name": "Hikaye Görüntüleyici Geçersiz Kılma",
|
||||
"description": "Snapchat'in gizlediği belirli özellikleri açar"
|
||||
},
|
||||
"streak_expiration_info": {
|
||||
"name": "Seri Sona Erme Bilgisini Göster",
|
||||
"description": "Serilerin yanında Seri sona erme bilgisini gösterir"
|
||||
},
|
||||
"disable_snap_splitting": {
|
||||
"name": "Snap Bölmeyi Devre Dışı Bırak",
|
||||
"description": "Snap'lerin birden fazla parçaya bölünmesini önler"
|
||||
},
|
||||
"disable_video_length_restriction": {
|
||||
"name": "Video Uzunluğu Kısıtlamasını Devre Dışı Bırak",
|
||||
"description": "Video uzunluğu kısıtlamalarını devre dışı bırakır"
|
||||
},
|
||||
"snapchat_plus": {
|
||||
"name": "Snapchat Plus",
|
||||
"description": "Snapchat Plus özelliklerini etkinleştirir"
|
||||
},
|
||||
"new_map_ui": {
|
||||
"name": "Yeni Harita Arayüzü",
|
||||
"description": "Yeni harita arayüzünü etkinleştirir"
|
||||
},
|
||||
"location_spoof": {
|
||||
"name": "Snapmap Konum Değiştirici",
|
||||
"description": "Snapmap'te konumunuzu taklit eder"
|
||||
},
|
||||
"message_preview_length": {
|
||||
"name": "Mesaj Önizleme Uzunluğu",
|
||||
"description": "Önizlenecek mesaj miktarını belirtir"
|
||||
},
|
||||
"unlimited_conversation_pinning": {
|
||||
"name": "Sınırsız Konuşma Sabitleme",
|
||||
"description": "Sınırsız konuşmayı sabitleme olanağı sağlar"
|
||||
},
|
||||
"disable_spotlight": {
|
||||
"name": "Spotlight'ı Devre Dışı Bırak",
|
||||
"description": "Spotlight sayfasını devre dışı bırakır"
|
||||
},
|
||||
"enable_app_appearance": {
|
||||
"name": "Uygulama Görünüm Ayarlarını Etkinleştir",
|
||||
"description": "Gizli uygulama görünümü ayarlarını etkinleştirir"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"name": "Başlangıç Sayfasını Geçersiz Kıl",
|
||||
"description": "Başlangıç sayfasını geçersiz kılar"
|
||||
},
|
||||
"disable_google_play_dialogs": {
|
||||
"name": "Google Play Hizmetleri İletişim Kutularını Devre Dışı Bırak",
|
||||
"description": "Google Play Hizmetleri kullanılabilirlik iletişim kutularının gösterilmesini önler"
|
||||
},
|
||||
"auto_updater": {
|
||||
"name": "Otomatik Güncelleyici",
|
||||
"description": "Güncellemeleri kontrol etme aralığı"
|
||||
},
|
||||
"disable_camera": {
|
||||
"name": "Kamerayı Devre Dışı Bırak",
|
||||
"description": "Snapchat'in kamerayı kullanabilmesini engeller"
|
||||
},
|
||||
"immersive_camera_preview": {
|
||||
"name": "Sürükleyici Kamera Önizlemesi",
|
||||
"description": "Snapchat'in kamera önizlemesini kırpmasını engeller"
|
||||
},
|
||||
"preview_resolution": {
|
||||
"name": "Önizleme Çözünürlüğü",
|
||||
"description": "Kamera önizleme çözünürlüğünü değiştirir"
|
||||
},
|
||||
"picture_resolution": {
|
||||
"name": "Fotoğraf Çözünürlüğü",
|
||||
"description": "Fotoğraf çözünürlüğünü değiştirir"
|
||||
},
|
||||
"force_highest_frame_rate": {
|
||||
"name": "En Yüksek Kare Hızını Zorla",
|
||||
"description": "Mümkün olan en yüksek kare hızını zorlar"
|
||||
},
|
||||
"force_camera_source_encoding": {
|
||||
"name": "Kamera Kaynağı Kodlamasını Zorla",
|
||||
"description": "Kamera kaynak kodlamasını zorlar"
|
||||
},
|
||||
"app_passcode": {
|
||||
"name": "Uygulama Parolasını Ayarla",
|
||||
"description": "Uygulamayı kilitlemek için bir parola ayarlar"
|
||||
},
|
||||
"app_lock_on_resume": {
|
||||
"name": "Uygulama Yeniden Açıldığında Kilit",
|
||||
"description": "Uygulama yeniden açıldığında kilitlenir"
|
||||
},
|
||||
"infinite_story_boost": {
|
||||
"name": "Sınırsız Hikaye Desteği",
|
||||
"description": "Hikayenizi sınırsız güçlendirir"
|
||||
},
|
||||
"meo_passcode_bypass": {
|
||||
"name": "My Eyes Only Şifresini Kır",
|
||||
"description": "My Eyes Only şifresini atlayın\nBu yalnızca parola daha önce doğru girilmişse çalışacaktır"
|
||||
},
|
||||
"amoled_dark_mode": {
|
||||
"name": "AMOLED Karanlık Mod",
|
||||
"description": "AMOLED karanlık modunu etkinleştirir\nSnapchat'in karanlık modunun etkin olduğundan emin olun"
|
||||
},
|
||||
"unlimited_multi_snap": {
|
||||
"name": "Sınırsız Çoklu Snap",
|
||||
"description": "Sınırsız sayıda çoklu snap çekmenizi sağlar"
|
||||
},
|
||||
"device_spoof": {
|
||||
"name": "Sahte Cihaz Değerleri",
|
||||
"description": "Cihaz değerlerini taklit eder"
|
||||
},
|
||||
"device_fingerprint": {
|
||||
"name": "Cihaz Parmak İzi",
|
||||
"description": "Cihaz parmak izini taklit eder"
|
||||
},
|
||||
"android_id": {
|
||||
"name": "Android Kimliği",
|
||||
"description": "Cihazların Android kimliğini taklit eder"
|
||||
}
|
||||
},
|
||||
"option": {
|
||||
"property": {
|
||||
"better_notifications": {
|
||||
"chat": "Sohbet mesajlarını göster",
|
||||
"snap": "Medyaları göster",
|
||||
"reply_button": "Yanıtlama düğmesi ekle",
|
||||
"download_button": "İndirme düğmesi ekle"
|
||||
},
|
||||
"friend_feed_menu_buttons": {
|
||||
"auto_download_blacklist": "⬇️ Kara Liste Otomatik İndirme",
|
||||
"anti_auto_save": "💬 Anti Otomatik Mesaj Kaydetme",
|
||||
"stealth_mode": "👻 Gizli Mod",
|
||||
"conversation_info": "👤 Konuşma Bilgileri"
|
||||
},
|
||||
"download_options": {
|
||||
"allow_duplicate": "Çift indirmelere izin ver",
|
||||
"create_user_folder": "Her kullanıcı için klasör oluştur",
|
||||
"append_hash": "Dosya adına benzersiz bir hash ekle",
|
||||
"append_username": "Dosya adına kullanıcı adını ekle",
|
||||
"append_date_time": "Dosya adına tarih ve saati ekle",
|
||||
"append_type": "Medya türünü dosya adına ekle",
|
||||
"merge_overlay": "Snap Görüntü Kaplamalarını Birleştirme"
|
||||
},
|
||||
"auto_download_options": {
|
||||
"friend_snaps": "Arkadaş Snapleri",
|
||||
"friend_stories": "Arkadaş Hikayeleri",
|
||||
"public_stories": "Herkese Açık Hikayeler",
|
||||
"spotlight": "Spotlight"
|
||||
},
|
||||
"download_logging": {
|
||||
"started": "Başladı",
|
||||
"success": "Başarılı",
|
||||
"progress": "Süreç",
|
||||
"failure": "Hata"
|
||||
},
|
||||
"auto_save_messages": {
|
||||
"NOTE": "Sesli Not",
|
||||
"CHAT": "Sohbet",
|
||||
"EXTERNAL_MEDIA": "Harici Medya",
|
||||
"SNAP": "Snap",
|
||||
"STICKER": "Çıkartma"
|
||||
},
|
||||
"notifications": {
|
||||
"chat_screenshot": "Ekran Görüntüsü",
|
||||
"chat_screen_record": "Ekran Kaydı",
|
||||
"camera_roll_save": "Film Rulosu Kaydı",
|
||||
"chat": "Sohbet",
|
||||
"chat_reply": "Sohbet Cevabı",
|
||||
"snap": "Snap",
|
||||
"typing": "Yazıyor",
|
||||
"stories": "Hikayeler",
|
||||
"initiate_audio": "Gelen Sesli Arama",
|
||||
"abandon_audio": "Cevapsız Sesli Arama",
|
||||
"initiate_video": "Gelen Görüntülü Arama",
|
||||
"abandon_video": "Cevapsız Görüntülü Arama"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"ORIGINAL": "Orijinal",
|
||||
"NOTE": "Sesli Not",
|
||||
"SNAP": "Snap",
|
||||
"LIVE_SNAP": "Sesli Snap"
|
||||
},
|
||||
"hide_ui_elements": {
|
||||
"remove_call_buttons": "Arama Butonlarını Kaldır",
|
||||
"remove_cognac_button": "Konyak Butonunu Kaldır",
|
||||
"remove_live_location_share_button": "Canlı Konum Paylaş Butonunu Kaldır",
|
||||
"remove_stickers_button": "Çıkartmalar Butonunu Kaldır",
|
||||
"remove_voice_record_button": "Ses Kayıt Butonunu Kaldır",
|
||||
"remove_camera_borders": "Kamera Kenarlıklarını Kaldır"
|
||||
},
|
||||
"auto_updater": {
|
||||
"DISABLED": "Devre dışı",
|
||||
"EVERY_LAUNCH": "Her Açılışta",
|
||||
"DAILY": "Günlük",
|
||||
"WEEKLY": "Haftalık"
|
||||
},
|
||||
"story_viewer_override": {
|
||||
"OFF": "Kapalı",
|
||||
"DISCOVER_PLAYBACK_SEEKBAR": "Keşfet Oynatma Seekbarını Etkinleştir",
|
||||
"VERTICAL_STORY_VIEWER": "Dikey Hikaye Görüntüleyiciyi Etkinleştir"
|
||||
},
|
||||
"hide_story_section": {
|
||||
"hide_friend_suggestions": "Arkadaş önerilerini gizle",
|
||||
"hide_friends": "Arkadaşlar bölümünü gizle",
|
||||
"hide_following": "Takip edilenler bölümünü gizle",
|
||||
"hide_for_you": "Sizin İçin Bölümünü Gizle"
|
||||
},
|
||||
"startup_page_override": {
|
||||
"OFF": "Kapalı",
|
||||
"ngs_map_icon_container": "Harita",
|
||||
"ngs_chat_icon_container": "Sohbet",
|
||||
"ngs_camera_icon_container": "Kamera",
|
||||
"ngs_community_icon_container": "Topluluk / Hikayeler",
|
||||
"ngs_spotlight_icon_container": "Spotlight",
|
||||
"ngs_search_icon_container": "Ara"
|
||||
}
|
||||
}
|
||||
},
|
||||
"friend_menu_option": {
|
||||
"preview": "Önizleme",
|
||||
"stealth_mode": "Gizli Mod",
|
||||
"auto_download_blacklist": "Kara Liste Otomatik İndirme",
|
||||
"anti_auto_save": "Anti Otomatik Kaydetme"
|
||||
},
|
||||
"message_context_menu_option": {
|
||||
"download": "İndir",
|
||||
"preview": "Önizleme"
|
||||
},
|
||||
"chat_action_menu": {
|
||||
"preview_button": "Önizleme",
|
||||
"download_button": "İndir",
|
||||
"delete_logged_message_button": "Kaydedilen Mesajı Sil"
|
||||
},
|
||||
"opera_context_menu": {
|
||||
"download": "Medyayı İndir"
|
||||
},
|
||||
"modal_option": {
|
||||
"profile_info": "Profil Bilgisi",
|
||||
"close": "Kapat"
|
||||
},
|
||||
"gallery_media_send_override": {
|
||||
"multiple_media_toast": "Bir seferde yalnızca bir medya gönderebilirsiniz"
|
||||
},
|
||||
"conversation_preview": {
|
||||
"streak_expiration": "{day} gün {hour} saat {minute} dakika içinde sona eriyor",
|
||||
"total_messages": "Toplam gönderilen/alınan mesajlar: {count}",
|
||||
"title": "Önizleme",
|
||||
"unknown_user": "Bilinmeyen Kullanıcı"
|
||||
},
|
||||
"profile_info": {
|
||||
"title": "Profil Bilgisi",
|
||||
"username": "Kullanıcı Adı",
|
||||
"display_name": "Görünen İsim",
|
||||
"added_date": "Eklenme Tarihi",
|
||||
"birthday": "Doğum Günü: {day} {month}"
|
||||
},
|
||||
"auto_updater": {
|
||||
"no_update_available": "Güncelleme yok!",
|
||||
"dialog_title": "Güncelleme mevcut!",
|
||||
"dialog_message": "SnapEnhance için yeni bir güncelleme mevcut! ({version})\n\n{body}",
|
||||
"dialog_positive_button": "İndir ve Yükle",
|
||||
"dialog_negative_button": "İptal",
|
||||
"downloading_toast": "Güncelleme İndiriliyor...",
|
||||
"download_manager_notification_title": "SnapEnhance APK'sı indiriliyor..."
|
||||
},
|
||||
"chat_export": {
|
||||
"select_export_format": "Dışa Aktarma Formatını Seçin",
|
||||
"select_media_type": "Dışa Aktarılacak Medya Türlerini Seçin",
|
||||
"select_conversation": "Dışa aktarmak için bir Konuşma seçin",
|
||||
"dialog_negative_button": "İptal",
|
||||
"dialog_neutral_button": "Tümünü Dışa Aktar",
|
||||
"dialog_positive_button": "Dışa Aktar",
|
||||
"exported_to": "{path}'a aktarıldı",
|
||||
"exporting_chats": "Sohbetler Dışa Aktarılıyor...",
|
||||
"processing_chats": "{amount} konuşma işleniyor...",
|
||||
"export_fail": "Konuşma {conversation} dışa aktarılamadı",
|
||||
"writing_output": "Çıktı yazılıyor...",
|
||||
"finished": "Bitti! Artık bu iletişim kutusunu kapatabilirsiniz.",
|
||||
"no_messages_found": "Mesaj bulunamadı!",
|
||||
"exporting_message": "{conversation} dışa aktarılıyor..."
|
||||
},
|
||||
"button": {
|
||||
"ok": "Tamam",
|
||||
"positive": "Evet",
|
||||
"negative": "Hayır",
|
||||
"cancel": "İptal",
|
||||
"open": "Aç"
|
||||
},
|
||||
"download_manager_activity": {
|
||||
"remove_all_title": "Tüm İndirmeleri Kaldır",
|
||||
"remove_all_text": "Bunu yapmak istediğine emin misin?",
|
||||
"remove_all": "Tümünü Kaldır",
|
||||
"no_downloads": "İndirme yok",
|
||||
"cancel": "İptal",
|
||||
"file_not_found_toast": "Dosya yok!",
|
||||
"category": {
|
||||
"all_category": "Tümü",
|
||||
"pending_category": "Beklemede",
|
||||
"snap_category": "Snapler",
|
||||
"story_category": "Hikayeler",
|
||||
"spotlight_category": "Spotlight"
|
||||
},
|
||||
"debug_settings": "Hata Ayıklama Ayarları",
|
||||
"debug_settings_page": {
|
||||
"clear_file_title": "{file_name} dosyasını temizle",
|
||||
"clear_file_confirmation": "{file_name} dosyasını temizlemek istediğinizden emin misiniz?",
|
||||
"clear_cache_title": "Önbelleği Temizle",
|
||||
"reset_all_title": "Tüm ayarları sıfırla",
|
||||
"reset_all_confirmation": "Tüm ayarları sıfırlamak istediğinizden emin misiniz?",
|
||||
"success_toast": "Başarılı!",
|
||||
"device_spoofer": "Cihaz Spoofer"
|
||||
}
|
||||
},
|
||||
"download_processor": {
|
||||
"download_started_toast": "İndirme başladı",
|
||||
"unsupported_content_type_toast": "Desteklenmeyen içerik türü!",
|
||||
"failed_no_longer_available_toast": "Medya artık mevcut değil",
|
||||
"already_queued_toast": "Medya zaten sırada!",
|
||||
"already_downloaded_toast": "Medya zaten indirildi!",
|
||||
"saved_toast": "{path}'a kaydedildi",
|
||||
"download_toast": "{path} indiriliyor...",
|
||||
"processing_toast": "{path} işleniyor...",
|
||||
"failed_generic_toast": "İndirme başarısız oldu",
|
||||
"failed_to_create_preview_toast": "Önizleme oluşturulamadı",
|
||||
"failed_processing_toast": "{error} işlenemedi",
|
||||
"failed_gallery_toast": "Galeriye kaydedilemedi {error}"
|
||||
},
|
||||
"config_activity": {
|
||||
"title": "SnapEnhance Ayarları",
|
||||
"selected_text": "{count} seçildi",
|
||||
"invalid_number_toast": "Geçersiz sayı!"
|
||||
},
|
||||
"spoof_activity": {
|
||||
"title": "Spoof Ayarları"
|
||||
}
|
||||
}
|
@ -1 +1 @@
|
||||
me.rhunk.snapenhance.XposedLoader
|
||||
me.rhunk.snapenhance.core.XposedLoader
|
@ -1,9 +0,0 @@
|
||||
package me.rhunk.snapenhance
|
||||
|
||||
object Constants {
|
||||
const val SNAPCHAT_PACKAGE_NAME = "com.snapchat.android"
|
||||
|
||||
val ARROYO_MEDIA_CONTAINER_PROTO_PATH = intArrayOf(4, 4)
|
||||
|
||||
const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package me.rhunk.snapenhance.action
|
||||
|
||||
import me.rhunk.snapenhance.action.impl.CleanCache
|
||||
import me.rhunk.snapenhance.action.impl.ExportChatMessages
|
||||
import me.rhunk.snapenhance.action.impl.OpenMap
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
enum class EnumAction(
|
||||
val key: String,
|
||||
val clazz: KClass<out AbstractAction>,
|
||||
val exitOnFinish: Boolean = false,
|
||||
val isCritical: Boolean = false,
|
||||
) {
|
||||
CLEAN_CACHE("clean_snapchat_cache", CleanCache::class, exitOnFinish = true),
|
||||
EXPORT_CHAT_MESSAGES("export_chat_messages", ExportChatMessages::class),
|
||||
OPEN_MAP("open_map", OpenMap::class);
|
||||
}
|
@ -1,32 +1,22 @@
|
||||
package me.rhunk.snapenhance.core.download
|
||||
package me.rhunk.snapenhance.core
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.bridge.DownloadCallback
|
||||
import me.rhunk.snapenhance.core.download.data.DashOptions
|
||||
import me.rhunk.snapenhance.core.download.data.DownloadMediaType
|
||||
import me.rhunk.snapenhance.core.download.data.DownloadMetadata
|
||||
import me.rhunk.snapenhance.core.download.data.DownloadRequest
|
||||
import me.rhunk.snapenhance.core.download.data.InputMedia
|
||||
import me.rhunk.snapenhance.core.download.data.MediaEncryptionKeyPair
|
||||
import me.rhunk.snapenhance.features.impl.downloader.decoder.AttachmentType
|
||||
import me.rhunk.snapenhance.common.ReceiversConfig
|
||||
import me.rhunk.snapenhance.common.data.download.*
|
||||
import me.rhunk.snapenhance.core.features.impl.downloader.decoder.AttachmentType
|
||||
|
||||
class DownloadManagerClient (
|
||||
private val context: ModContext,
|
||||
private val metadata: DownloadMetadata,
|
||||
private val callback: DownloadCallback
|
||||
) {
|
||||
companion object {
|
||||
const val DOWNLOAD_REQUEST_EXTRA = "request"
|
||||
const val DOWNLOAD_METADATA_EXTRA = "metadata"
|
||||
}
|
||||
|
||||
private fun enqueueDownloadRequest(request: DownloadRequest) {
|
||||
context.bridgeClient.enqueueDownload(Intent().apply {
|
||||
putExtras(Bundle().apply {
|
||||
putString(DOWNLOAD_REQUEST_EXTRA, context.gson.toJson(request))
|
||||
putString(DOWNLOAD_METADATA_EXTRA, context.gson.toJson(metadata))
|
||||
putString(ReceiversConfig.DOWNLOAD_REQUEST_EXTRA, context.gson.toJson(request))
|
||||
putString(ReceiversConfig.DOWNLOAD_METADATA_EXTRA, context.gson.toJson(metadata))
|
||||
})
|
||||
}, callback)
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance
|
||||
package me.rhunk.snapenhance.core
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.ClipData
|
||||
@ -14,22 +14,24 @@ import com.google.gson.GsonBuilder
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import me.rhunk.snapenhance.core.Logger
|
||||
import me.rhunk.snapenhance.common.Constants
|
||||
import me.rhunk.snapenhance.common.bridge.wrapper.LocaleWrapper
|
||||
import me.rhunk.snapenhance.common.bridge.wrapper.MappingsWrapper
|
||||
import me.rhunk.snapenhance.common.config.ModConfig
|
||||
import me.rhunk.snapenhance.core.bridge.BridgeClient
|
||||
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper
|
||||
import me.rhunk.snapenhance.core.bridge.wrapper.MappingsWrapper
|
||||
import me.rhunk.snapenhance.core.config.ModConfig
|
||||
import me.rhunk.snapenhance.core.bridge.loadFromBridge
|
||||
import me.rhunk.snapenhance.core.database.DatabaseAccess
|
||||
import me.rhunk.snapenhance.core.event.EventBus
|
||||
import me.rhunk.snapenhance.core.event.EventDispatcher
|
||||
import me.rhunk.snapenhance.core.util.download.HttpServer
|
||||
import me.rhunk.snapenhance.data.MessageSender
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.manager.impl.ActionManager
|
||||
import me.rhunk.snapenhance.manager.impl.FeatureManager
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.logger.CoreLogger
|
||||
import me.rhunk.snapenhance.core.manager.impl.ActionManager
|
||||
import me.rhunk.snapenhance.core.manager.impl.FeatureManager
|
||||
import me.rhunk.snapenhance.core.messaging.MessageSender
|
||||
import me.rhunk.snapenhance.core.scripting.CoreScriptRuntime
|
||||
import me.rhunk.snapenhance.core.util.media.HttpServer
|
||||
import me.rhunk.snapenhance.nativelib.NativeConfig
|
||||
import me.rhunk.snapenhance.nativelib.NativeLib
|
||||
import me.rhunk.snapenhance.scripting.core.CoreScriptRuntime
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
@ -46,7 +48,7 @@ class ModContext {
|
||||
|
||||
private val _config = ModConfig()
|
||||
val config by _config::root
|
||||
val log by lazy { Logger(this.bridgeClient) }
|
||||
val log by lazy { CoreLogger(this.bridgeClient) }
|
||||
val translation = LocaleWrapper()
|
||||
val httpServer = HttpServer()
|
||||
val messageSender = MessageSender(this)
|
||||
@ -73,7 +75,7 @@ class ModContext {
|
||||
}
|
||||
Handler(Looper.getMainLooper()).post {
|
||||
runCatching(runnable).onFailure {
|
||||
Logger.xposedLog("UI thread runnable failed", it)
|
||||
CoreLogger.xposedLog("UI thread runnable failed", it)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -136,7 +138,9 @@ class ModContext {
|
||||
|
||||
fun reloadConfig() {
|
||||
log.verbose("reloading config")
|
||||
_config.loadFromBridge(bridgeClient)
|
||||
_config.loadFromCallback { file ->
|
||||
file.loadFromBridge(bridgeClient)
|
||||
}
|
||||
native.loadNativeConfig(
|
||||
NativeConfig(
|
||||
disableBitmoji = config.experimental.nativeHooks.disableBitmoji.get(),
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance
|
||||
package me.rhunk.snapenhance.core
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.Application
|
||||
@ -7,17 +7,20 @@ import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import me.rhunk.snapenhance.action.EnumAction
|
||||
import me.rhunk.snapenhance.bridge.ConfigStateListener
|
||||
import me.rhunk.snapenhance.bridge.SyncCallback
|
||||
import me.rhunk.snapenhance.common.Constants
|
||||
import me.rhunk.snapenhance.common.ReceiversConfig
|
||||
import me.rhunk.snapenhance.common.action.EnumAction
|
||||
import me.rhunk.snapenhance.common.data.MessagingFriendInfo
|
||||
import me.rhunk.snapenhance.common.data.MessagingGroupInfo
|
||||
import me.rhunk.snapenhance.core.bridge.BridgeClient
|
||||
import me.rhunk.snapenhance.core.bridge.loadFromBridge
|
||||
import me.rhunk.snapenhance.core.data.SnapClassCache
|
||||
import me.rhunk.snapenhance.core.event.events.impl.SnapWidgetBroadcastReceiveEvent
|
||||
import me.rhunk.snapenhance.core.event.events.impl.UnaryCallEvent
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingFriendInfo
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingGroupInfo
|
||||
import me.rhunk.snapenhance.data.SnapClassCache
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
import kotlin.system.measureTimeMillis
|
||||
|
||||
|
||||
@ -120,7 +123,9 @@ class SnapEnhance {
|
||||
scope.launch(Dispatchers.IO) {
|
||||
initNative()
|
||||
translation.userLocale = getConfigLocale()
|
||||
translation.loadFromBridge(bridgeClient)
|
||||
translation.loadFromCallback { locale ->
|
||||
bridgeClient.fetchLocales(locale)
|
||||
}
|
||||
}
|
||||
|
||||
mappings.loadFromBridge(bridgeClient)
|
||||
@ -221,7 +226,7 @@ class SnapEnhance {
|
||||
})
|
||||
|
||||
event.subscribe(SnapWidgetBroadcastReceiveEvent::class) { event ->
|
||||
if (event.action != BridgeClient.BRIDGE_SYNC_ACTION) return@subscribe
|
||||
if (event.action != ReceiversConfig.BRIDGE_SYNC_ACTION) return@subscribe
|
||||
event.canceled = true
|
||||
val feedEntries = appContext.database.getFeedEntries(Int.MAX_VALUE)
|
||||
|
@ -1,7 +1,8 @@
|
||||
package me.rhunk.snapenhance
|
||||
package me.rhunk.snapenhance.core
|
||||
|
||||
import de.robv.android.xposed.IXposedHookLoadPackage
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||
import me.rhunk.snapenhance.common.Constants
|
||||
|
||||
class XposedLoader : IXposedHookLoadPackage {
|
||||
override fun handleLoadPackage(p0: XC_LoadPackage.LoadPackageParam) {
|
@ -1,6 +1,6 @@
|
||||
package me.rhunk.snapenhance.action
|
||||
package me.rhunk.snapenhance.core.action
|
||||
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.core.ModContext
|
||||
import java.io.File
|
||||
|
||||
abstract class AbstractAction{
|
@ -1,6 +1,6 @@
|
||||
package me.rhunk.snapenhance.action.impl
|
||||
package me.rhunk.snapenhance.core.action.impl
|
||||
|
||||
import me.rhunk.snapenhance.action.AbstractAction
|
||||
import me.rhunk.snapenhance.core.action.AbstractAction
|
||||
import java.io.File
|
||||
|
||||
class CleanCache : AbstractAction() {
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.action.impl
|
||||
package me.rhunk.snapenhance.core.action.impl
|
||||
|
||||
import android.app.AlertDialog
|
||||
import android.content.DialogInterface
|
||||
@ -10,17 +10,17 @@ import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.joinAll
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import me.rhunk.snapenhance.action.AbstractAction
|
||||
import me.rhunk.snapenhance.core.Logger
|
||||
import me.rhunk.snapenhance.core.database.objects.FriendFeedEntry
|
||||
import me.rhunk.snapenhance.common.data.ContentType
|
||||
import me.rhunk.snapenhance.common.database.impl.FriendFeedEntry
|
||||
import me.rhunk.snapenhance.core.action.AbstractAction
|
||||
import me.rhunk.snapenhance.core.features.impl.messaging.Messaging
|
||||
import me.rhunk.snapenhance.core.logger.CoreLogger
|
||||
import me.rhunk.snapenhance.core.messaging.ExportFormat
|
||||
import me.rhunk.snapenhance.core.messaging.MessageExporter
|
||||
import me.rhunk.snapenhance.core.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.util.CallbackBuilder
|
||||
import me.rhunk.snapenhance.core.util.export.ExportFormat
|
||||
import me.rhunk.snapenhance.core.util.export.MessageExporter
|
||||
import me.rhunk.snapenhance.data.ContentType
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.Message
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID
|
||||
import me.rhunk.snapenhance.features.impl.Messaging
|
||||
import me.rhunk.snapenhance.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.Message
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
|
||||
import java.io.File
|
||||
import kotlin.math.absoluteValue
|
||||
|
||||
@ -294,7 +294,7 @@ class ExportChatMessages : AbstractAction() {
|
||||
}.onFailure {
|
||||
logDialog(context.translation.format("chat_export.export_fail", "conversation" to conversation.key.toString()))
|
||||
logDialog(it.stackTraceToString())
|
||||
Logger.xposedLog(it)
|
||||
CoreLogger.xposedLog(it)
|
||||
}
|
||||
}.also { jobs.add(it) }
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.action.impl
|
||||
package me.rhunk.snapenhance.core.action.impl
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import me.rhunk.snapenhance.action.AbstractAction
|
||||
import me.rhunk.snapenhance.core.BuildConfig
|
||||
import me.rhunk.snapenhance.common.BuildConfig
|
||||
import me.rhunk.snapenhance.core.action.AbstractAction
|
||||
|
||||
class OpenMap: AbstractAction() {
|
||||
override fun run() {
|
@ -10,24 +10,32 @@ import android.os.Handler
|
||||
import android.os.HandlerThread
|
||||
import android.os.IBinder
|
||||
import de.robv.android.xposed.XposedHelpers
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.bridge.BridgeInterface
|
||||
import me.rhunk.snapenhance.bridge.ConfigStateListener
|
||||
import me.rhunk.snapenhance.bridge.DownloadCallback
|
||||
import me.rhunk.snapenhance.bridge.SyncCallback
|
||||
import me.rhunk.snapenhance.bridge.e2ee.E2eeInterface
|
||||
import me.rhunk.snapenhance.bridge.scripting.IScripting
|
||||
import me.rhunk.snapenhance.core.BuildConfig
|
||||
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
|
||||
import me.rhunk.snapenhance.core.bridge.types.FileActionType
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
|
||||
import me.rhunk.snapenhance.core.messaging.SocialScope
|
||||
import me.rhunk.snapenhance.data.LocalePair
|
||||
import me.rhunk.snapenhance.common.BuildConfig
|
||||
import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
|
||||
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
|
||||
import me.rhunk.snapenhance.common.bridge.types.FileActionType
|
||||
import me.rhunk.snapenhance.common.bridge.types.LocalePair
|
||||
import me.rhunk.snapenhance.common.data.MessagingRuleType
|
||||
import me.rhunk.snapenhance.common.data.SocialScope
|
||||
import me.rhunk.snapenhance.core.ModContext
|
||||
import java.util.concurrent.CompletableFuture
|
||||
import java.util.concurrent.Executors
|
||||
import java.util.concurrent.TimeUnit
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
fun FileLoaderWrapper.loadFromBridge(bridgeClient: BridgeClient) {
|
||||
isFileExists = { bridgeClient.isFileExists(fileType) }
|
||||
read = { bridgeClient.createAndReadFile(fileType, defaultContent) }
|
||||
write = { bridgeClient.writeFile(fileType, it) }
|
||||
delete = { bridgeClient.deleteFile(fileType) }
|
||||
}
|
||||
|
||||
|
||||
class BridgeClient(
|
||||
private val context: ModContext
|
||||
@ -35,10 +43,6 @@ class BridgeClient(
|
||||
private lateinit var future: CompletableFuture<Boolean>
|
||||
private lateinit var service: BridgeInterface
|
||||
|
||||
companion object {
|
||||
const val BRIDGE_SYNC_ACTION = BuildConfig.APPLICATION_ID + ".core.bridge.SYNC"
|
||||
}
|
||||
|
||||
fun connect(timeout: (Throwable) -> Unit, onResult: (Boolean) -> Unit) {
|
||||
this.future = CompletableFuture()
|
||||
|
||||
|
@ -1,35 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.bridge
|
||||
|
||||
import android.content.Context
|
||||
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
|
||||
|
||||
open class FileLoaderWrapper(
|
||||
private val fileType: BridgeFileType,
|
||||
private val defaultContent: ByteArray
|
||||
) {
|
||||
lateinit var isFileExists: () -> Boolean
|
||||
lateinit var write: (ByteArray) -> Unit
|
||||
lateinit var read: () -> ByteArray
|
||||
lateinit var delete: () -> Unit
|
||||
|
||||
fun loadFromContext(context: Context) {
|
||||
val file = fileType.resolve(context)
|
||||
isFileExists = { file.exists() }
|
||||
read = {
|
||||
if (!file.exists()) {
|
||||
file.createNewFile()
|
||||
file.writeBytes("{}".toByteArray(Charsets.UTF_8))
|
||||
}
|
||||
file.readBytes()
|
||||
}
|
||||
write = { file.writeBytes(it) }
|
||||
delete = { file.delete() }
|
||||
}
|
||||
|
||||
fun loadFromBridge(bridgeClient: BridgeClient) {
|
||||
isFileExists = { bridgeClient.isFileExists(fileType) }
|
||||
read = { bridgeClient.createAndReadFile(fileType, defaultContent) }
|
||||
write = { bridgeClient.writeFile(fileType, it) }
|
||||
delete = { bridgeClient.deleteFile(fileType) }
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.bridge.types
|
||||
|
||||
import android.content.Context
|
||||
import java.io.File
|
||||
|
||||
|
||||
enum class BridgeFileType(val value: Int, val fileName: String, val displayName: String, private val isDatabase: Boolean = false) {
|
||||
CONFIG(0, "config.json", "Config"),
|
||||
MAPPINGS(1, "mappings.json", "Mappings"),
|
||||
MESSAGE_LOGGER_DATABASE(2, "message_logger.db", "Message Logger",true),
|
||||
PINNED_CONVERSATIONS(3, "pinned_conversations.txt", "Pinned Conversations");
|
||||
|
||||
fun resolve(context: Context): File = if (isDatabase) {
|
||||
context.getDatabasePath(fileName)
|
||||
} else {
|
||||
File(context.filesDir, fileName)
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun fromValue(value: Int): BridgeFileType? {
|
||||
return entries.firstOrNull { it.value == value }
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.bridge.types
|
||||
|
||||
enum class FileActionType {
|
||||
CREATE_AND_READ, READ, WRITE, DELETE, EXISTS
|
||||
}
|
@ -1,100 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.bridge.wrapper
|
||||
|
||||
import android.content.Context
|
||||
import com.google.gson.JsonObject
|
||||
import com.google.gson.JsonParser
|
||||
import me.rhunk.snapenhance.core.Logger
|
||||
import me.rhunk.snapenhance.core.bridge.BridgeClient
|
||||
import me.rhunk.snapenhance.data.LocalePair
|
||||
import java.util.Locale
|
||||
|
||||
|
||||
class LocaleWrapper {
|
||||
companion object {
|
||||
const val DEFAULT_LOCALE = "en_US"
|
||||
|
||||
fun fetchLocales(context: Context, locale: String = DEFAULT_LOCALE): List<LocalePair> {
|
||||
val locales = mutableListOf<LocalePair>().apply {
|
||||
add(LocalePair(DEFAULT_LOCALE, context.resources.assets.open("lang/$DEFAULT_LOCALE.json").bufferedReader().use { it.readText() }))
|
||||
}
|
||||
|
||||
if (locale == DEFAULT_LOCALE) return locales
|
||||
|
||||
val compatibleLocale = context.resources.assets.list("lang")?.firstOrNull { it.startsWith(locale) }?.substring(0, 5) ?: return locales
|
||||
|
||||
context.resources.assets.open("lang/$compatibleLocale.json").use { inputStream ->
|
||||
locales.add(LocalePair(compatibleLocale, inputStream.bufferedReader().use { it.readText() }))
|
||||
}
|
||||
|
||||
return locales
|
||||
}
|
||||
|
||||
fun fetchAvailableLocales(context: Context): List<String> {
|
||||
return context.resources.assets.list("lang")?.map { it.substring(0, 5) } ?: listOf()
|
||||
}
|
||||
}
|
||||
|
||||
var userLocale = DEFAULT_LOCALE
|
||||
|
||||
private val translationMap = linkedMapOf<String, String>()
|
||||
|
||||
lateinit var loadedLocale: Locale
|
||||
|
||||
private fun load(localePair: LocalePair) {
|
||||
loadedLocale = localePair.locale.let { Locale(it.substring(0, 2), it.substring(3, 5)) }
|
||||
|
||||
val translations = JsonParser.parseString(localePair.content).asJsonObject
|
||||
if (translations == null || translations.isJsonNull) {
|
||||
return
|
||||
}
|
||||
|
||||
fun scanObject(jsonObject: JsonObject, prefix: String = "") {
|
||||
jsonObject.entrySet().forEach {
|
||||
if (it.value.isJsonPrimitive) {
|
||||
val key = "$prefix${it.key}"
|
||||
translationMap[key] = it.value.asString
|
||||
}
|
||||
if (!it.value.isJsonObject) return@forEach
|
||||
scanObject(it.value.asJsonObject, "$prefix${it.key}.")
|
||||
}
|
||||
}
|
||||
|
||||
scanObject(translations)
|
||||
}
|
||||
|
||||
fun loadFromBridge(bridgeClient: BridgeClient) {
|
||||
bridgeClient.fetchLocales(userLocale).forEach {
|
||||
load(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun loadFromContext(context: Context) {
|
||||
fetchLocales(context, userLocale).forEach {
|
||||
load(it)
|
||||
}
|
||||
}
|
||||
|
||||
fun reloadFromContext(context: Context, locale: String) {
|
||||
userLocale = locale
|
||||
translationMap.clear()
|
||||
loadFromContext(context)
|
||||
}
|
||||
|
||||
operator fun get(key: String) = translationMap[key] ?: key.also { Logger.directDebug("Missing translation for $key") }
|
||||
|
||||
fun format(key: String, vararg args: Pair<String, String>): String {
|
||||
return args.fold(get(key)) { acc, pair ->
|
||||
acc.replace("{${pair.first}}", pair.second)
|
||||
}
|
||||
}
|
||||
|
||||
fun getCategory(key: String): LocaleWrapper {
|
||||
return LocaleWrapper().apply {
|
||||
translationMap.putAll(
|
||||
this@LocaleWrapper.translationMap
|
||||
.filterKeys { it.startsWith("$key.") }
|
||||
.mapKeys { it.key.substring(key.length + 1) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,151 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.bridge.wrapper
|
||||
|
||||
import android.content.Context
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonParser
|
||||
import me.rhunk.snapenhance.Constants
|
||||
import me.rhunk.snapenhance.core.Logger
|
||||
import me.rhunk.snapenhance.core.bridge.FileLoaderWrapper
|
||||
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
|
||||
import me.rhunk.snapenhance.mapper.Mapper
|
||||
import me.rhunk.snapenhance.mapper.impl.*
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import kotlin.system.measureTimeMillis
|
||||
|
||||
class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteArray(Charsets.UTF_8)) {
|
||||
companion object {
|
||||
private val gson = GsonBuilder().setPrettyPrinting().create()
|
||||
private val mappers = arrayOf(
|
||||
BCryptClassMapper::class,
|
||||
CallbackMapper::class,
|
||||
DefaultMediaItemMapper::class,
|
||||
MediaQualityLevelProviderMapper::class,
|
||||
OperaPageViewControllerMapper::class,
|
||||
PlatformAnalyticsCreatorMapper::class,
|
||||
PlusSubscriptionMapper::class,
|
||||
ScCameraSettingsMapper::class,
|
||||
StoryBoostStateMapper::class,
|
||||
FriendsFeedEventDispatcherMapper::class,
|
||||
CompositeConfigurationProviderMapper::class,
|
||||
ScoreUpdateMapper::class,
|
||||
FriendRelationshipChangerMapper::class,
|
||||
ViewBinderMapper::class,
|
||||
)
|
||||
}
|
||||
|
||||
private lateinit var context: Context
|
||||
|
||||
private val mappings = ConcurrentHashMap<String, Any>()
|
||||
private var snapBuildNumber: Long = 0
|
||||
|
||||
fun init(context: Context) {
|
||||
this.context = context
|
||||
snapBuildNumber = getSnapchatVersionCode()
|
||||
|
||||
if (isFileExists()) {
|
||||
runCatching {
|
||||
loadCached()
|
||||
}.onFailure {
|
||||
delete()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getSnapchatPackageInfo() = runCatching {
|
||||
context.packageManager.getPackageInfo(
|
||||
Constants.SNAPCHAT_PACKAGE_NAME,
|
||||
0
|
||||
)
|
||||
}.getOrNull()
|
||||
|
||||
fun getSnapchatVersionCode() = getSnapchatPackageInfo()?.longVersionCode ?: -1
|
||||
fun getApplicationSourceDir() = getSnapchatPackageInfo()?.applicationInfo?.sourceDir
|
||||
fun getGeneratedBuildNumber() = snapBuildNumber
|
||||
|
||||
fun isMappingsOutdated(): Boolean {
|
||||
return snapBuildNumber != getSnapchatVersionCode() || isMappingsLoaded().not()
|
||||
}
|
||||
|
||||
fun isMappingsLoaded(): Boolean {
|
||||
return mappings.isNotEmpty()
|
||||
}
|
||||
|
||||
private fun loadCached() {
|
||||
if (!isFileExists()) {
|
||||
throw Exception("Mappings file does not exist")
|
||||
}
|
||||
val mappingsObject = JsonParser.parseString(read().toString(Charsets.UTF_8)).asJsonObject.also {
|
||||
snapBuildNumber = it["snap_build_number"].asLong
|
||||
}
|
||||
|
||||
mappingsObject.entrySet().forEach { (key, value): Map.Entry<String, JsonElement> ->
|
||||
if (value.isJsonArray) {
|
||||
mappings[key] = gson.fromJson(value, ArrayList::class.java)
|
||||
return@forEach
|
||||
}
|
||||
if (value.isJsonObject) {
|
||||
mappings[key] = gson.fromJson(value, ConcurrentHashMap::class.java)
|
||||
return@forEach
|
||||
}
|
||||
mappings[key] = value.asString
|
||||
}
|
||||
}
|
||||
|
||||
fun refresh() {
|
||||
snapBuildNumber = getSnapchatVersionCode()
|
||||
val mapper = Mapper(*mappers)
|
||||
|
||||
runCatching {
|
||||
mapper.loadApk(getApplicationSourceDir() ?: throw Exception("Failed to get APK"))
|
||||
}.onFailure {
|
||||
throw Exception("Failed to load APK", it)
|
||||
}
|
||||
|
||||
measureTimeMillis {
|
||||
val result = mapper.start().apply {
|
||||
addProperty("snap_build_number", snapBuildNumber)
|
||||
}
|
||||
write(result.toString().toByteArray())
|
||||
}.also {
|
||||
Logger.directDebug("Generated mappings in $it ms")
|
||||
}
|
||||
}
|
||||
|
||||
fun getMappedObject(key: String): Any {
|
||||
if (mappings.containsKey(key)) {
|
||||
return mappings[key]!!
|
||||
}
|
||||
throw Exception("No mapping found for $key")
|
||||
}
|
||||
|
||||
fun getMappedObjectNullable(key: String): Any? {
|
||||
return mappings[key]
|
||||
}
|
||||
|
||||
fun getMappedClass(className: String): Class<*> {
|
||||
return context.classLoader.loadClass(getMappedObject(className) as String)
|
||||
}
|
||||
|
||||
fun getMappedClass(key: String, subKey: String): Class<*> {
|
||||
return context.classLoader.loadClass(getMappedValue(key, subKey))
|
||||
}
|
||||
|
||||
fun getMappedValue(key: String): String {
|
||||
return getMappedObject(key) as String
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T : Any> getMappedList(key: String): List<T> {
|
||||
return listOf(getMappedObject(key) as List<T>).flatten()
|
||||
}
|
||||
|
||||
fun getMappedValue(key: String, subKey: String): String {
|
||||
return getMappedMap(key)[subKey] as String
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun getMappedMap(key: String): Map<String, *> {
|
||||
return getMappedObject(key) as Map<String, *>
|
||||
}
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.bridge.wrapper
|
||||
|
||||
import android.content.ContentValues
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import me.rhunk.snapenhance.bridge.MessageLoggerInterface
|
||||
import me.rhunk.snapenhance.core.util.SQLiteDatabaseHelper
|
||||
import java.io.File
|
||||
import java.util.UUID
|
||||
|
||||
class MessageLoggerWrapper(
|
||||
private val databaseFile: File
|
||||
): MessageLoggerInterface.Stub() {
|
||||
private lateinit var database: SQLiteDatabase
|
||||
|
||||
fun init() {
|
||||
database = SQLiteDatabase.openDatabase(databaseFile.absolutePath, null, SQLiteDatabase.CREATE_IF_NECESSARY or SQLiteDatabase.OPEN_READWRITE)
|
||||
SQLiteDatabaseHelper.createTablesFromSchema(database, mapOf(
|
||||
"messages" to listOf(
|
||||
"id INTEGER PRIMARY KEY",
|
||||
"conversation_id VARCHAR",
|
||||
"message_id BIGINT",
|
||||
"message_data BLOB"
|
||||
)
|
||||
))
|
||||
}
|
||||
|
||||
override fun getLoggedIds(conversationId: Array<String>, limit: Int): LongArray {
|
||||
if (conversationId.any {
|
||||
runCatching { UUID.fromString(it) }.isFailure
|
||||
}) return longArrayOf()
|
||||
|
||||
val cursor = database.rawQuery("SELECT message_id FROM messages WHERE conversation_id IN (${
|
||||
conversationId.joinToString(
|
||||
","
|
||||
) { "'$it'" }
|
||||
}) ORDER BY message_id DESC LIMIT $limit", null)
|
||||
|
||||
val ids = mutableListOf<Long>()
|
||||
while (cursor.moveToNext()) {
|
||||
ids.add(cursor.getLong(0))
|
||||
}
|
||||
cursor.close()
|
||||
return ids.toLongArray()
|
||||
}
|
||||
|
||||
override fun getMessage(conversationId: String?, id: Long): ByteArray? {
|
||||
val cursor = database.rawQuery("SELECT message_data FROM messages WHERE conversation_id = ? AND message_id = ?", arrayOf(conversationId, id.toString()))
|
||||
val message: ByteArray? = if (cursor.moveToFirst()) {
|
||||
cursor.getBlob(0)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
cursor.close()
|
||||
return message
|
||||
}
|
||||
|
||||
override fun addMessage(conversationId: String, messageId: Long, serializedMessage: ByteArray): Boolean {
|
||||
val cursor = database.rawQuery("SELECT message_id FROM messages WHERE conversation_id = ? AND message_id = ?", arrayOf(conversationId, messageId.toString()))
|
||||
val state = cursor.moveToFirst()
|
||||
cursor.close()
|
||||
if (state) {
|
||||
return false
|
||||
}
|
||||
database.insert("messages", null, ContentValues().apply {
|
||||
put("conversation_id", conversationId)
|
||||
put("message_id", messageId)
|
||||
put("message_data", serializedMessage)
|
||||
})
|
||||
return true
|
||||
}
|
||||
|
||||
fun clearMessages() {
|
||||
database.execSQL("DELETE FROM messages")
|
||||
}
|
||||
|
||||
override fun deleteMessage(conversationId: String, messageId: Long) {
|
||||
database.execSQL("DELETE FROM messages WHERE conversation_id = ? AND message_id = ?", arrayOf(conversationId, messageId.toString()))
|
||||
}
|
||||
}
|
@ -1,82 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config
|
||||
|
||||
import com.google.gson.JsonObject
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
typealias ConfigParamsBuilder = ConfigParams.() -> Unit
|
||||
|
||||
open class ConfigContainer(
|
||||
val hasGlobalState: Boolean = false
|
||||
) {
|
||||
var parentContainerKey: PropertyKey<*>? = null
|
||||
val properties = mutableMapOf<PropertyKey<*>, PropertyValue<*>>()
|
||||
var globalState: Boolean? = null
|
||||
|
||||
private inline fun <T> registerProperty(
|
||||
key: String,
|
||||
type: DataProcessors.PropertyDataProcessor<*>,
|
||||
defaultValue: PropertyValue<T>,
|
||||
params: ConfigParams.() -> Unit = {},
|
||||
propertyKeyCallback: (PropertyKey<*>) -> Unit = {}
|
||||
): PropertyValue<T> {
|
||||
val propertyKey = PropertyKey({ parentContainerKey }, key, type, ConfigParams().also { it.params() })
|
||||
properties[propertyKey] = defaultValue
|
||||
propertyKeyCallback(propertyKey)
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
protected fun boolean(key: String, defaultValue: Boolean = false, params: ConfigParamsBuilder = {}) =
|
||||
registerProperty(key, DataProcessors.BOOLEAN, PropertyValue(defaultValue), params)
|
||||
|
||||
protected fun integer(key: String, defaultValue: Int = 0, params: ConfigParamsBuilder = {}) =
|
||||
registerProperty(key, DataProcessors.INTEGER, PropertyValue(defaultValue), params)
|
||||
|
||||
protected fun float(key: String, defaultValue: Float = 0f, params: ConfigParamsBuilder = {}) =
|
||||
registerProperty(key, DataProcessors.FLOAT, PropertyValue(defaultValue), params)
|
||||
|
||||
protected fun string(key: String, defaultValue: String = "", params: ConfigParamsBuilder = {}) =
|
||||
registerProperty(key, DataProcessors.STRING, PropertyValue(defaultValue), params)
|
||||
|
||||
protected fun multiple(
|
||||
key: String,
|
||||
vararg values: String = emptyArray(),
|
||||
params: ConfigParamsBuilder = {}
|
||||
) = registerProperty(key,
|
||||
DataProcessors.STRING_MULTIPLE_SELECTION, PropertyValue(mutableListOf<String>(), defaultValues = values.toList()), params)
|
||||
|
||||
//null value is considered as Off/Disabled
|
||||
protected fun unique(
|
||||
key: String,
|
||||
vararg values: String = emptyArray(),
|
||||
params: ConfigParamsBuilder = {}
|
||||
) = registerProperty(key,
|
||||
DataProcessors.STRING_UNIQUE_SELECTION, PropertyValue("null", defaultValues = values.toList()), params)
|
||||
|
||||
protected fun <T : ConfigContainer> container(
|
||||
key: String,
|
||||
container: T,
|
||||
params: ConfigParamsBuilder = {}
|
||||
) = registerProperty(key, DataProcessors.container(container), PropertyValue(container), params) {
|
||||
container.parentContainerKey = it
|
||||
}.get()
|
||||
|
||||
fun toJson(): JsonObject {
|
||||
val json = JsonObject()
|
||||
properties.forEach { (propertyKey, propertyValue) ->
|
||||
val serializedValue = propertyValue.getNullable()?.let { propertyKey.dataType.serializeAny(it) }
|
||||
json.add(propertyKey.name, serializedValue)
|
||||
}
|
||||
return json
|
||||
}
|
||||
|
||||
fun fromJson(json: JsonObject) {
|
||||
properties.forEach { (key, _) ->
|
||||
val jsonElement = json.get(key.name) ?: return@forEach
|
||||
//TODO: check incoming values
|
||||
properties[key]?.setAny(key.dataType.deserializeAny(jsonElement))
|
||||
}
|
||||
}
|
||||
|
||||
operator fun getValue(t: Any?, property: KProperty<*>) = this.globalState
|
||||
operator fun setValue(t: Any?, property: KProperty<*>, t1: Boolean?) { this.globalState = t1 }
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config
|
||||
|
||||
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
data class PropertyPair<T>(
|
||||
val key: PropertyKey<T>,
|
||||
val value: PropertyValue<*>
|
||||
) {
|
||||
val name get() = key.name
|
||||
}
|
||||
|
||||
enum class FeatureNotice(
|
||||
val id: Int,
|
||||
val key: String
|
||||
) {
|
||||
UNSTABLE(0b0001, "unstable"),
|
||||
BAN_RISK(0b0010, "ban_risk"),
|
||||
INTERNAL_BEHAVIOR(0b0100, "internal_behavior")
|
||||
}
|
||||
|
||||
enum class ConfigFlag(
|
||||
val id: Int
|
||||
) {
|
||||
NO_TRANSLATE(0b000001),
|
||||
HIDDEN(0b000010),
|
||||
FOLDER(0b000100),
|
||||
NO_DISABLE_KEY(0b001000),
|
||||
REQUIRE_RESTART(0b010000),
|
||||
REQUIRE_CLEAN_CACHE(0b100000)
|
||||
}
|
||||
|
||||
class ConfigParams(
|
||||
private var _flags: Int? = null,
|
||||
private var _notices: Int? = null,
|
||||
|
||||
var icon: String? = null,
|
||||
var disabledKey: String? = null,
|
||||
var customTranslationPath: String? = null,
|
||||
var customOptionTranslationPath: String? = null
|
||||
) {
|
||||
val notices get() = _notices?.let { FeatureNotice.entries.filter { flag -> it and flag.id != 0 } } ?: emptyList()
|
||||
val flags get() = _flags?.let { ConfigFlag.entries.filter { flag -> it and flag.id != 0 } } ?: emptyList()
|
||||
|
||||
fun addNotices(vararg values: FeatureNotice) {
|
||||
this._notices = (this._notices ?: 0) or values.fold(0) { acc, featureNotice -> acc or featureNotice.id }
|
||||
}
|
||||
|
||||
fun addFlags(vararg values: ConfigFlag) {
|
||||
this._flags = (this._flags ?: 0) or values.fold(0) { acc, flag -> acc or flag.id }
|
||||
}
|
||||
|
||||
fun requireRestart() {
|
||||
addFlags(ConfigFlag.REQUIRE_RESTART)
|
||||
}
|
||||
fun requireCleanCache() {
|
||||
addFlags(ConfigFlag.REQUIRE_CLEAN_CACHE)
|
||||
}
|
||||
}
|
||||
|
||||
class PropertyValue<T>(
|
||||
private var value: T? = null,
|
||||
val defaultValues: List<*>? = null
|
||||
) {
|
||||
inner class PropertyValueNullable {
|
||||
fun get() = value
|
||||
operator fun getValue(t: Any?, property: KProperty<*>): T? = getNullable()
|
||||
operator fun setValue(t: Any?, property: KProperty<*>, t1: T?) = set(t1)
|
||||
}
|
||||
|
||||
fun nullable() = PropertyValueNullable()
|
||||
|
||||
fun isSet() = value != null
|
||||
fun getNullable() = value?.takeIf { it != "null" }
|
||||
fun isEmpty() = value == null || value == "null" || value.toString().isEmpty()
|
||||
fun get() = getNullable() ?: throw IllegalStateException("Property is not set")
|
||||
fun set(value: T?) { setAny(value) }
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun setAny(value: Any?) { this.value = value as T? }
|
||||
|
||||
operator fun getValue(t: Any?, property: KProperty<*>): T = get()
|
||||
operator fun setValue(t: Any?, property: KProperty<*>, t1: T?) = set(t1)
|
||||
}
|
||||
|
||||
data class PropertyKey<T>(
|
||||
private val _parent: () -> PropertyKey<*>?,
|
||||
val name: String,
|
||||
val dataType: DataProcessors.PropertyDataProcessor<T>,
|
||||
val params: ConfigParams = ConfigParams(),
|
||||
) {
|
||||
private val parentKey by lazy { _parent() }
|
||||
|
||||
fun propertyOption(translation: LocaleWrapper, key: String): String {
|
||||
if (key == "null") {
|
||||
return translation[params.disabledKey ?: "manager.sections.features.disabled"]
|
||||
}
|
||||
|
||||
return if (!params.flags.contains(ConfigFlag.NO_TRANSLATE))
|
||||
translation[params.customOptionTranslationPath?.let {
|
||||
"$it.$key"
|
||||
} ?: "features.options.${name}.$key"]
|
||||
else key
|
||||
}
|
||||
|
||||
fun propertyName() = propertyTranslationPath() + ".name"
|
||||
fun propertyDescription() = propertyTranslationPath() + ".description"
|
||||
|
||||
fun propertyTranslationPath(): String {
|
||||
params.customTranslationPath?.let {
|
||||
return it
|
||||
}
|
||||
return parentKey?.let {
|
||||
"${it.propertyTranslationPath()}.properties.$name"
|
||||
} ?: "features.properties.$name"
|
||||
}
|
||||
}
|
||||
|
@ -1,94 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config
|
||||
|
||||
import com.google.gson.JsonArray
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonNull
|
||||
import com.google.gson.JsonObject
|
||||
import com.google.gson.JsonPrimitive
|
||||
|
||||
object DataProcessors {
|
||||
enum class Type {
|
||||
STRING,
|
||||
BOOLEAN,
|
||||
INTEGER,
|
||||
FLOAT,
|
||||
STRING_MULTIPLE_SELECTION,
|
||||
STRING_UNIQUE_SELECTION,
|
||||
CONTAINER,
|
||||
}
|
||||
|
||||
data class PropertyDataProcessor<T>
|
||||
internal constructor(
|
||||
val type: Type,
|
||||
private val serialize: (T) -> JsonElement,
|
||||
private val deserialize: (JsonElement) -> T
|
||||
) {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun serializeAny(value: Any) = serialize(value as T)
|
||||
fun deserializeAny(value: JsonElement) = deserialize(value)
|
||||
}
|
||||
|
||||
val STRING = PropertyDataProcessor(
|
||||
type = Type.STRING,
|
||||
serialize = {
|
||||
if (it != null) JsonPrimitive(it)
|
||||
else JsonNull.INSTANCE
|
||||
},
|
||||
deserialize = {
|
||||
if (it.isJsonNull) null
|
||||
else it.asString
|
||||
},
|
||||
)
|
||||
|
||||
val BOOLEAN = PropertyDataProcessor(
|
||||
type = Type.BOOLEAN,
|
||||
serialize = {
|
||||
if (it) JsonPrimitive(true)
|
||||
else JsonPrimitive(false)
|
||||
},
|
||||
deserialize = { it.asBoolean },
|
||||
)
|
||||
|
||||
val INTEGER = PropertyDataProcessor(
|
||||
type = Type.INTEGER,
|
||||
serialize = { JsonPrimitive(it) },
|
||||
deserialize = { it.asInt },
|
||||
)
|
||||
|
||||
val FLOAT = PropertyDataProcessor(
|
||||
type = Type.FLOAT,
|
||||
serialize = { JsonPrimitive(it) },
|
||||
deserialize = { it.asFloat },
|
||||
)
|
||||
|
||||
val STRING_MULTIPLE_SELECTION = PropertyDataProcessor(
|
||||
type = Type.STRING_MULTIPLE_SELECTION,
|
||||
serialize = { JsonArray().apply { it.forEach { add(it) } } },
|
||||
deserialize = { obj ->
|
||||
obj.asJsonArray.map { it.asString }.toMutableList()
|
||||
},
|
||||
)
|
||||
|
||||
val STRING_UNIQUE_SELECTION = PropertyDataProcessor(
|
||||
type = Type.STRING_UNIQUE_SELECTION,
|
||||
serialize = { JsonPrimitive(it) },
|
||||
deserialize = { obj -> obj.takeIf { !it.isJsonNull }?.asString }
|
||||
)
|
||||
|
||||
fun <T : ConfigContainer> container(container: T) = PropertyDataProcessor(
|
||||
type = Type.CONTAINER,
|
||||
serialize = {
|
||||
JsonObject().apply {
|
||||
addProperty("state", it.globalState)
|
||||
add("properties", it.toJson())
|
||||
}
|
||||
},
|
||||
deserialize = { obj ->
|
||||
val jsonObject = obj.asJsonObject
|
||||
container.apply {
|
||||
globalState = jsonObject["state"].takeIf { !it.isJsonNull }?.asBoolean
|
||||
fromJson(jsonObject["properties"].asJsonObject)
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
@ -1,132 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config
|
||||
|
||||
import android.content.Context
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.JsonObject
|
||||
import me.rhunk.snapenhance.bridge.ConfigStateListener
|
||||
import me.rhunk.snapenhance.core.Logger
|
||||
import me.rhunk.snapenhance.core.bridge.BridgeClient
|
||||
import me.rhunk.snapenhance.core.bridge.FileLoaderWrapper
|
||||
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
|
||||
import me.rhunk.snapenhance.core.bridge.wrapper.LocaleWrapper
|
||||
import me.rhunk.snapenhance.core.config.impl.RootConfig
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
class ModConfig {
|
||||
var locale: String = LocaleWrapper.DEFAULT_LOCALE
|
||||
|
||||
private val gson: Gson = GsonBuilder().setPrettyPrinting().create()
|
||||
private val file = FileLoaderWrapper(BridgeFileType.CONFIG, "{}".toByteArray(Charsets.UTF_8))
|
||||
var wasPresent by Delegates.notNull<Boolean>()
|
||||
|
||||
/* Used to notify the bridge client about config changes */
|
||||
var configStateListener: ConfigStateListener? = null
|
||||
lateinit var root: RootConfig
|
||||
private set
|
||||
|
||||
private fun load() {
|
||||
root = RootConfig()
|
||||
wasPresent = file.isFileExists()
|
||||
if (!file.isFileExists()) {
|
||||
writeConfig()
|
||||
return
|
||||
}
|
||||
|
||||
runCatching {
|
||||
loadConfig()
|
||||
}.onFailure {
|
||||
writeConfig()
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadConfig() {
|
||||
val configFileContent = file.read()
|
||||
val configObject = gson.fromJson(configFileContent.toString(Charsets.UTF_8), JsonObject::class.java)
|
||||
locale = configObject.get("_locale")?.asString ?: LocaleWrapper.DEFAULT_LOCALE
|
||||
root.fromJson(configObject)
|
||||
}
|
||||
|
||||
fun exportToString(): String {
|
||||
val configObject = root.toJson()
|
||||
configObject.addProperty("_locale", locale)
|
||||
return configObject.toString()
|
||||
}
|
||||
|
||||
fun reset() {
|
||||
root = RootConfig()
|
||||
writeConfig()
|
||||
}
|
||||
|
||||
fun writeConfig() {
|
||||
var shouldRestart = false
|
||||
var shouldCleanCache = false
|
||||
var configChanged = false
|
||||
|
||||
fun compareDiff(originalContainer: ConfigContainer, modifiedContainer: ConfigContainer) {
|
||||
val parentContainerFlags = modifiedContainer.parentContainerKey?.params?.flags ?: emptySet()
|
||||
|
||||
parentContainerFlags.takeIf { originalContainer.hasGlobalState }?.apply {
|
||||
if (modifiedContainer.globalState != originalContainer.globalState) {
|
||||
configChanged = true
|
||||
if (contains(ConfigFlag.REQUIRE_RESTART)) shouldRestart = true
|
||||
if (contains(ConfigFlag.REQUIRE_CLEAN_CACHE)) shouldCleanCache = true
|
||||
}
|
||||
}
|
||||
|
||||
for (property in modifiedContainer.properties) {
|
||||
val modifiedValue = property.value.getNullable()
|
||||
val originalValue = originalContainer.properties.entries.firstOrNull {
|
||||
it.key.name == property.key.name
|
||||
}?.value?.getNullable()
|
||||
|
||||
if (originalValue is ConfigContainer && modifiedValue is ConfigContainer) {
|
||||
compareDiff(originalValue, modifiedValue)
|
||||
continue
|
||||
}
|
||||
|
||||
if (modifiedValue != originalValue) {
|
||||
val flags = property.key.params.flags + parentContainerFlags
|
||||
configChanged = true
|
||||
if (flags.contains(ConfigFlag.REQUIRE_RESTART)) shouldRestart = true
|
||||
if (flags.contains(ConfigFlag.REQUIRE_CLEAN_CACHE)) shouldCleanCache = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
configStateListener?.also {
|
||||
runCatching {
|
||||
compareDiff(RootConfig().apply {
|
||||
fromJson(gson.fromJson(file.read().toString(Charsets.UTF_8), JsonObject::class.java))
|
||||
}, root)
|
||||
|
||||
if (configChanged) {
|
||||
it.onConfigChanged()
|
||||
if (shouldCleanCache) it.onCleanCacheRequired()
|
||||
else if (shouldRestart) it.onRestartRequired()
|
||||
}
|
||||
}.onFailure {
|
||||
Logger.directError("Error while calling config state listener", it, "ConfigStateListener")
|
||||
}
|
||||
}
|
||||
|
||||
file.write(exportToString().toByteArray(Charsets.UTF_8))
|
||||
}
|
||||
|
||||
fun loadFromString(string: String) {
|
||||
val configObject = gson.fromJson(string, JsonObject::class.java)
|
||||
locale = configObject.get("_locale")?.asString ?: LocaleWrapper.DEFAULT_LOCALE
|
||||
root.fromJson(configObject)
|
||||
writeConfig()
|
||||
}
|
||||
|
||||
fun loadFromContext(context: Context) {
|
||||
file.loadFromContext(context)
|
||||
load()
|
||||
}
|
||||
|
||||
fun loadFromBridge(bridgeClient: BridgeClient) {
|
||||
file.loadFromBridge(bridgeClient)
|
||||
load()
|
||||
}
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.ConfigFlag
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
import me.rhunk.snapenhance.features.impl.tweaks.CameraTweaks
|
||||
|
||||
class Camera : ConfigContainer() {
|
||||
val disable = boolean("disable_camera")
|
||||
val immersiveCameraPreview = boolean("immersive_camera_preview") { addNotices(FeatureNotice.UNSTABLE) }
|
||||
val overridePreviewResolution = unique("override_preview_resolution", *CameraTweaks.resolutions.toTypedArray())
|
||||
{ addFlags(ConfigFlag.NO_TRANSLATE) }
|
||||
val overridePictureResolution = unique("override_picture_resolution", *CameraTweaks.resolutions.toTypedArray())
|
||||
{ addFlags(ConfigFlag.NO_TRANSLATE) }
|
||||
val customFrameRate = unique("custom_frame_rate",
|
||||
"5", "10", "20", "25", "30", "48", "60", "90", "120"
|
||||
) { addNotices(FeatureNotice.UNSTABLE); addFlags(ConfigFlag.NO_TRANSLATE) }
|
||||
val forceCameraSourceEncoding = boolean("force_camera_source_encoding")
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.ConfigFlag
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
|
||||
class DownloaderConfig : ConfigContainer() {
|
||||
inner class FFMpegOptions : ConfigContainer() {
|
||||
val threads = integer("threads", 1)
|
||||
val preset = unique("preset", "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow") {
|
||||
addFlags(ConfigFlag.NO_TRANSLATE)
|
||||
}
|
||||
val constantRateFactor = integer("constant_rate_factor", 30)
|
||||
val videoBitrate = integer("video_bitrate", 5000)
|
||||
val audioBitrate = integer("audio_bitrate", 128)
|
||||
val customVideoCodec = string("custom_video_codec") { addFlags(ConfigFlag.NO_TRANSLATE) }
|
||||
val customAudioCodec = string("custom_audio_codec") { addFlags(ConfigFlag.NO_TRANSLATE) }
|
||||
}
|
||||
|
||||
val saveFolder = string("save_folder") { addFlags(ConfigFlag.FOLDER); requireRestart() }
|
||||
val autoDownloadSources = multiple("auto_download_sources",
|
||||
"friend_snaps",
|
||||
"friend_stories",
|
||||
"public_stories",
|
||||
"spotlight"
|
||||
)
|
||||
val preventSelfAutoDownload = boolean("prevent_self_auto_download")
|
||||
val pathFormat = multiple("path_format",
|
||||
"create_author_folder",
|
||||
"create_source_folder",
|
||||
"append_hash",
|
||||
"append_source",
|
||||
"append_username",
|
||||
"append_date_time",
|
||||
).apply { set(mutableListOf("append_hash", "append_date_time", "append_type", "append_username")) }
|
||||
val allowDuplicate = boolean("allow_duplicate")
|
||||
val mergeOverlays = boolean("merge_overlays") { addNotices(FeatureNotice.UNSTABLE) }
|
||||
val forceImageFormat = unique("force_image_format", "jpg", "png", "webp") {
|
||||
addFlags(ConfigFlag.NO_TRANSLATE)
|
||||
}
|
||||
val forceVoiceNoteFormat = unique("force_voice_note_format", "aac", "mp3", "opus") {
|
||||
addFlags(ConfigFlag.NO_TRANSLATE)
|
||||
}
|
||||
val downloadProfilePictures = boolean("download_profile_pictures") { requireRestart() }
|
||||
val chatDownloadContextMenu = boolean("chat_download_context_menu")
|
||||
val ffmpegOptions = container("ffmpeg_options", FFMpegOptions()) { addNotices(FeatureNotice.UNSTABLE) }
|
||||
val logging = multiple("logging", "started", "success", "progress", "failure").apply {
|
||||
set(mutableListOf("started", "success"))
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
|
||||
class E2EEConfig : ConfigContainer(hasGlobalState = true) {
|
||||
val encryptedMessageIndicator = boolean("encrypted_message_indicator")
|
||||
val forceMessageEncryption = boolean("force_message_encryption")
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
|
||||
class Experimental : ConfigContainer() {
|
||||
val nativeHooks = container("native_hooks", NativeHooks()) { icon = "Memory"; requireRestart() }
|
||||
val spoof = container("spoof", Spoof()) { icon = "Fingerprint" }
|
||||
val appPasscode = string("app_passcode")
|
||||
val appLockOnResume = boolean("app_lock_on_resume")
|
||||
val infiniteStoryBoost = boolean("infinite_story_boost")
|
||||
val meoPasscodeBypass = boolean("meo_passcode_bypass")
|
||||
val unlimitedMultiSnap = boolean("unlimited_multi_snap") { addNotices(FeatureNotice.BAN_RISK)}
|
||||
val noFriendScoreDelay = boolean("no_friend_score_delay") { requireRestart()}
|
||||
val e2eEncryption = container("e2ee", E2EEConfig()) { requireRestart()}
|
||||
val hiddenSnapchatPlusFeatures = boolean("hidden_snapchat_plus_features") {
|
||||
addNotices(FeatureNotice.BAN_RISK, FeatureNotice.UNSTABLE)
|
||||
requireRestart()
|
||||
}
|
||||
val addFriendSourceSpoof = unique("add_friend_source_spoof",
|
||||
"added_by_username",
|
||||
"added_by_mention",
|
||||
"added_by_group_chat",
|
||||
"added_by_qr_code",
|
||||
"added_by_community",
|
||||
) { addNotices(FeatureNotice.BAN_RISK) }
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
|
||||
class Global : ConfigContainer() {
|
||||
val snapchatPlus = boolean("snapchat_plus") { addNotices(FeatureNotice.BAN_RISK); requireRestart() }
|
||||
val disableMetrics = boolean("disable_metrics")
|
||||
val blockAds = boolean("block_ads")
|
||||
val bypassVideoLengthRestriction = unique("bypass_video_length_restriction", "split", "single") { addNotices(FeatureNotice.BAN_RISK); requireRestart() }
|
||||
val disableGooglePlayDialogs = boolean("disable_google_play_dialogs") { requireRestart() }
|
||||
val forceMediaSourceQuality = boolean("force_media_source_quality")
|
||||
val disableSnapSplitting = boolean("disable_snap_splitting") { addNotices(FeatureNotice.INTERNAL_BEHAVIOR) }
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
import me.rhunk.snapenhance.data.NotificationType
|
||||
|
||||
class MessagingTweaks : ConfigContainer() {
|
||||
val anonymousStoryViewing = boolean("anonymous_story_viewing")
|
||||
val hideBitmojiPresence = boolean("hide_bitmoji_presence")
|
||||
val hideTypingNotifications = boolean("hide_typing_notifications")
|
||||
val unlimitedSnapViewTime = boolean("unlimited_snap_view_time")
|
||||
val disableReplayInFF = boolean("disable_replay_in_ff")
|
||||
val autoSaveMessagesInConversations = multiple("auto_save_messages_in_conversations",
|
||||
"CHAT",
|
||||
"SNAP",
|
||||
"NOTE",
|
||||
"EXTERNAL_MEDIA",
|
||||
"STICKER"
|
||||
) { requireRestart() }
|
||||
val snapToChatMedia = boolean("snap_to_chat_media") { requireRestart() }
|
||||
val preventMessageSending = multiple("prevent_message_sending", *NotificationType.getOutgoingValues().map { it.key }.toTypedArray()) {
|
||||
customOptionTranslationPath = "features.options.notifications"
|
||||
}
|
||||
val betterNotifications = multiple("better_notifications", "snap", "chat", "reply_button", "download_button", "group") { requireRestart() }
|
||||
val notificationBlacklist = multiple("notification_blacklist", *NotificationType.getIncomingValues().map { it.key }.toTypedArray()) {
|
||||
customOptionTranslationPath = "features.options.notifications"
|
||||
}
|
||||
val messageLogger = boolean("message_logger") { addNotices(FeatureNotice.UNSTABLE); requireRestart() }
|
||||
val galleryMediaSendOverride = boolean("gallery_media_send_override")
|
||||
val messagePreviewLength = integer("message_preview_length", defaultValue = 20)
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
|
||||
class NativeHooks: ConfigContainer(hasGlobalState = true) {
|
||||
val disableBitmoji = boolean("disable_bitmoji")
|
||||
val fixGalleryMediaOverride = boolean("fix_gallery_media_override")
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
|
||||
class RootConfig : ConfigContainer() {
|
||||
val downloader = container("downloader", DownloaderConfig()) { icon = "Download"}
|
||||
val userInterface = container("user_interface", UserInterfaceTweaks()) { icon = "RemoveRedEye"}
|
||||
val messaging = container("messaging", MessagingTweaks()) { icon = "Send" }
|
||||
val global = container("global", Global()) { icon = "MiscellaneousServices" }
|
||||
val rules = container("rules", Rules()) { icon = "Rule" }
|
||||
val camera = container("camera", Camera()) { icon = "Camera"; requireRestart() }
|
||||
val streaksReminder = container("streaks_reminder", StreaksReminderConfig()) { icon = "Alarm" }
|
||||
val experimental = container("experimental", Experimental()) {
|
||||
icon = "Science"; addNotices(FeatureNotice.UNSTABLE)
|
||||
}
|
||||
val scripting = container("scripting", Scripting()) { icon = "DataObject" }
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.PropertyValue
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
|
||||
import me.rhunk.snapenhance.core.messaging.RuleState
|
||||
|
||||
|
||||
class Rules : ConfigContainer() {
|
||||
private val rules = mutableMapOf<MessagingRuleType, PropertyValue<String>>()
|
||||
|
||||
fun getRuleState(ruleType: MessagingRuleType): RuleState? {
|
||||
return rules[ruleType]?.getNullable()?.let { RuleState.getByName(it) }
|
||||
}
|
||||
|
||||
init {
|
||||
MessagingRuleType.entries.filter { it.listMode }.forEach { ruleType ->
|
||||
rules[ruleType] = unique(ruleType.key,"whitelist", "blacklist") {
|
||||
customTranslationPath = "rules.properties.${ruleType.key}"
|
||||
customOptionTranslationPath = "rules.modes"
|
||||
}.apply {
|
||||
set("whitelist")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.ConfigFlag
|
||||
|
||||
class Scripting : ConfigContainer() {
|
||||
val developerMode = boolean("developer_mode", false) { requireRestart() }
|
||||
val moduleFolder = string("module_folder", "modules") { addFlags(ConfigFlag.FOLDER); requireRestart() }
|
||||
val hotReload = boolean("hot_reload", false)
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
|
||||
class Spoof : ConfigContainer() {
|
||||
inner class Location : ConfigContainer(hasGlobalState = true) {
|
||||
val latitude = float("location_latitude")
|
||||
val longitude = float("location_longitude")
|
||||
}
|
||||
val location = container("location", Location())
|
||||
|
||||
inner class Device : ConfigContainer(hasGlobalState = true) {
|
||||
val fingerprint = string("fingerprint")
|
||||
val androidId = string("android_id")
|
||||
val getInstallerPackageName = string("installer_package_name")
|
||||
val debugFlag = boolean("debug_flag")
|
||||
val mockLocationState = boolean("mock_location")
|
||||
val splitClassLoader = string("split_classloader")
|
||||
val isLowEndDevice = string("low_end_device")
|
||||
val getDataDirectory = string("get_data_directory")
|
||||
}
|
||||
val device = container("device", Device()) { addNotices(FeatureNotice.BAN_RISK) }
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
|
||||
class StreaksReminderConfig : ConfigContainer(hasGlobalState = true) {
|
||||
val interval = integer("interval", 2)
|
||||
val remainingHours = integer("remaining_hours", 13)
|
||||
val groupNotifications = boolean("group_notifications", true)
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.config.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.config.ConfigContainer
|
||||
import me.rhunk.snapenhance.core.config.FeatureNotice
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
|
||||
import me.rhunk.snapenhance.features.impl.ui.ClientBootstrapOverride
|
||||
|
||||
class UserInterfaceTweaks : ConfigContainer() {
|
||||
inner class BootstrapOverride : ConfigContainer() {
|
||||
val appAppearance = unique("app_appearance", "always_light", "always_dark")
|
||||
val homeTab = unique("home_tab", *ClientBootstrapOverride.tabs) { addNotices(FeatureNotice.UNSTABLE) }
|
||||
}
|
||||
|
||||
inner class FriendFeedMessagePreview : ConfigContainer(hasGlobalState = true) {
|
||||
val amount = integer("amount", defaultValue = 1)
|
||||
}
|
||||
|
||||
val friendFeedMenuButtons = multiple(
|
||||
"friend_feed_menu_buttons","conversation_info", *MessagingRuleType.entries.filter { it.showInFriendMenu }.map { it.key }.toTypedArray()
|
||||
).apply {
|
||||
set(mutableListOf("conversation_info", MessagingRuleType.STEALTH.key))
|
||||
}
|
||||
val friendFeedMenuPosition = integer("friend_feed_menu_position", defaultValue = 1)
|
||||
val amoledDarkMode = boolean("amoled_dark_mode") { addNotices(FeatureNotice.UNSTABLE); requireRestart() }
|
||||
val friendFeedMessagePreview = container("friend_feed_message_preview", FriendFeedMessagePreview()) { requireRestart() }
|
||||
val bootstrapOverride = container("bootstrap_override", BootstrapOverride()) { requireRestart() }
|
||||
val mapFriendNameTags = boolean("map_friend_nametags") { requireRestart() }
|
||||
val streakExpirationInfo = boolean("streak_expiration_info") { requireRestart() }
|
||||
val hideStreakRestore = boolean("hide_streak_restore") { requireRestart() }
|
||||
val hideStorySections = multiple("hide_story_sections",
|
||||
"hide_friend_suggestions", "hide_friends", "hide_suggested", "hide_for_you") { requireRestart() }
|
||||
val hideUiComponents = multiple("hide_ui_components",
|
||||
"hide_voice_record_button",
|
||||
"hide_stickers_button",
|
||||
"hide_live_location_share_button",
|
||||
"hide_chat_call_buttons",
|
||||
"hide_profile_call_buttons"
|
||||
) { requireRestart() }
|
||||
val ddBitmojiSelfie = boolean("2d_bitmoji_selfie") { requireCleanCache() }
|
||||
val disableSpotlight = boolean("disable_spotlight") { requireRestart() }
|
||||
val storyViewerOverride = unique("story_viewer_override", "DISCOVER_PLAYBACK_SEEKBAR", "VERTICAL_STORY_VIEWER") { requireRestart() }
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.data
|
||||
package me.rhunk.snapenhance.core.data
|
||||
|
||||
class SnapClassCache (
|
||||
private val classLoader: ClassLoader
|
@ -2,15 +2,16 @@ package me.rhunk.snapenhance.core.database
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.database.sqlite.SQLiteDatabase
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.core.Logger
|
||||
import me.rhunk.snapenhance.core.database.objects.ConversationMessage
|
||||
import me.rhunk.snapenhance.core.database.objects.FriendFeedEntry
|
||||
import me.rhunk.snapenhance.core.database.objects.FriendInfo
|
||||
import me.rhunk.snapenhance.core.database.objects.StoryEntry
|
||||
import me.rhunk.snapenhance.core.database.objects.UserConversationLink
|
||||
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
|
||||
import me.rhunk.snapenhance.manager.Manager
|
||||
import me.rhunk.snapenhance.common.database.DatabaseObject
|
||||
import me.rhunk.snapenhance.common.database.impl.ConversationMessage
|
||||
import me.rhunk.snapenhance.common.database.impl.FriendFeedEntry
|
||||
import me.rhunk.snapenhance.common.database.impl.FriendInfo
|
||||
import me.rhunk.snapenhance.common.database.impl.StoryEntry
|
||||
import me.rhunk.snapenhance.common.database.impl.UserConversationLink
|
||||
import me.rhunk.snapenhance.common.util.ktx.getStringOrNull
|
||||
import me.rhunk.snapenhance.core.ModContext
|
||||
import me.rhunk.snapenhance.core.logger.CoreLogger
|
||||
import me.rhunk.snapenhance.core.manager.Manager
|
||||
import java.io.File
|
||||
|
||||
@SuppressLint("Range")
|
||||
@ -56,7 +57,7 @@ class DatabaseAccess(private val context: ModContext) : Manager {
|
||||
return runCatching {
|
||||
query(database)
|
||||
}.onFailure {
|
||||
Logger.xposedLog("Database operation failed", it)
|
||||
CoreLogger.xposedLog("Database operation failed", it)
|
||||
}.getOrNull()
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.database
|
||||
|
||||
import android.database.Cursor
|
||||
|
||||
interface DatabaseObject {
|
||||
fun write(cursor: Cursor)
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.database.objects
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.database.Cursor
|
||||
import me.rhunk.snapenhance.Constants
|
||||
import me.rhunk.snapenhance.core.database.DatabaseObject
|
||||
import me.rhunk.snapenhance.core.util.ktx.getBlobOrNull
|
||||
import me.rhunk.snapenhance.core.util.ktx.getInteger
|
||||
import me.rhunk.snapenhance.core.util.ktx.getLong
|
||||
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.data.ContentType
|
||||
|
||||
@Suppress("ArrayInDataClass")
|
||||
data class ConversationMessage(
|
||||
var clientConversationId: String? = null,
|
||||
var clientMessageId: Int = 0,
|
||||
var serverMessageId: Int = 0,
|
||||
var messageContent: ByteArray? = null,
|
||||
var isSaved: Int = 0,
|
||||
var isViewedByUser: Int = 0,
|
||||
var contentType: Int = 0,
|
||||
var creationTimestamp: Long = 0,
|
||||
var readTimestamp: Long = 0,
|
||||
var senderId: String? = null
|
||||
) : DatabaseObject {
|
||||
|
||||
@SuppressLint("Range")
|
||||
override fun write(cursor: Cursor) {
|
||||
with(cursor) {
|
||||
clientConversationId = getStringOrNull("client_conversation_id")
|
||||
clientMessageId = getInteger("client_message_id")
|
||||
serverMessageId = getInteger("server_message_id")
|
||||
messageContent = getBlobOrNull("message_content")
|
||||
isSaved = getInteger("is_saved")
|
||||
isViewedByUser = getInteger("is_viewed_by_user")
|
||||
contentType = getInteger("content_type")
|
||||
creationTimestamp = getLong("creation_timestamp")
|
||||
readTimestamp = getLong("read_timestamp")
|
||||
senderId = getStringOrNull("sender_id")
|
||||
}
|
||||
}
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.database.objects
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.database.Cursor
|
||||
import me.rhunk.snapenhance.core.database.DatabaseObject
|
||||
import me.rhunk.snapenhance.core.util.ktx.getIntOrNull
|
||||
import me.rhunk.snapenhance.core.util.ktx.getInteger
|
||||
import me.rhunk.snapenhance.core.util.ktx.getLong
|
||||
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
|
||||
|
||||
data class FriendFeedEntry(
|
||||
var id: Int = 0,
|
||||
var feedDisplayName: String? = null,
|
||||
var participantsSize: Int = 0,
|
||||
var lastInteractionTimestamp: Long = 0,
|
||||
var displayTimestamp: Long = 0,
|
||||
var displayInteractionType: String? = null,
|
||||
var lastInteractionUserId: Int? = null,
|
||||
var key: String? = null,
|
||||
var friendUserId: String? = null,
|
||||
var friendDisplayName: String? = null,
|
||||
var friendDisplayUsername: String? = null,
|
||||
var friendLinkType: Int? = null,
|
||||
var bitmojiAvatarId: String? = null,
|
||||
var bitmojiSelfieId: String? = null,
|
||||
) : DatabaseObject {
|
||||
|
||||
@SuppressLint("Range")
|
||||
override fun write(cursor: Cursor) {
|
||||
with(cursor) {
|
||||
id = getInteger("_id")
|
||||
feedDisplayName = getStringOrNull("feedDisplayName")
|
||||
participantsSize = getInteger("participantsSize")
|
||||
lastInteractionTimestamp = getLong("lastInteractionTimestamp")
|
||||
displayTimestamp = getLong("displayTimestamp")
|
||||
displayInteractionType = getStringOrNull("displayInteractionType")
|
||||
lastInteractionUserId = getIntOrNull("lastInteractionUserId")
|
||||
key = getStringOrNull("key")
|
||||
friendUserId = getStringOrNull("friendUserId")
|
||||
friendDisplayName = getStringOrNull("friendDisplayName")
|
||||
friendDisplayUsername = getStringOrNull("friendDisplayUsername")
|
||||
friendLinkType = getIntOrNull("friendLinkType")
|
||||
bitmojiAvatarId = getStringOrNull("bitmojiAvatarId")
|
||||
bitmojiSelfieId = getStringOrNull("bitmojiSelfieId")
|
||||
}
|
||||
}
|
||||
}
|
@ -1,72 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.database.objects
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.database.Cursor
|
||||
import me.rhunk.snapenhance.core.database.DatabaseObject
|
||||
import me.rhunk.snapenhance.core.util.SerializableDataObject
|
||||
import me.rhunk.snapenhance.core.util.ktx.getInteger
|
||||
import me.rhunk.snapenhance.core.util.ktx.getLong
|
||||
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
|
||||
|
||||
data class FriendInfo(
|
||||
var id: Int = 0,
|
||||
var lastModifiedTimestamp: Long = 0,
|
||||
var username: String? = null,
|
||||
var userId: String? = null,
|
||||
var displayName: String? = null,
|
||||
var bitmojiAvatarId: String? = null,
|
||||
var bitmojiSelfieId: String? = null,
|
||||
var bitmojiSceneId: String? = null,
|
||||
var bitmojiBackgroundId: String? = null,
|
||||
var friendmojis: String? = null,
|
||||
var friendmojiCategories: String? = null,
|
||||
var snapScore: Int = 0,
|
||||
var birthday: Long = 0,
|
||||
var addedTimestamp: Long = 0,
|
||||
var reverseAddedTimestamp: Long = 0,
|
||||
var serverDisplayName: String? = null,
|
||||
var streakLength: Int = 0,
|
||||
var streakExpirationTimestamp: Long = 0,
|
||||
var reverseBestFriendRanking: Int = 0,
|
||||
var isPinnedBestFriend: Int = 0,
|
||||
var plusBadgeVisibility: Int = 0,
|
||||
var usernameForSorting: String? = null,
|
||||
var friendLinkType: Int = 0,
|
||||
var postViewEmoji: String? = null,
|
||||
) : DatabaseObject, SerializableDataObject() {
|
||||
val mutableUsername get() = username?.split("|")?.last()
|
||||
val firstCreatedUsername get() = username?.split("|")?.first()
|
||||
|
||||
@SuppressLint("Range")
|
||||
override fun write(cursor: Cursor) {
|
||||
with(cursor) {
|
||||
id = getInteger("_id")
|
||||
lastModifiedTimestamp = getLong("_lastModifiedTimestamp")
|
||||
username = getStringOrNull("username")
|
||||
userId = getStringOrNull("userId")
|
||||
displayName = getStringOrNull("displayName")
|
||||
bitmojiAvatarId = getStringOrNull("bitmojiAvatarId")
|
||||
bitmojiSelfieId = getStringOrNull("bitmojiSelfieId")
|
||||
bitmojiSceneId = getStringOrNull("bitmojiSceneId")
|
||||
bitmojiBackgroundId = getStringOrNull("bitmojiBackgroundId")
|
||||
friendmojis = getStringOrNull("friendmojis")
|
||||
friendmojiCategories = getStringOrNull("friendmojiCategories")
|
||||
snapScore = getInteger("score")
|
||||
birthday = getLong("birthday")
|
||||
addedTimestamp = getLong("addedTimestamp")
|
||||
reverseAddedTimestamp = getLong("reverseAddedTimestamp")
|
||||
serverDisplayName = getStringOrNull("serverDisplayName")
|
||||
streakLength = getInteger("streakLength")
|
||||
streakExpirationTimestamp = getLong("streakExpiration")
|
||||
reverseBestFriendRanking = getInteger("reverseBestFriendRanking")
|
||||
usernameForSorting = getStringOrNull("usernameForSorting")
|
||||
friendLinkType = getInteger("friendLinkType")
|
||||
postViewEmoji = getStringOrNull("postViewEmoji")
|
||||
if (getColumnIndex("isPinnedBestFriend") != -1) isPinnedBestFriend =
|
||||
getInteger("isPinnedBestFriend")
|
||||
if (getColumnIndex("plusBadgeVisibility") != -1) plusBadgeVisibility =
|
||||
getInteger("plusBadgeVisibility")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.database.objects
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.database.Cursor
|
||||
import me.rhunk.snapenhance.core.database.DatabaseObject
|
||||
import me.rhunk.snapenhance.core.util.ktx.getInteger
|
||||
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
|
||||
|
||||
data class StoryEntry(
|
||||
var id: Int = 0,
|
||||
var storyId: String? = null,
|
||||
var displayName: String? = null,
|
||||
var isLocal: Boolean? = null,
|
||||
var userId: String? = null
|
||||
) : DatabaseObject {
|
||||
|
||||
@SuppressLint("Range")
|
||||
override fun write(cursor: Cursor) {
|
||||
with(cursor) {
|
||||
id = getInteger("_id")
|
||||
storyId = getStringOrNull("storyId")
|
||||
displayName = getStringOrNull("displayName")
|
||||
isLocal = getInteger("isLocal") == 1
|
||||
userId = getStringOrNull("userId")
|
||||
}
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.database.objects
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.database.Cursor
|
||||
import me.rhunk.snapenhance.core.database.DatabaseObject
|
||||
import me.rhunk.snapenhance.core.util.ktx.getInteger
|
||||
import me.rhunk.snapenhance.core.util.ktx.getStringOrNull
|
||||
|
||||
class UserConversationLink(
|
||||
var userId: String? = null,
|
||||
var clientConversationId: String? = null,
|
||||
var conversationType: Int = 0
|
||||
) : DatabaseObject {
|
||||
|
||||
@SuppressLint("Range")
|
||||
override fun write(cursor: Cursor) {
|
||||
with(cursor) {
|
||||
userId = getStringOrNull("user_id")
|
||||
clientConversationId = getStringOrNull("client_conversation_id")
|
||||
conversationType = getInteger("conversation_type")
|
||||
}
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
import android.net.Uri
|
||||
|
||||
enum class DownloadMediaType {
|
||||
PROTO_MEDIA,
|
||||
DIRECT_MEDIA,
|
||||
REMOTE_MEDIA,
|
||||
LOCAL_MEDIA;
|
||||
|
||||
companion object {
|
||||
fun fromUri(uri: Uri): DownloadMediaType {
|
||||
return when (uri.scheme) {
|
||||
"proto" -> PROTO_MEDIA
|
||||
"direct" -> DIRECT_MEDIA
|
||||
"http", "https" -> REMOTE_MEDIA
|
||||
"file" -> LOCAL_MEDIA
|
||||
else -> throw IllegalArgumentException("Unknown uri scheme: ${uri.scheme}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
data class DownloadMetadata(
|
||||
val mediaIdentifier: String?,
|
||||
val outputPath: String,
|
||||
val mediaAuthor: String?,
|
||||
val downloadSource: String,
|
||||
val iconUrl: String?
|
||||
)
|
@ -1,28 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
|
||||
data class DashOptions(val offsetTime: Long, val duration: Long?)
|
||||
data class InputMedia(
|
||||
val content: String,
|
||||
val type: DownloadMediaType,
|
||||
val encryption: MediaEncryptionKeyPair? = null,
|
||||
val attachmentType: String? = null,
|
||||
val isOverlay: Boolean = false,
|
||||
)
|
||||
|
||||
class DownloadRequest(
|
||||
val inputMedias: Array<InputMedia>,
|
||||
val dashOptions: DashOptions? = null,
|
||||
private val flags: Int = 0,
|
||||
) {
|
||||
object Flags {
|
||||
const val MERGE_OVERLAY = 1
|
||||
const val IS_DASH_PLAYLIST = 2
|
||||
}
|
||||
|
||||
val isDashPlaylist: Boolean
|
||||
get() = flags and Flags.IS_DASH_PLAYLIST != 0
|
||||
|
||||
val shouldMergeOverlay: Boolean
|
||||
get() = flags and Flags.MERGE_OVERLAY != 0
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
enum class DownloadStage(
|
||||
val isFinalStage: Boolean = false,
|
||||
) {
|
||||
PENDING(false),
|
||||
DOWNLOADING(false),
|
||||
MERGING(false),
|
||||
DOWNLOADED(true),
|
||||
SAVED(true),
|
||||
MERGE_FAILED(true),
|
||||
FAILED(true),
|
||||
CANCELLED(true)
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
enum class MediaDownloadSource(
|
||||
val key: String,
|
||||
val displayName: String = key,
|
||||
val pathName: String = key,
|
||||
val ignoreFilter: Boolean = false
|
||||
) {
|
||||
NONE("none", "None", ignoreFilter = true),
|
||||
PENDING("pending", "Pending", ignoreFilter = true),
|
||||
CHAT_MEDIA("chat_media", "Chat Media", "chat_media"),
|
||||
STORY("story", "Story", "story"),
|
||||
PUBLIC_STORY("public_story", "Public Story", "public_story"),
|
||||
SPOTLIGHT("spotlight", "Spotlight", "spotlight"),
|
||||
PROFILE_PICTURE("profile_picture", "Profile Picture", "profile_picture");
|
||||
|
||||
fun matches(source: String?): Boolean {
|
||||
if (source == null) return false
|
||||
return source.contains(key, ignoreCase = true)
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun fromKey(key: String?): MediaDownloadSource {
|
||||
if (key == null) return NONE
|
||||
return entries.find { it.key == key } ?: NONE
|
||||
}
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
@file:OptIn(ExperimentalEncodingApi::class)
|
||||
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.media.EncryptionWrapper
|
||||
import java.io.InputStream
|
||||
import javax.crypto.Cipher
|
||||
import javax.crypto.CipherInputStream
|
||||
import javax.crypto.spec.IvParameterSpec
|
||||
import javax.crypto.spec.SecretKeySpec
|
||||
import kotlin.io.encoding.Base64
|
||||
import kotlin.io.encoding.ExperimentalEncodingApi
|
||||
|
||||
// key and iv are base64 encoded into url safe strings
|
||||
data class MediaEncryptionKeyPair(
|
||||
val key: String,
|
||||
val iv: String
|
||||
) {
|
||||
fun decryptInputStream(inputStream: InputStream): InputStream {
|
||||
val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
|
||||
cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(Base64.UrlSafe.decode(key), "AES"), IvParameterSpec(Base64.UrlSafe.decode(iv)))
|
||||
return CipherInputStream(inputStream, cipher)
|
||||
}
|
||||
}
|
||||
|
||||
fun Pair<ByteArray, ByteArray>.toKeyPair()
|
||||
= MediaEncryptionKeyPair(Base64.UrlSafe.encode(this.first), Base64.UrlSafe.encode(this.second))
|
||||
|
||||
fun EncryptionWrapper.toKeyPair()
|
||||
= MediaEncryptionKeyPair(Base64.UrlSafe.encode(this.keySpec), Base64.UrlSafe.encode(this.ivKeyParameterSpec))
|
@ -1,5 +0,0 @@
|
||||
package me.rhunk.snapenhance.core.download.data
|
||||
|
||||
enum class SplitMediaAssetType {
|
||||
ORIGINAL, OVERLAY
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
package me.rhunk.snapenhance.core.event
|
||||
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.core.ModContext
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
abstract class Event {
|
||||
|
@ -4,19 +4,19 @@ import android.content.Intent
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewGroup.LayoutParams
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.common.util.snap.SnapWidgetBroadcastReceiverHelper
|
||||
import me.rhunk.snapenhance.core.ModContext
|
||||
import me.rhunk.snapenhance.core.event.events.impl.*
|
||||
import me.rhunk.snapenhance.core.manager.Manager
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
import me.rhunk.snapenhance.core.util.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.core.util.ktx.getObjectField
|
||||
import me.rhunk.snapenhance.core.util.ktx.setObjectField
|
||||
import me.rhunk.snapenhance.core.util.snap.SnapWidgetBroadcastReceiverHelper
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.Message
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageDestinations
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.manager.Manager
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.Message
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.MessageDestinations
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
|
||||
|
||||
class EventDispatcher(
|
||||
private val context: ModContext
|
||||
@ -96,7 +96,9 @@ class EventDispatcher(
|
||||
androidContext = context.androidContext,
|
||||
intent = intent,
|
||||
action = action
|
||||
)
|
||||
).apply {
|
||||
adapter = param
|
||||
}
|
||||
) {
|
||||
postHookEvent()
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package me.rhunk.snapenhance.core.event.events
|
||||
|
||||
import me.rhunk.snapenhance.core.event.Event
|
||||
import me.rhunk.snapenhance.hook.HookAdapter
|
||||
import me.rhunk.snapenhance.core.util.hook.HookAdapter
|
||||
|
||||
abstract class AbstractHookEvent : Event() {
|
||||
lateinit var adapter: HookAdapter
|
||||
|
@ -1,7 +1,7 @@
|
||||
package me.rhunk.snapenhance.core.event.events.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.event.Event
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.Message
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.Message
|
||||
|
||||
class BuildMessageEvent(
|
||||
val message: Message
|
||||
|
@ -1,7 +1,7 @@
|
||||
package me.rhunk.snapenhance.core.event.events.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.event.events.AbstractHookEvent
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
|
||||
|
||||
class OnSnapInteractionEvent(
|
||||
val interactionType: String,
|
||||
|
@ -1,10 +1,10 @@
|
||||
package me.rhunk.snapenhance.core.event.events.impl
|
||||
|
||||
import me.rhunk.snapenhance.core.event.events.AbstractHookEvent
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageDestinations
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.MessageDestinations
|
||||
|
||||
class SendMessageWithContentEvent(
|
||||
val destinations: MessageDestinations,
|
||||
|
@ -1,6 +1,6 @@
|
||||
package me.rhunk.snapenhance.features
|
||||
package me.rhunk.snapenhance.core.features
|
||||
|
||||
import me.rhunk.snapenhance.core.bridge.types.BridgeFileType
|
||||
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
|
||||
import java.io.BufferedReader
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.io.InputStreamReader
|
@ -1,6 +1,6 @@
|
||||
package me.rhunk.snapenhance.features
|
||||
package me.rhunk.snapenhance.core.features
|
||||
|
||||
import me.rhunk.snapenhance.ModContext
|
||||
import me.rhunk.snapenhance.core.ModContext
|
||||
|
||||
abstract class Feature(
|
||||
val featureKey: String,
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.features
|
||||
package me.rhunk.snapenhance.core.features
|
||||
|
||||
object FeatureLoadParams {
|
||||
const val NO_INIT = 0
|
@ -1,7 +1,7 @@
|
||||
package me.rhunk.snapenhance.features
|
||||
package me.rhunk.snapenhance.core.features
|
||||
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
|
||||
import me.rhunk.snapenhance.core.messaging.RuleState
|
||||
import me.rhunk.snapenhance.common.data.MessagingRuleType
|
||||
import me.rhunk.snapenhance.common.data.RuleState
|
||||
|
||||
abstract class MessagingRuleFeature(name: String, val ruleType: MessagingRuleType, loadParams: Int = 0) : Feature(name, loadParams) {
|
||||
|
@ -1,11 +1,11 @@
|
||||
package me.rhunk.snapenhance.features.impl
|
||||
package me.rhunk.snapenhance.core.features.impl
|
||||
|
||||
import de.robv.android.xposed.XposedHelpers
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
import me.rhunk.snapenhance.core.util.ktx.setObjectField
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
|
||||
class ConfigurationOverride : Feature("Configuration Override", loadParams = FeatureLoadParams.INIT_SYNC) {
|
||||
override fun init() {
|
@ -1,13 +1,13 @@
|
||||
package me.rhunk.snapenhance.features.impl
|
||||
package me.rhunk.snapenhance.core.features.impl
|
||||
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import me.rhunk.snapenhance.common.data.ContentType
|
||||
import me.rhunk.snapenhance.common.data.SocialScope
|
||||
import me.rhunk.snapenhance.core.event.events.impl.SendMessageWithContentEvent
|
||||
import me.rhunk.snapenhance.core.messaging.SocialScope
|
||||
import me.rhunk.snapenhance.data.ContentType
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
|
||||
class ScopeSync : Feature("Scope Sync", loadParams = FeatureLoadParams.INIT_SYNC) {
|
||||
companion object {
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.features.impl.downloader
|
||||
package me.rhunk.snapenhance.core.features.impl.downloader
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.graphics.Bitmap
|
||||
@ -15,36 +15,41 @@ import android.widget.TextView
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import me.rhunk.snapenhance.SnapEnhance
|
||||
import me.rhunk.snapenhance.bridge.DownloadCallback
|
||||
import me.rhunk.snapenhance.core.database.objects.ConversationMessage
|
||||
import me.rhunk.snapenhance.core.database.objects.FriendInfo
|
||||
import me.rhunk.snapenhance.core.download.DownloadManagerClient
|
||||
import me.rhunk.snapenhance.core.download.data.*
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
|
||||
import me.rhunk.snapenhance.core.util.download.RemoteMediaResolver
|
||||
import me.rhunk.snapenhance.common.data.FileType
|
||||
import me.rhunk.snapenhance.common.data.MessagingRuleType
|
||||
import me.rhunk.snapenhance.common.data.download.DownloadMediaType
|
||||
import me.rhunk.snapenhance.common.data.download.DownloadMetadata
|
||||
import me.rhunk.snapenhance.common.data.download.InputMedia
|
||||
import me.rhunk.snapenhance.common.data.download.MediaDownloadSource
|
||||
import me.rhunk.snapenhance.common.data.download.SplitMediaAssetType
|
||||
import me.rhunk.snapenhance.common.database.impl.ConversationMessage
|
||||
import me.rhunk.snapenhance.common.database.impl.FriendInfo
|
||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.common.util.snap.BitmojiSelfie
|
||||
import me.rhunk.snapenhance.common.util.snap.MediaDownloaderHelper
|
||||
import me.rhunk.snapenhance.common.util.snap.RemoteMediaResolver
|
||||
import me.rhunk.snapenhance.core.DownloadManagerClient
|
||||
import me.rhunk.snapenhance.core.SnapEnhance
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.features.MessagingRuleFeature
|
||||
import me.rhunk.snapenhance.core.features.impl.downloader.decoder.DecodedAttachment
|
||||
import me.rhunk.snapenhance.core.features.impl.downloader.decoder.MessageDecoder
|
||||
import me.rhunk.snapenhance.core.features.impl.messaging.Messaging
|
||||
import me.rhunk.snapenhance.core.features.impl.spying.MessageLogger
|
||||
import me.rhunk.snapenhance.core.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.util.hook.HookAdapter
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.util.ktx.getObjectField
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.core.util.snap.BitmojiSelfie
|
||||
import me.rhunk.snapenhance.core.util.snap.MediaDownloaderHelper
|
||||
import me.rhunk.snapenhance.core.util.snap.PreviewUtils
|
||||
import me.rhunk.snapenhance.data.FileType
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.media.MediaInfo
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.media.dash.LongformVideoPlaylistItem
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.media.dash.SnapPlaylistItem
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.media.opera.Layer
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.media.opera.ParamMap
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.features.MessagingRuleFeature
|
||||
import me.rhunk.snapenhance.features.impl.Messaging
|
||||
import me.rhunk.snapenhance.features.impl.downloader.decoder.DecodedAttachment
|
||||
import me.rhunk.snapenhance.features.impl.downloader.decoder.MessageDecoder
|
||||
import me.rhunk.snapenhance.features.impl.spying.MessageLogger
|
||||
import me.rhunk.snapenhance.hook.HookAdapter
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.util.media.PreviewUtils
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.media.MediaInfo
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.media.dash.LongformVideoPlaylistItem
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.media.dash.SnapPlaylistItem
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.media.opera.Layer
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.media.opera.ParamMap
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.media.toKeyPair
|
||||
import java.io.ByteArrayInputStream
|
||||
import java.nio.file.Paths
|
||||
import java.text.SimpleDateFormat
|
@ -1,16 +1,16 @@
|
||||
package me.rhunk.snapenhance.features.impl.downloader
|
||||
package me.rhunk.snapenhance.core.features.impl.downloader
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.widget.Button
|
||||
import android.widget.RelativeLayout
|
||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.core.event.events.impl.AddViewEvent
|
||||
import me.rhunk.snapenhance.core.event.events.impl.NetworkApiRequestEvent
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import java.nio.ByteBuffer
|
||||
|
||||
class ProfilePictureDownloader : Feature("ProfilePictureDownloader", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
@ -1,6 +1,6 @@
|
||||
package me.rhunk.snapenhance.features.impl.downloader.decoder
|
||||
package me.rhunk.snapenhance.core.features.impl.downloader.decoder
|
||||
|
||||
import me.rhunk.snapenhance.core.download.data.MediaEncryptionKeyPair
|
||||
import me.rhunk.snapenhance.common.data.download.MediaEncryptionKeyPair
|
||||
|
||||
data class BitmojiSticker(
|
||||
val reference: String,
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.features.impl.downloader.decoder
|
||||
package me.rhunk.snapenhance.core.features.impl.downloader.decoder
|
||||
|
||||
enum class AttachmentType(
|
||||
val key: String,
|
@ -1,11 +1,11 @@
|
||||
package me.rhunk.snapenhance.features.impl.downloader.decoder
|
||||
package me.rhunk.snapenhance.core.features.impl.downloader.decoder
|
||||
|
||||
import com.google.gson.GsonBuilder
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonObject
|
||||
import me.rhunk.snapenhance.core.download.data.toKeyPair
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.common.data.download.toKeyPair
|
||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.MessageContent
|
||||
import kotlin.io.encoding.Base64
|
||||
import kotlin.io.encoding.ExperimentalEncodingApi
|
||||
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
|
||||
class AddFriendSourceSpoof : Feature("AddFriendSourceSpoof", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||
override fun asyncOnActivityCreate() {
|
@ -1,14 +1,14 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.res.TypedArray
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import me.rhunk.snapenhance.Constants
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.common.Constants
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
|
||||
class AmoledDarkMode : Feature("Amoled Dark Mode", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) {
|
||||
@SuppressLint("DiscouragedApi")
|
||||
@ -21,7 +21,8 @@ class AmoledDarkMode : Feature("Amoled Dark Mode", loadParams = FeatureLoadParam
|
||||
return context.resources.getIdentifier(name, "attr", Constants.SNAPCHAT_PACKAGE_NAME).also { attributeCache[name] = it }
|
||||
}
|
||||
|
||||
context.androidContext.theme.javaClass.getMethod("obtainStyledAttributes", IntArray::class.java).hook(HookStage.AFTER) { param ->
|
||||
context.androidContext.theme.javaClass.getMethod("obtainStyledAttributes", IntArray::class.java).hook(
|
||||
HookStage.AFTER) { param ->
|
||||
val array = param.arg<IntArray>(0)
|
||||
val result = param.getResult() as TypedArray
|
||||
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
@ -8,9 +8,9 @@ import android.text.InputType
|
||||
import android.text.TextWatcher
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.EditText
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.ui.ViewAppearanceHelper
|
||||
|
||||
//TODO: fingerprint unlock
|
||||
class AppPasscode : Feature("App Passcode", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) {
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
|
||||
class DeviceSpooferHook: Feature("device_spoofer", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||
override fun asyncOnActivityCreate() {
|
||||
@ -82,7 +82,7 @@ class DeviceSpooferHook: Feature("device_spoofer", loadParams = FeatureLoadParam
|
||||
|
||||
//GETDATADIRECTORY
|
||||
if(getDataDirectory.isNotEmpty()) {
|
||||
Hooker.hook(context.classCache.chromiumPathUtils, "getDataDirectory", HookStage.BEFORE) {hookAdapter ->
|
||||
Hooker.hook(context.classCache.chromiumPathUtils, "getDataDirectory", HookStage.BEFORE) { hookAdapter ->
|
||||
hookAdapter.setResult(getDataDirectory)
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.graphics.Canvas
|
||||
@ -11,27 +11,27 @@ import android.view.ViewGroup.LayoutParams
|
||||
import android.view.ViewGroup.MarginLayoutParams
|
||||
import android.widget.Button
|
||||
import android.widget.TextView
|
||||
import me.rhunk.snapenhance.common.data.ContentType
|
||||
import me.rhunk.snapenhance.common.data.MessagingRuleType
|
||||
import me.rhunk.snapenhance.common.data.RuleState
|
||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoEditor
|
||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.common.util.protobuf.ProtoWriter
|
||||
import me.rhunk.snapenhance.core.event.events.impl.AddViewEvent
|
||||
import me.rhunk.snapenhance.core.event.events.impl.BindViewEvent
|
||||
import me.rhunk.snapenhance.core.event.events.impl.BuildMessageEvent
|
||||
import me.rhunk.snapenhance.core.event.events.impl.SendMessageWithContentEvent
|
||||
import me.rhunk.snapenhance.core.event.events.impl.UnaryCallEvent
|
||||
import me.rhunk.snapenhance.core.messaging.MessagingRuleType
|
||||
import me.rhunk.snapenhance.core.messaging.RuleState
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.features.MessagingRuleFeature
|
||||
import me.rhunk.snapenhance.core.features.impl.messaging.Messaging
|
||||
import me.rhunk.snapenhance.core.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.core.ui.addForegroundDrawable
|
||||
import me.rhunk.snapenhance.core.ui.removeForegroundDrawable
|
||||
import me.rhunk.snapenhance.core.util.EvictingMap
|
||||
import me.rhunk.snapenhance.core.util.ktx.getObjectField
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoEditor
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoReader
|
||||
import me.rhunk.snapenhance.core.util.protobuf.ProtoWriter
|
||||
import me.rhunk.snapenhance.data.ContentType
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.data.wrapper.impl.SnapUUID
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.features.MessagingRuleFeature
|
||||
import me.rhunk.snapenhance.features.impl.Messaging
|
||||
import me.rhunk.snapenhance.ui.ViewAppearanceHelper
|
||||
import me.rhunk.snapenhance.ui.addForegroundDrawable
|
||||
import me.rhunk.snapenhance.ui.removeForegroundDrawable
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.MessageContent
|
||||
import me.rhunk.snapenhance.core.wrapper.impl.SnapUUID
|
||||
import java.security.MessageDigest
|
||||
import kotlin.random.Random
|
||||
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hookConstructor
|
||||
|
||||
class InfiniteStoryBoost : Feature("InfiniteStoryBoost", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||
override fun asyncOnActivityCreate() {
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
|
||||
class MeoPasscodeBypass : Feature("Meo Passcode Bypass", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||
override fun asyncOnActivityCreate() {
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hookConstructor
|
||||
import java.lang.reflect.Constructor
|
||||
|
||||
class NoFriendScoreDelay : Feature("NoFriendScoreDelay", loadParams = FeatureLoadParams.ACTIVITY_CREATE_SYNC) {
|
@ -1,10 +1,10 @@
|
||||
package me.rhunk.snapenhance.features.impl.experiments
|
||||
package me.rhunk.snapenhance.core.features.impl.experiments
|
||||
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.core.util.ktx.setObjectField
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hookConstructor
|
||||
|
||||
class UnlimitedMultiSnap : Feature("UnlimitedMultiSnap", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||
override fun asyncOnActivityCreate() {
|
@ -1,14 +1,14 @@
|
||||
package me.rhunk.snapenhance.features.impl.tweaks
|
||||
package me.rhunk.snapenhance.core.features.impl.global
|
||||
|
||||
import android.os.Build
|
||||
import android.os.FileObserver
|
||||
import com.google.gson.JsonParser
|
||||
import me.rhunk.snapenhance.core.event.events.impl.SendMessageWithContentEvent
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hookConstructor
|
||||
import me.rhunk.snapenhance.core.util.ktx.setObjectField
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hookConstructor
|
||||
import java.io.File
|
||||
|
||||
class BypassVideoLengthRestriction :
|
@ -1,10 +1,10 @@
|
||||
package me.rhunk.snapenhance.features.impl.privacy
|
||||
package me.rhunk.snapenhance.core.features.impl.global
|
||||
|
||||
import me.rhunk.snapenhance.core.event.events.impl.NetworkApiRequestEvent
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
|
||||
class DisableMetrics : Feature("DisableMetrics", loadParams = FeatureLoadParams.INIT_SYNC) {
|
||||
override fun init() {
|
@ -1,10 +1,10 @@
|
||||
package me.rhunk.snapenhance.features.impl.tweaks
|
||||
package me.rhunk.snapenhance.core.features.impl.global
|
||||
|
||||
import android.app.AlertDialog
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
import java.lang.reflect.Modifier
|
||||
|
||||
class GooglePlayServicesDialogs : Feature("Disable GMS Dialogs", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
@ -1,11 +1,11 @@
|
||||
package me.rhunk.snapenhance.features.impl.tweaks
|
||||
package me.rhunk.snapenhance.core.features.impl.global
|
||||
|
||||
import android.content.Intent
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
|
||||
class LocationSpoofer: Feature("LocationSpoof", loadParams = FeatureLoadParams.ACTIVITY_CREATE_ASYNC) {
|
||||
override fun asyncOnActivityCreate() {
|
@ -1,9 +1,9 @@
|
||||
package me.rhunk.snapenhance.features.impl.tweaks
|
||||
package me.rhunk.snapenhance.core.features.impl.global
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
|
||||
class MediaQualityLevelOverride : Feature("MediaQualityLevelOverride", loadParams = FeatureLoadParams.INIT_SYNC) {
|
||||
override fun init() {
|
@ -1,10 +1,10 @@
|
||||
package me.rhunk.snapenhance.features.impl.tweaks
|
||||
package me.rhunk.snapenhance.core.features.impl.global
|
||||
|
||||
import me.rhunk.snapenhance.features.Feature
|
||||
import me.rhunk.snapenhance.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.hook.HookStage
|
||||
import me.rhunk.snapenhance.hook.Hooker
|
||||
import me.rhunk.snapenhance.hook.hook
|
||||
import me.rhunk.snapenhance.core.features.Feature
|
||||
import me.rhunk.snapenhance.core.features.FeatureLoadParams
|
||||
import me.rhunk.snapenhance.core.util.hook.HookStage
|
||||
import me.rhunk.snapenhance.core.util.hook.Hooker
|
||||
import me.rhunk.snapenhance.core.util.hook.hook
|
||||
|
||||
class SnapchatPlus: Feature("SnapchatPlus", loadParams = FeatureLoadParams.INIT_SYNC) {
|
||||
private val originalSubscriptionTime = (System.currentTimeMillis() - 7776000000L)
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user