diff --git a/app/src/main/java/eu/faircode/netguard/AdapterRule.java b/app/src/main/java/eu/faircode/netguard/AdapterRule.java index 63d5ad775..0c8044c04 100644 --- a/app/src/main/java/eu/faircode/netguard/AdapterRule.java +++ b/app/src/main/java/eu/faircode/netguard/AdapterRule.java @@ -58,6 +58,7 @@ import net.kollnig.missioncontrol.Common; import net.kollnig.missioncontrol.DetailsActivity; import net.kollnig.missioncontrol.R; +import net.kollnig.missioncontrol.data.AppProtectionState; import net.kollnig.missioncontrol.data.BlockingMode; import net.kollnig.missioncontrol.data.InternetBlocklist; @@ -242,10 +243,16 @@ public void onBindViewHolder(final ViewHolder holder, int position) { // Get rule final Rule rule = listFiltered.get(position); - // In minimal mode, tracker_protect is not user-controllable - final boolean active = BlockingMode.isMinimalMode(context) - ? rule.apply - : rule.apply && rule.tracker_protect; + final InternetBlocklist internetBlocklist = InternetBlocklist.getInstance(context); + final boolean blockedInternet = internetBlocklist.blockedInternet(rule.uid); + final AppProtectionState state = AppProtectionState.resolve( + rule.apply, rule.tracker_protect, blockedInternet); + // The Internet toggle below is available for every app TrackerControl + // still sees. Reading it off the shared state model keeps the main list + // and the details screen in agreement — in particular, an app with its + // tracker protection turned off can still have its Internet blocked, + // which the old apply && tracker_protect test denied outside Minimal. + final boolean active = state != AppProtectionState.BYPASSED; // Show if non default rules holder.itemView.setBackgroundColor(rule.changed ? colorChanged : Color.TRANSPARENT); @@ -270,8 +277,6 @@ public void onBindViewHolder(final ViewHolder holder, int position) { // Show if Internet access blocked final ImageView iv = holder.ivIcon; - InternetBlocklist internetBlocklist = InternetBlocklist.getInstance(context); - boolean blockedInternet = internetBlocklist.blockedInternet(rule.uid); setGreyscale(iv, rule.internet && active && blockedInternet); updateToggleContentDescription(iv, context, rule, active, blockedInternet); holder.ivIcon.setOnClickListener(view -> { @@ -287,10 +292,10 @@ public void onBindViewHolder(final ViewHolder holder, int position) { boolean wasBlocked = internetBlocklist.blockedInternet(rule.uid); if (wasBlocked) { - internetBlocklist.unblock(rule.uid); + internetBlocklist.unblock(context, rule.uid); Toast.makeText(context, R.string.internet_unblocked, Toast.LENGTH_SHORT).show(); } else { - internetBlocklist.block(rule.uid); + internetBlocklist.block(context, rule.uid); Toast.makeText(context, R.string.internet_blocked, Toast.LENGTH_SHORT).show(); } setGreyscale(iv, !wasBlocked); @@ -376,7 +381,10 @@ private void updateRule(Context context, Rule rule, boolean root, List lis SharedPreferences notify = context.getSharedPreferences("notify", Context.MODE_PRIVATE); apply.edit().putBoolean(rule.packageName, rule.apply).apply(); - BlockingMode.clearAutoExcludedApp(context, rule.packageName); + // Only a re-included app leaves the mode-managed exclusion set; clearing + // it on exclusion would make a Minimal-mode auto-exclusion permanent. + if (rule.apply) + BlockingMode.clearAutoExcludedApp(context, rule.packageName); tracker_protect.edit().putBoolean(rule.packageName, rule.tracker_protect).apply(); if (rule.notify) diff --git a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java index baef0c5c7..d2d2b2789 100644 --- a/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java +++ b/app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java @@ -2923,6 +2923,23 @@ private void handlePackageChanged(Context context, Intent intent) { int uid = intent.getIntExtra(Intent.EXTRA_UID, 0); if (uid > 0) { + // The internet block is keyed by UID, not by package, so it + // may still be in use by another package of a shared UID. + // Drop it only once the UID has no package left, otherwise a + // reinstall silently comes back with its Internet blocked. + // A SecurityException (other user/profile on Android 16+) + // means "unknown", which must not be read as "none left". + try { + String[] remaining = context.getPackageManager().getPackagesForUid(uid); + if (remaining == null || remaining.length == 0) { + InternetBlocklist internetBlocklist = InternetBlocklist.getInstance(context); + if (internetBlocklist.blockedInternet(uid)) + internetBlocklist.unblock(context, uid); + } + } catch (SecurityException ex) { + Log.w(TAG, "Keeping internet block uid=" + uid + ": " + ex.getMessage()); + } + DatabaseHelper dh = DatabaseHelper.getInstance(context); dh.clearLog(uid); dh.clearAccess(uid, false); diff --git a/app/src/main/java/net/kollnig/missioncontrol/data/AppProtectionState.java b/app/src/main/java/net/kollnig/missioncontrol/data/AppProtectionState.java new file mode 100644 index 000000000..42de66680 --- /dev/null +++ b/app/src/main/java/net/kollnig/missioncontrol/data/AppProtectionState.java @@ -0,0 +1,101 @@ +/* + * TrackerControl is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * TrackerControl is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Copyright © 2026 + */ + +package net.kollnig.missioncontrol.data; + +/** + * The single per-app protection state shown in the app details header. + *

+ * It is a derived view over three pre-existing stores — the per-package + * "apply" and "tracker_protect" preferences and the per-UID internet + * blocklist — none of which change format here. Those stores are written by + * more actors than the two UI paths (bulk settings actions, the beta + * vpn_exclude migration, blocking-mode exclusion sync, XML import), so every + * one of the eight combinations can legitimately exist on disk. + * {@link #resolve} is therefore a total derivation, not an invariant. + */ +public enum AppProtectionState { + /** Routed through the VPN, trackers blocked and recorded. */ + PROTECTED, + /** Routed through the VPN, but trackers are neither blocked nor recorded. */ + TRACKERS_ALLOWED, + /** Routed through the VPN, but all connections are dropped. */ + NO_INTERNET, + /** Outside the VPN entirely; TrackerControl sees nothing of this app. */ + BYPASSED; + + /** + * Derive the state from the three stores. + *

+ * Precedence is Bypass, then No-internet, then the protection flag. Bypass + * dominates for a mechanical reason rather than as a UI convention: an app + * with {@code apply == false} is handed to + * {@code Builder#addDisallowedApplication}, so its packets never reach the + * tun and the per-UID internet block cannot be enforced for it. + * + * @param apply the per-package "apply" preference + * @param trackerProtect the resolved tracker protection flag, i.e. the + * per-package preference with the browser default + * already applied (see + * {@link BlockingMode#isTrackerProtectionEnabled}) + * @param internetBlocked whether the app's UID is in the internet blocklist + */ + public static AppProtectionState resolve(boolean apply, + boolean trackerProtect, + boolean internetBlocked) { + if (!apply) + return BYPASSED; + if (internetBlocked) + return NO_INTERNET; + return trackerProtect ? PROTECTED : TRACKERS_ALLOWED; + } + + /** + * The writes that move an app into {@code target}. + *

+ * States that do not depend on a store leave it alone, so switching to + * "No internet" and back does not silently discard the app's tracker + * protection choice. + */ + public static Change of(AppProtectionState target) { + switch (target) { + case PROTECTED: + return new Change(true, Boolean.TRUE, Boolean.FALSE); + case TRACKERS_ALLOWED: + return new Change(true, Boolean.FALSE, Boolean.FALSE); + case NO_INTERNET: + return new Change(true, null, Boolean.TRUE); + case BYPASSED: + return new Change(false, null, null); + default: + throw new IllegalArgumentException("Unknown state " + target); + } + } + + /** + * A write plan over the three stores. A {@code null} field means the store + * is left untouched. + */ + public static final class Change { + public final boolean apply; + public final Boolean trackerProtect; + public final Boolean internetBlocked; + + Change(boolean apply, Boolean trackerProtect, Boolean internetBlocked) { + this.apply = apply; + this.trackerProtect = trackerProtect; + this.internetBlocked = internetBlocked; + } + } +} diff --git a/app/src/main/java/net/kollnig/missioncontrol/data/InternetBlocklist.java b/app/src/main/java/net/kollnig/missioncontrol/data/InternetBlocklist.java index efb8afec5..2231419dc 100644 --- a/app/src/main/java/net/kollnig/missioncontrol/data/InternetBlocklist.java +++ b/app/src/main/java/net/kollnig/missioncontrol/data/InternetBlocklist.java @@ -87,6 +87,25 @@ public void clear() { blockmap.clear(); } + /** + * Persist the current blocklist. + *

+ * The list is otherwise only written when the details screen is paused, so + * a change made from the main screen — or made shortly before the process + * dies — would be lost. Both UI paths write through + * {@link #block(Context, int)} / {@link #unblock(Context, int)} instead. + * + * @param c Context + */ + public synchronized void saveSettings(Context c) { + SharedPreferences prefs = c.getSharedPreferences(PREF_BLOCKLIST, Context.MODE_PRIVATE); + Set set = new HashSet<>(); + for (Integer uid : blockmap) + set.add(Integer.toString(uid)); + + prefs.edit().putStringSet(SHARED_PREFS_INTERNET_BLOCKLIST_APPS_KEY, set).apply(); + } + /** * Block internet for a given app * @@ -96,6 +115,17 @@ public synchronized void block(int uid) { blockmap.add(uid); } + /** + * Block internet for a given app and persist the change immediately. + * + * @param c Context + * @param uid Uid of app to block internet + */ + public synchronized void block(Context c, int uid) { + block(uid); + saveSettings(c); + } + /** * Unblock internet for a given app * @@ -105,6 +135,36 @@ public synchronized void unblock(int uid) { blockmap.remove(uid); } + /** + * Unblock internet for a given app and persist the change immediately. + * + * @param c Context + * @param uid Uid of app to unblock internet + */ + public synchronized void unblock(Context c, int uid) { + unblock(uid); + saveSettings(c); + } + + /** + * Apply a resolved protection state's internet decision, if it has one. + * + * @param c Context + * @param uid Uid of the app + * @param internetBlocked the {@code internetBlocked} field of an + * {@link AppProtectionState.Change}; {@code null} + * leaves the blocklist untouched + */ + public void apply(Context c, int uid, Boolean internetBlocked) { + if (internetBlocked == null) + return; + + if (internetBlocked) + block(c, uid); + else + unblock(c, uid); + } + /** * Check if internet is blocked for given app * diff --git a/app/src/main/java/net/kollnig/missioncontrol/details/TrackersListAdapter.java b/app/src/main/java/net/kollnig/missioncontrol/details/TrackersListAdapter.java index 4ec7ed8d7..52b4d6ff4 100644 --- a/app/src/main/java/net/kollnig/missioncontrol/details/TrackersListAdapter.java +++ b/app/src/main/java/net/kollnig/missioncontrol/details/TrackersListAdapter.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.text.Spannable; @@ -34,6 +35,7 @@ import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.ProgressBar; +import android.widget.RadioGroup; import com.google.android.material.materialswitch.MaterialSwitch; import android.widget.TextView; import android.widget.Toast; @@ -50,6 +52,7 @@ import net.kollnig.missioncontrol.R; import net.kollnig.missioncontrol.analysis.TrackerAnalysisManager; import net.kollnig.missioncontrol.analysis.TrackerAnalysisWorker; +import net.kollnig.missioncontrol.data.AppProtectionState; import net.kollnig.missioncontrol.data.BlockingMode; import net.kollnig.missioncontrol.data.InternetBlocklist; import net.kollnig.missioncontrol.data.Tracker; @@ -390,9 +393,7 @@ private void updateText(TextView tv, Tracker t) { holder.mSwitchTracker.setOnCheckedChangeListener(null); holder.mCompaniesList.setOnItemClickListener(null); } else { - boolean enabled = apply.getBoolean(mAppId, true) - && !w.blockedInternet(mAppUid) - && trackerProtectionEnabled; + boolean enabled = currentState(w) == AppProtectionState.PROTECTED; holder.mSwitchTracker.setEnabled(enabled); holder.mSwitchTracker.setChecked( b.blocked(mAppUid, trackerCategoryName)); @@ -451,72 +452,126 @@ private void updateText(TextView tv, Tracker t) { holder.mLibraryExplanation.setText(R.string.trackers_static_explanation); - boolean isBrowser = BlockingMode.isBrowserApp(mContext, mAppId); - boolean showTrackerProtection = !BlockingMode.isMinimalMode(mContext) || isBrowser; - holder.mTrackerProtectionRow.setVisibility(showTrackerProtection ? View.VISIBLE : View.GONE); - holder.mTrackerProtectionDivider.setVisibility(showTrackerProtection ? View.VISIBLE : View.GONE); - holder.mSwitchVPN.setOnCheckedChangeListener(null); - - // Tracker protection toggle. In minimal mode this is only shown for - // browsers, where tracker blocking defaults off but can be opted in. - if (showTrackerProtection) { - holder.mSwitchVPN.setVisibility(View.VISIBLE); - holder.mSwitchVPN.setEnabled(apply.getBoolean(mAppId, true) - && !w.blockedInternet(mAppUid)); - holder.mSwitchVPN.setChecked(BlockingMode.isTrackerProtectionEnabled( - mContext, tracker_protect, mAppId)); - holder.mSwitchVPN.setOnCheckedChangeListener((buttonView, isChecked) -> { - if (!buttonView.isPressed()) - return; // to fix errors - tracker_protect.edit().putBoolean(mAppId, isChecked).apply(); - - // Move expensive operations off the main thread to prevent UI freezing - // Rule.clearCache() can block waiting for a lock held by Rule.getRules() - AsyncTask.execute(() -> { - Rule.clearCache(mContext); - ServiceSinkhole.reload("app blocking changed", mContext, false); - }); - - notifyDataSetChanged(); - }); + // The internet block is keyed by UID, so it necessarily covers every + // package sharing that UID. Say so rather than letting it surprise. + String relatedApps = getRelatedApps(); + if (relatedApps == null) { + holder.mNoInternetExplanation.setText(R.string.app_state_no_internet_explanation); } else { - holder.mSwitchVPN.setVisibility(View.GONE); + String explanation = mContext.getString(R.string.app_state_no_internet_explanation_shared, + mContext.getString(R.string.app_state_no_internet_explanation), + mContext.getString(R.string.app_state_no_internet_shared_uid, relatedApps)); + holder.mNoInternetExplanation.setText(explanation); } - // Blocking of Internet - holder.mSwitchInternet.setEnabled(apply.getBoolean(mAppId, true)); - holder.mSwitchInternet.setChecked( - !w.blockedInternet(mAppUid)); - holder.mSwitchInternet.setOnCheckedChangeListener((buttonView, hasBecomeChecked) -> { - if (!buttonView.isPressed()) - return; // to fix errors - - if (hasBecomeChecked) - w.unblock(mAppUid); - else - w.block(mAppUid); + AppProtectionState state = currentState(w); + holder.mAppState.setOnCheckedChangeListener(null); + holder.mAppState.check(radioIdFor(state)); + holder.mAppState.setOnCheckedChangeListener((group, checkedId) -> { + AppProtectionState selected = stateForRadioId(checkedId); + if (selected == null || selected == currentState(w)) + return; + applyState(selected, w); notifyDataSetChanged(); }); + } + } - // Exclude from VPN toggle (completely bypasses TrackerControl) - holder.mSwitchVpnExclude.setChecked(!apply.getBoolean(mAppId, true)); - holder.mSwitchVpnExclude.setOnCheckedChangeListener((buttonView, isChecked) -> { - if (!buttonView.isPressed()) - return; - apply.edit().putBoolean(mAppId, !isChecked).apply(); - BlockingMode.clearAutoExcludedApp(mContext, mAppId); + /** + * Comma-separated labels of the other packages sharing this app's UID, or + * {@code null} when the UID belongs to this package alone. + */ + @Nullable + private String getRelatedApps() { + PackageManager pm = mContext.getPackageManager(); + String[] packages = Util.getPackagesForUid(pm, mAppUid); + if (packages == null || packages.length < 2) + return null; + + List names = new ArrayList<>(); + for (String packageName : packages) { + if (packageName.equals(mAppId)) + continue; + + try { + names.add(pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)).toString()); + } catch (PackageManager.NameNotFoundException ignored) { + names.add(packageName); + } + } - AsyncTask.execute(() -> { - Rule.clearCache(mContext); - ServiceSinkhole.reload("vpn exclude changed", mContext, false); - }); + return names.isEmpty() ? null : TextUtils.join(", ", names); + } - notifyDataSetChanged(); - }); + private AppProtectionState currentState(InternetBlocklist w) { + return AppProtectionState.resolve( + apply.getBoolean(mAppId, true), + BlockingMode.isTrackerProtectionEnabled(mContext, tracker_protect, mAppId), + w.blockedInternet(mAppUid)); + } + + private void applyState(AppProtectionState target, InternetBlocklist w) { + AppProtectionState.Change change = AppProtectionState.of(target); + + boolean applyBefore = apply.getBoolean(mAppId, true); + boolean protectBefore = BlockingMode.isTrackerProtectionEnabled(mContext, tracker_protect, mAppId); + + apply.edit().putBoolean(mAppId, change.apply).apply(); + // Only a re-included app leaves the mode-managed exclusion set. Clearing + // it unconditionally would turn a Minimal-mode auto-exclusion into a + // permanent one as soon as the user toggled the app off and on again. + if (change.apply) + BlockingMode.clearAutoExcludedApp(mContext, mAppId); + + if (change.trackerProtect != null) + tracker_protect.edit().putBoolean(mAppId, change.trackerProtect).apply(); + + w.apply(mContext, mAppUid, change.internetBlocked); + + // The internet blocklist is read live by the packet path, so a change + // that only blocks or unblocks Internet needs no reload. Which apps are + // in the tun, and which of them are filtered, are baked into the rules. + boolean needsReload = change.apply != applyBefore + || (change.trackerProtect != null && change.trackerProtect != protectBefore); + if (!needsReload) + return; + + // Move expensive operations off the main thread to prevent UI freezing + // Rule.clearCache() can block waiting for a lock held by Rule.getRules() + AsyncTask.execute(() -> { + Rule.clearCache(mContext); + ServiceSinkhole.reload("app protection changed", mContext, false); + }); + } + + private static int radioIdFor(AppProtectionState state) { + switch (state) { + case TRACKERS_ALLOWED: + return R.id.rbStateTrackersAllowed; + case NO_INTERNET: + return R.id.rbStateNoInternet; + case BYPASSED: + return R.id.rbStateBypassed; + case PROTECTED: + default: + return R.id.rbStateProtected; } } + @Nullable + private static AppProtectionState stateForRadioId(int checkedId) { + if (checkedId == R.id.rbStateProtected) + return AppProtectionState.PROTECTED; + if (checkedId == R.id.rbStateTrackersAllowed) + return AppProtectionState.TRACKERS_ALLOWED; + if (checkedId == R.id.rbStateNoInternet) + return AppProtectionState.NO_INTERNET; + if (checkedId == R.id.rbStateBypassed) + return AppProtectionState.BYPASSED; + return null; + } + @Override public int getItemCount() { return mValues.size() + 1; @@ -558,21 +613,15 @@ static class VHItem extends RecyclerView.ViewHolder { static class VHHeader extends RecyclerView.ViewHolder { final TextView mLibraryExplanation; final TextView mLibraryDisclaimer; - final MaterialSwitch mSwitchInternet; - final MaterialSwitch mSwitchVPN; - final MaterialSwitch mSwitchVpnExclude; - final View mTrackerProtectionRow; - final View mTrackerProtectionDivider; + final RadioGroup mAppState; + final TextView mNoInternetExplanation; VHHeader(View view) { super(view); mLibraryExplanation = view.findViewById(R.id.tvLibraryExplanation); mLibraryDisclaimer = view.findViewById(R.id.tvLibraryDisclaimer); - mSwitchInternet = view.findViewById(R.id.switch_internet); - mSwitchVPN = view.findViewById(R.id.switch_vpn); - mSwitchVpnExclude = view.findViewById(R.id.switch_vpn_exclude); - mTrackerProtectionRow = view.findViewById(R.id.rowTrackerProtection); - mTrackerProtectionDivider = view.findViewById(R.id.dividerTrackerProtection); + mAppState = view.findViewById(R.id.rgAppState); + mNoInternetExplanation = view.findViewById(R.id.tvStateNoInternetDesc); } } } diff --git a/app/src/main/res/layout/list_item_trackers_header.xml b/app/src/main/res/layout/list_item_trackers_header.xml index c39d48206..02b82a72d 100644 --- a/app/src/main/res/layout/list_item_trackers_header.xml +++ b/app/src/main/res/layout/list_item_trackers_header.xml @@ -180,7 +180,7 @@ - + - - + android:layout_height="wrap_content" + android:layout_marginBottom="12dp" + android:text="@string/app_state_heading" + android:textColor="?android:textColorPrimary" + android:textSize="18sp" + android:textStyle="bold" /> - + + + android:layout_marginBottom="4dp" + android:contentDescription="@string/app_state_protected" + android:text="@string/app_state_protected" + android:textStyle="bold" /> - - - - - - - - - + android:layout_marginStart="32dp" + android:layout_marginBottom="12dp" + android:text="@string/app_state_protected_explanation" + android:textAppearance="@style/TextAppearance.Material3.LabelSmall" /> - + android:layout_marginBottom="4dp" + android:contentDescription="@string/app_state_trackers_allowed" + android:text="@string/app_state_trackers_allowed" + android:textStyle="bold" /> - - - - + android:layout_marginStart="32dp" + android:layout_marginBottom="12dp" + android:text="@string/app_state_trackers_allowed_explanation" + android:textAppearance="@style/TextAppearance.Material3.LabelSmall" /> - - - - + + android:layout_marginStart="32dp" + android:layout_marginBottom="12dp" + android:text="@string/app_state_no_internet_explanation" + android:textAppearance="@style/TextAppearance.Material3.LabelSmall" /> - - - + + + android:layout_marginStart="32dp" + android:text="@string/app_state_bypassed_explanation" + android:textAppearance="@style/TextAppearance.Material3.LabelSmall" /> - + diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 5052fb01a..7e0d2115f 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -258,7 +258,6 @@ البلدان بياناتي اسم أداة التتبع - الوصول إلى الإنترنت إدارة التطبيق حظر أدوات التتبع @@ -377,4 +376,16 @@ + + + الحماية + محمي + يتم حظر أدوات التتبع وتسجيلها لهذا التطبيق. + السماح بأدوات التتبع + يواصل التطبيق العمل عبر TrackerControl، لكن أدوات التتبع الخاصة به لا تُحظر ولا تُسجَّل. استخدم هذا الخيار إذا كان الحظر يُعطِّل التطبيق. + بلا إنترنت + جميع اتصالات هذا التطبيق محظورة. يمكنك أيضًا الضغط على أيقونة التطبيق في الشاشة الرئيسية. + ينطبق أيضًا على %1$s، الذي يشارك هذا التطبيق مُعرِّف مستخدم أندرويد. + تجاوز TrackerControl + يتصل التطبيق مباشرةً، خارج TrackerControl. لا تتم مراقبة أو حظر أي شيء له. استخدم هذا كملاذ أخير إذا كان التطبيق لا يزال لا يعمل.\n\nملاحظة: يجب تعطيل \"حظر الاتصالات بدون VPN\" في إعدادات VPN بنظام أندرويد حتى يعمل هذا. diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 515e128d8..89b6f1267 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -59,4 +59,16 @@ + + + সুরক্ষা + সুরক্ষিত + এই অ্যাপের জন্য ট্র্যাকার ব্লক ও রেকর্ড করা হয়। + ট্র্যাকার অনুমোদিত + অ্যাপটি TrackerControl-এর মধ্য দিয়েই চলতে থাকে, তবে এর ট্র্যাকারগুলি ব্লকও করা হয় না, রেকর্ডও করা হয় না। ব্লক করার ফলে অ্যাপ কাজ না করলে এটি ব্যবহার করুন। + ইন্টারনেট নেই + এই অ্যাপের সব সংযোগ ব্লক করা হয়েছে। আপনি প্রধান স্ক্রিনে অ্যাপের আইকনেও ট্যাপ করতে পারেন। + %1$s-এর ক্ষেত্রেও প্রযোজ্য, যেটি এই অ্যাপের সঙ্গে একই Android ব্যবহারকারী আইডি ভাগ করে। + TrackerControl এড়িয়ে যান + অ্যাপটি TrackerControl-এর বাইরে সরাসরি সংযোগ করে। এর জন্য কিছুই পর্যবেক্ষণ বা ব্লক করা হয় না। অ্যাপ তবুও কাজ না করলে শেষ উপায় হিসেবে এটি ব্যবহার করুন।\n\nদ্রষ্টব্য: এটি কাজ করতে হলে Android-এর VPN সেটিংসে \"VPN ছাড়া সংযোগ ব্লক করুন\" বন্ধ থাকতে হবে। diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 05de62f97..0b58c2613 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -260,8 +260,6 @@ Váš internetový provoz není odesílán žádnému vzdálenému VPN serveru.< Země Moje data Název trackeru - Přístup k internetu - Můžete také klepnout na ikonu aplikace na hlavní obrazovce. Spravovat aplikace Blokovat trackery @@ -340,9 +338,6 @@ Privátní DNS musí být vypnutá. Přísné blokování Blokovat skoro všechno sdílení dat nově nainstalovaných aplikací. Aplikace nemusí fungovat. Je doporučeno vypnout tuto možnost pro snížení počtu nefungujících aplikací. Je ale třeba k zakázání veškerého sdílení. - Detekuje a blokuje trackery pro tuto aplikaci. - Vyloučit z VPN - Povolte tuto funkci, pokud narazíte na problémy. Aplikace zcela obejde TrackerControl.\n\nPoznámka: Aby tato funkce fungovala, musí být v nastavení VPN pro Android VYPNUTA možnost \"Blokovat připojení bez VPN\". Odinstalovat Nastavení aplikace a odinstalace Zapni switch v hlavním okně, pak zapni aplikaci pro nalezení trackerů @@ -397,4 +392,16 @@ Privátní DNS musí být vypnutá. + + + Ochrana + Chráněno + Trackery jsou pro tuto aplikaci blokovány a zaznamenávány. + Trackery povoleny + Aplikace dál běží přes TrackerControl, ale její trackery se neblokují ani nezaznamenávají. Použijte, pokud blokování aplikaci rozbíjí. + Bez internetu + Všechna připojení této aplikace jsou blokována. Můžete také klepnout na ikonu aplikace na hlavní obrazovce. + Platí i pro %1$s, která s touto aplikací sdílí uživatelské ID systému Android. + Obejít TrackerControl + Aplikace se připojuje přímo, mimo TrackerControl. Nic se pro ni nesleduje ani neblokuje. Použijte jako poslední možnost, pokud aplikace stále nefunguje.\n\nPoznámka: Aby to fungovalo, musí být volba \"Blokovat připojení bez VPN\" v nastavení VPN systému Android VYPNUTA. diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 6f106c81f..897627458 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -114,4 +114,16 @@ + + + Beskyttelse + Beskyttet + Sporere blokeres og registreres for denne app. + Sporere tilladt + Appen kører fortsat gennem TrackerControl, men dens sporere hverken blokeres eller registreres. Brug dette, hvis blokering ødelægger appen. + Intet internet + Alle forbindelser fra denne app blokeres. Du kan også trykke på appikonet på hovedskærmen. + Gælder også %1$s, som deler et Android-bruger-id med denne app. + Omgå TrackerControl + Appen forbinder direkte, uden om TrackerControl. Intet overvåges eller blokeres for den. Brug dette som sidste udvej, hvis appen stadig ikke virker.\n\nBemærk: \"Bloker forbindelser uden VPN\" i Androids VPN-indstillinger skal være DEAKTIVERET, for at dette virker. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a86b57e2b..c1669f1a1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -257,7 +257,6 @@ Länder Meine Daten Trackername - Internetzugang App verwalten Tracker blockieren @@ -342,4 +341,16 @@ + + + Schutz + Geschützt + Tracker werden für diese App blockiert und aufgezeichnet. + Tracker erlaubt + Die App läuft weiterhin über TrackerControl, ihre Tracker werden aber weder blockiert noch aufgezeichnet. Nutze dies, wenn das Blockieren die App beeinträchtigt. + Kein Internet + Alle Verbindungen dieser App werden blockiert. Du kannst auch auf das App-Symbol im Hauptbildschirm tippen. + Gilt auch für %1$s, da diese App sich eine Android-Benutzer-ID mit dieser App teilt. + TrackerControl umgehen + Die App verbindet sich direkt, außerhalb von TrackerControl. Nichts wird für sie überwacht oder blockiert. Nutze dies als letzten Ausweg, wenn die App weiterhin nicht funktioniert.\n\nHinweis: \"Verbindungen ohne VPN blockieren\" in den Android-VPN-Einstellungen muss DEAKTIVIERT sein, damit dies funktioniert. diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index 15b3cdb9d..654ff5a39 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -235,7 +235,6 @@ Χώρες Τα δεδομένα μου Όνομα ιχνηλάτη - Πρόσβαση στο διαδίκτυο Διαχείριση Εφαρμογής Αποκλεισμός Ιχνηλατών @@ -319,4 +318,16 @@ + + + Προστασία + Προστατευμένη + Οι ιχνηλάτες αποκλείονται και καταγράφονται για αυτήν την εφαρμογή. + Ιχνηλάτες επιτρεπτοί + Η εφαρμογή συνεχίζει να περνά από το TrackerControl, αλλά οι ιχνηλάτες της ούτε αποκλείονται ούτε καταγράφονται. Χρησιμοποιήστε το αν ο αποκλεισμός χαλάει την εφαρμογή. + Χωρίς Internet + Όλες οι συνδέσεις αυτής της εφαρμογής αποκλείονται. Μπορείτε επίσης να πατήσετε το εικονίδιο της εφαρμογής στην κύρια οθόνη. + Ισχύει και για το %1$s, το οποίο μοιράζεται αναγνωριστικό χρήστη Android με αυτήν την εφαρμογή. + Παράκαμψη του TrackerControl + Η εφαρμογή συνδέεται απευθείας, εκτός του TrackerControl. Τίποτα δεν παρακολουθείται ούτε αποκλείεται για αυτήν. Χρησιμοποιήστε το ως έσχατη λύση αν η εφαρμογή εξακολουθεί να μη λειτουργεί.\n\nΣημείωση: Η επιλογή \"Αποκλεισμός συνδέσεων χωρίς VPN\" στις ρυθμίσεις VPN του Android πρέπει να είναι ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ για να λειτουργήσει αυτό. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f3a61f85b..a53c0ab0c 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -275,7 +275,6 @@ El tráfico de internet no será envíado a un servidor VPN ajeno. Países Mis datos Nombre del rastreador - Acceso a Internet Gestionar App Bloquear rastreadores @@ -394,4 +393,16 @@ Atentamente,\n\n]]> + + + Protección + Protegida + Los rastreadores se bloquean y se registran para esta aplicación. + Rastreadores permitidos + La aplicación sigue pasando por TrackerControl, pero sus rastreadores no se bloquean ni se registran. Usa esto si el bloqueo hace que la aplicación falle. + Sin Internet + Todas las conexiones de esta aplicación están bloqueadas. También puedes tocar el icono de la aplicación en la pantalla principal. + También se aplica a %1$s, que comparte un ID de usuario de Android con esta aplicación. + Omitir TrackerControl + La aplicación se conecta directamente, fuera de TrackerControl. No se supervisa ni se bloquea nada para ella. Usa esto como último recurso si la aplicación sigue sin funcionar.\n\nNota: \"Bloquear conexiones sin VPN\" en los ajustes de VPN de Android debe estar DESACTIVADO para que esto funcione. diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index 44c627d9a..de7343b9c 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -161,8 +161,6 @@ Maad Minu andmed Jälitaja nimi - Internetiühendus - Võida ka klõpsata rakenduse ikooni põhivaates. Halda rakendust Blokeeri jälitajaid @@ -238,4 +236,16 @@ WiFi Muu võrk Rakenduse ikoon + + + Kaitse + Kaitstud + Jälitajad blokeeritakse ja salvestatakse selle rakenduse puhul. + Jälitajad lubatud + Rakendus töötab endiselt TrackerControli kaudu, kuid selle jälitajaid ei blokeerita ega salvestata. Kasuta seda, kui blokeerimine rikub rakenduse. + Internetita + Kõik selle rakenduse ühendused on blokeeritud. Võid ka põhiekraanil rakenduse ikoonile vajutada. + Kehtib ka rakendusele %1$s, mis jagab selle rakendusega Androidi kasutaja-ID-d. + TrackerControlist mööda + Rakendus ühendub otse, TrackerControlist mööda. Tema jaoks ei jälgita ega blokeerita midagi. Kasuta seda viimase abinõuna, kui rakendus ikka ei tööta.\n\nMärkus: Androidi VPN-i sätetes peab \"Blokeeri ühendused ilma VPN-ita\" olema VÄLJA LÜLITATUD, et see toimiks. diff --git a/app/src/main/res/values-eu-rES/strings.xml b/app/src/main/res/values-eu-rES/strings.xml index 5d27384d7..6765cc6f5 100644 --- a/app/src/main/res/values-eu-rES/strings.xml +++ b/app/src/main/res/values-eu-rES/strings.xml @@ -236,7 +236,6 @@ Zure internet trafikoa ez da kanpo VPN zerbitzari batera bidaltzen. Herrialdeak Nire datuak Aztarnariaren izena - Internet sarbidea Aplikazioa kudeatu Aztarnariak blokeatu @@ -358,4 +357,16 @@ Sareko trafikoan antzematen diren aztarnariak TrackerControl-ekin blokeatu daite + + + Babesa + Babestuta + Aplikazio honetarako jarraitzaileak blokeatu eta erregistratzen dira. + Jarraitzaileak onartuta + Aplikazioak TrackerControl bidez jarraitzen du, baina bere jarraitzaileak ez dira ez blokeatzen ez erregistratzen. Erabili hau blokeatzeak aplikazioa hondatzen badu. + Internetik ez + Aplikazio honen konexio guztiak blokeatuta daude. Pantaila nagusiko aplikazioaren ikonoa ere uki dezakezu. + %1$s aplikazioari ere aplikatzen zaio, Android erabiltzaile-ID bera partekatzen baitu honekin. + Saihestu TrackerControl + Aplikazioa zuzenean konektatzen da, TrackerControletik kanpo. Ez zaio ezer monitorizatzen ez blokeatzen. Erabili hau azken aukera gisa aplikazioak oraindik funtzionatzen ez badu.\n\nOharra: Androiden VPN ezarpenetako \"Blokeatu VPNrik gabeko konexioak\" DESAKTIBATUTA egon behar da hau funtziona dezan. diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml index ca2563cfd..a37ac8618 100644 --- a/app/src/main/res/values-fa-rIR/strings.xml +++ b/app/src/main/res/values-fa-rIR/strings.xml @@ -16,4 +16,16 @@ + + + محافظت + محافظت‌شده + ردیاب‌ها برای این برنامه مسدود و ثبت می‌شوند. + ردیاب‌ها مجاز + برنامه همچنان از طریق TrackerControl کار می‌کند، اما ردیاب‌های آن نه مسدود می‌شوند و نه ثبت. اگر مسدودسازی برنامه را خراب می‌کند از این گزینه استفاده کنید. + بدون اینترنت + همهٔ اتصال‌های این برنامه مسدود شده‌اند. می‌توانید روی نماد برنامه در صفحهٔ اصلی نیز ضربه بزنید. + برای %1$s نیز اعمال می‌شود، که شناسهٔ کاربری اندروید را با این برنامه به اشتراک می‌گذارد. + دور زدن TrackerControl + برنامه مستقیماً و خارج از TrackerControl متصل می‌شود. هیچ چیزی برای آن پایش یا مسدود نمی‌شود. اگر برنامه هنوز کار نمی‌کند، این را به‌عنوان آخرین راه‌حل استفاده کنید.\n\nتوجه: گزینهٔ \"مسدودسازی اتصال‌های بدون VPN\" در تنظیمات VPN اندروید باید غیرفعال باشد تا این کار کند. diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index c95c9dbee..d20c8328b 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -254,8 +254,6 @@ Internet-liikennettäsi ei lähetetä VPN-etäpalvelimeen. Maat Omat tiedot Seuraimen nimi - Internet-yhteys - Voit myös napauttaa sovelluksen kuvaketta päänäytöllä. Hallitse sovellusta Estä seuraimet @@ -333,9 +331,6 @@ Ystävällisin terveisin,\n\n]]> Tiukka Esto Estä juuri asennettujen sovellusten tietojen jakamista yritysten kanssa mahdollisimman paljon. Useampi sovelluksista lakkaa toimimasta. On suositeltavaa, että muut kuin asiantuntijat poistavat tämän vaihtoehdon käytöstä sovelluksten toimintahäiriöiden vähentämiseksi. Tämä kuitenkin mahdollistaa joitain olennaisia tiedonvaihtoja yritysten kanssa. - Havaitsee ja estää tämän sovelluksen seuraimet. - Ohita VPN-yhteys - Ota käyttöön, jos kohtaat ongelmia. Sovellus ohittaa TrackerControlin kokonaan.\n\nHuomaa: Jotta tämä toimisi, Android-VPN-asetusten kohta ”Estä yhteydet ilman VPN: ää” on oltava POISSA KÄYTÖSTÄ. Poista asennus Sovelluksen tiedot Ota käyttöön päänäytön kytkimestä ja käynnistä sitten sovellus löytääksesi seuraimia @@ -451,4 +446,16 @@ Ystävällisin terveisin,\n\n]]> Virheellinen URL-osoite Päivitetty viimeksi: %s + + + Suojaus + Suojattu + Seuraimet estetään ja kirjataan tälle sovellukselle. + Seuraimet sallittu + Sovellus kulkee edelleen TrackerControlin kautta, mutta sen seuraimia ei estetä eikä kirjata. Käytä tätä, jos esto rikkoo sovelluksen. + Ei internetiä + Kaikki tämän sovelluksen yhteydet on estetty. Voit myös napauttaa sovelluksen kuvaketta päänäytöllä. + Koskee myös sovellusta %1$s, jolla on sama Android-käyttäjätunnus kuin tällä sovelluksella. + Ohita TrackerControl + Sovellus muodostaa yhteyden suoraan, TrackerControlin ohi. Sille ei valvota eikä estetä mitään. Käytä tätä viimeisenä keinona, jos sovellus ei vieläkään toimi.\n\nHuomaa: Androidin VPN-asetusten kohdan \"Estä yhteydet ilman VPN:ää\" on oltava POIS KÄYTÖSTÄ, jotta tämä toimii. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3024a1114..6a85fd3a2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -385,8 +385,6 @@ Votre trafic internet n\'est pas envoyé vers un serveur VPN distant. Pays Mes données Nom du traqueur - Accès à internet - Vous pouvez également appuyer sur l\'icône de l\'application sur l\'écran principal. Gérer l\'application Bloquer les traqueurs @@ -478,8 +476,6 @@ Cordialement,\n\n]]> Standard Strict Recherche - Détecte et bloque les trackers pour cette application. - Exclure du VPN Désinstaller Paramètres de l\'application & Désinstaller Activer l\'interrupteur sur l\'écran principal, puis lancer l\'application pour trouver des traqueurs @@ -578,4 +574,16 @@ Cordialement,\n\n]]> Échec de l\'application des fichiers hôtes Dernière mise à jour : %s + + + Protection + Protégée + Les traqueurs sont bloqués et enregistrés pour cette application. + Traqueurs autorisés + L\'application continue de passer par TrackerControl, mais ses traqueurs ne sont ni bloqués ni enregistrés. À utiliser si le blocage empêche l\'application de fonctionner. + Pas d\'Internet + Toutes les connexions de cette application sont bloquées. Vous pouvez aussi appuyer sur l\'icône de l\'application dans l\'écran principal. + S\'applique également à %1$s, qui partage un identifiant utilisateur Android avec cette application. + Contourner TrackerControl + L\'application se connecte directement, en dehors de TrackerControl. Rien n\'est surveillé ni bloqué pour elle. À utiliser en dernier recours si l\'application ne fonctionne toujours pas.\n\nRemarque : \"Bloquer les connexions sans VPN\" doit être DÉSACTIVÉ dans les paramètres VPN d\'Android pour que cela fonctionne. diff --git a/app/src/main/res/values-gl-rES/strings.xml b/app/src/main/res/values-gl-rES/strings.xml index 127bcc9c3..0919b4446 100644 --- a/app/src/main/res/values-gl-rES/strings.xml +++ b/app/src/main/res/values-gl-rES/strings.xml @@ -79,4 +79,16 @@ O seu tráfico de internet non será enviado a ningún servidor VPN remoto. + + + Protección + Protexida + Os rastrexadores bloquéanse e rexístranse para esta aplicación. + Rastrexadores permitidos + A aplicación segue pasando por TrackerControl, pero os seus rastrexadores non se bloquean nin se rexistran. Usa isto se o bloqueo estraga a aplicación. + Sen Internet + Todas as conexións desta aplicación están bloqueadas. Tamén podes tocar a icona da aplicación na pantalla principal. + Tamén se aplica a %1$s, que comparte un ID de usuario de Android con esta aplicación. + Omitir TrackerControl + A aplicación conéctase directamente, fóra de TrackerControl. Non se supervisa nin se bloquea nada para ela. Usa isto como último recurso se a aplicación segue sen funcionar.\n\nNota: \"Bloquear conexións sen VPN\" nos axustes de VPN de Android debe estar DESACTIVADO para que isto funcione. diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index f14e7a79c..6252a5252 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -238,7 +238,6 @@ Az Ön internetes forgalmát nem küldi el egy távoli VPN-kiszolgálóra.Országok Adataim Nyomkövető neve - Internet-hozzáférés Alkalmazáskezelés Nyomkövetők blokkolása @@ -357,4 +356,16 @@ Tisztelettel,\n\n]]> + + + Védelem + Védett + A követők blokkolva és rögzítve vannak ennél az alkalmazásnál. + Követők engedélyezve + Az alkalmazás továbbra is a TrackerControlon keresztül fut, de a követőit sem nem blokkolja, sem nem rögzíti. Használja ezt, ha a blokkolás elrontja az alkalmazást. + Nincs internet + Az alkalmazás összes kapcsolata blokkolva van. A főképernyőn az alkalmazás ikonjára is koppinthat. + Erre is vonatkozik: %1$s, amely Android-felhasználóazonosítón osztozik ezzel az alkalmazással. + TrackerControl megkerülése + Az alkalmazás közvetlenül, a TrackerControlon kívül csatlakozik. Semmit sem figyel és blokkol nála. Végső megoldásként használja, ha az alkalmazás továbbra sem működik.\n\nMegjegyzés: az Android VPN-beállításaiban a \"Kapcsolatok blokkolása VPN nélkül\" beállításnak KIKAPCSOLVA kell lennie, hogy ez működjön. diff --git a/app/src/main/res/values-is-rIS/strings.xml b/app/src/main/res/values-is-rIS/strings.xml index 60167cbd9..964ab407a 100644 --- a/app/src/main/res/values-is-rIS/strings.xml +++ b/app/src/main/res/values-is-rIS/strings.xml @@ -3,4 +3,16 @@ + + + Vörn + Varið + Rekjarar eru útilokaðir og skráðir fyrir þetta forrit. + Rekjarar leyfðir + Forritið fer áfram um TrackerControl en rekjarar þess eru hvorki útilokaðir né skráðir. Notaðu þetta ef útilokun skemmir forritið. + Ekkert internet + Allar tengingar þessa forrits eru útilokaðar. Þú getur einnig ýtt á táknmynd forritsins á aðalskjánum. + Á einnig við um %1$s, sem deilir Android-notandaauðkenni með þessu forriti. + Sniðganga TrackerControl + Forritið tengist beint, utan TrackerControl. Ekkert er vaktað eða útilokað fyrir það. Notaðu þetta sem síðasta úrræði ef forritið virkar enn ekki.\n\nAthugið: \"Loka á tengingar án VPN\" í VPN-stillingum Android verður að vera SLÖKKT til að þetta virki. diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 98cdd6418..63869b276 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -236,7 +236,6 @@ Il tuo traffico di rete non è inoltrato verso un server remoto, ma viene monito Paesi I miei dati Nome del tracker - Accesso ad internet Gestisci l\'applicazione Blocca i tracker @@ -354,4 +353,16 @@ Cordiali saluti,\n\n]]> + + + Protezione + Protetta + I tracker vengono bloccati e registrati per questa app. + Tracker consentiti + L\'app continua a passare per TrackerControl, ma i suoi tracker non vengono né bloccati né registrati. Usa questa opzione se il blocco impedisce all\'app di funzionare. + Nessuna connessione + Tutte le connessioni di questa app sono bloccate. Puoi anche toccare l\'icona dell\'app nella schermata principale. + Vale anche per %1$s, che condivide un ID utente Android con questa app. + Ignora TrackerControl + L\'app si connette direttamente, al di fuori di TrackerControl. Per essa non viene monitorato né bloccato nulla. Usa questa opzione come ultima risorsa se l\'app continua a non funzionare.\n\nNota: \"Blocca connessioni senza VPN\" nelle impostazioni VPN di Android deve essere DISATTIVATO perché funzioni. diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index aa8735d42..8640e788b 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -242,7 +242,6 @@ מדינות הנתונים שלי שם עוקב - גישה לאינטרנט ניהול אפליקציה חסימת עוקבים @@ -338,4 +337,16 @@ + + + הגנה + מוגן + רכיבי מעקב נחסמים ונרשמים עבור אפליקציה זו. + רכיבי מעקב מותרים + האפליקציה ממשיכה לעבור דרך TrackerControl, אך רכיבי המעקב שלה אינם נחסמים ואינם נרשמים. השתמשו בכך אם החסימה שוברת את האפליקציה. + אין אינטרנט + כל החיבורים של אפליקציה זו חסומים. אפשר גם להקיש על סמל האפליקציה במסך הראשי. + חל גם על %1$s, שחולקת מזהה משתמש של Android עם אפליקציה זו. + עקיפת TrackerControl + האפליקציה מתחברת ישירות, מחוץ ל-TrackerControl. דבר אינו מנוטר או נחסם עבורה. השתמשו בכך כמוצא אחרון אם האפליקציה עדיין לא עובדת.\n\nהערה: האפשרות \"חסום חיבורים ללא VPN\" בהגדרות ה-VPN של Android חייבת להיות מושבתת כדי שזה יעבוד. diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index d9957bf9f..c733ccc42 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -230,7 +230,6 @@ 自分のデータ トラッカー名 - インターネットアクセス アプリの管理 トラッカーをブロック @@ -314,4 +313,16 @@ + + + 保護 + 保護中 + このアプリのトラッカーをブロックし、記録します。 + トラッカーを許可 + アプリは引き続き TrackerControl を経由しますが、トラッカーはブロックも記録もされません。ブロックによってアプリが正常に動作しない場合に使用してください。 + インターネットなし + このアプリのすべての接続をブロックします。メイン画面のアプリアイコンをタップしても切り替えられます。 + このアプリと Android のユーザー ID を共有する %1$s にも適用されます。 + TrackerControl を迂回 + アプリは TrackerControl を経由せず直接接続します。監視もブロックも行われません。アプリがそれでも動作しない場合の最終手段として使用してください。\n\n注意: これを機能させるには、Android の VPN 設定で \"VPN なしの接続をブロック\" を無効にする必要があります。 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index bc10aefa7..22d1e7b21 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -88,4 +88,16 @@ + + + 보호 + 보호됨 + 이 앱의 트래커를 차단하고 기록합니다. + 트래커 허용 + 앱은 계속 TrackerControl을 통해 연결되지만 트래커는 차단되지도 기록되지도 않습니다. 차단으로 앱이 제대로 동작하지 않을 때 사용하세요. + 인터넷 없음 + 이 앱의 모든 연결이 차단됩니다. 메인 화면에서 앱 아이콘을 눌러도 됩니다. + 이 앱과 Android 사용자 ID를 공유하는 %1$s에도 적용됩니다. + TrackerControl 우회 + 앱이 TrackerControl을 거치지 않고 직접 연결합니다. 이 앱에 대해서는 아무것도 감시하거나 차단하지 않습니다. 앱이 여전히 동작하지 않을 때 최후의 수단으로 사용하세요.\n\n참고: 이 기능이 동작하려면 Android VPN 설정에서 \"VPN 없이 연결 차단\"이 사용 중지되어 있어야 합니다. diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 7d399b648..3cdd7d218 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -351,8 +351,6 @@ Het internetverkeer wordt niet naar een externe VPN-server gestuurd. Landen Mijn gegevens Tracker naam - Internettoegang - Je kunt ook op het app-icoon tikken in het hoofdscherm. App beheren Trackers blokkeren @@ -409,7 +407,6 @@ Het internetverkeer wordt niet naar een externe VPN-server gestuurd. Standaard Strikt Onderzoek - Uitsluiten van vpn Deïnstalleren App-instellingen & deïnstalleren Zet de schakelaar in het hoofdscherm op aan en start de app om trackers op te sporen @@ -463,4 +460,16 @@ Het internetverkeer wordt niet naar een externe VPN-server gestuurd. + + + Bescherming + Beschermd + Trackers worden voor deze app geblokkeerd en geregistreerd. + Trackers toegestaan + De app blijft via TrackerControl lopen, maar de trackers worden niet geblokkeerd en niet geregistreerd. Gebruik dit als blokkeren de app stukmaakt. + Geen internet + Alle verbindingen van deze app worden geblokkeerd. Je kunt ook op het app-pictogram in het hoofdscherm tikken. + Geldt ook voor %1$s, die een Android-gebruikers-ID deelt met deze app. + TrackerControl omzeilen + De app maakt rechtstreeks verbinding, buiten TrackerControl om. Er wordt niets voor gecontroleerd of geblokkeerd. Gebruik dit als laatste redmiddel als de app nog steeds niet werkt.\n\nLet op: \"Verbindingen zonder VPN blokkeren\" in de Android-VPN-instellingen moet UITGESCHAKELD zijn om dit te laten werken. diff --git a/app/src/main/res/values-no-rNO/strings.xml b/app/src/main/res/values-no-rNO/strings.xml index 74f97d749..0b792dea5 100644 --- a/app/src/main/res/values-no-rNO/strings.xml +++ b/app/src/main/res/values-no-rNO/strings.xml @@ -235,7 +235,6 @@ Internett-trafikken din blir ikke sendt til en ekstern VPN-server. Land Mine data Sporernavn - Internett-tilgang Behandle app Block sporere @@ -354,4 +353,16 @@ Vennlig hilsen,\n\n]]> + + + Beskyttelse + Beskyttet + Sporere blokkeres og registreres for denne appen. + Sporere tillatt + Appen går fortsatt gjennom TrackerControl, men sporerne blir verken blokkert eller registrert. Bruk dette hvis blokkering ødelegger appen. + Ingen internett + Alle tilkoblinger fra denne appen blokkeres. Du kan også trykke på appikonet på hovedskjermen. + Gjelder også %1$s, som deler en Android-bruker-ID med denne appen. + Omgå TrackerControl + Appen kobler til direkte, utenfor TrackerControl. Ingenting overvåkes eller blokkeres for den. Bruk dette som siste utvei hvis appen fortsatt ikke virker.\n\nMerk: \"Blokker tilkoblinger uten VPN\" i Androids VPN-innstillinger må være DEAKTIVERT for at dette skal virke. diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index ad619fbfb..bd1bc7c6e 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -243,7 +243,6 @@ Twój ruch internetowy nie jest wysyłany do zdalnego serwera VPN. Kraje Moje dane Nazwa znacznika - Dostęp do internetu Zarządzaj aplikacją Trackery blokowe @@ -362,4 +361,16 @@ Z poważaniem,\n\n]]> + + + Ochrona + Chroniona + Trackery są blokowane i rejestrowane dla tej aplikacji. + Trackery dozwolone + Aplikacja nadal działa przez TrackerControl, ale jej trackery nie są ani blokowane, ani rejestrowane. Użyj tego, jeśli blokowanie psuje aplikację. + Brak Internetu + Wszystkie połączenia tej aplikacji są zablokowane. Możesz też dotknąć ikony aplikacji na ekranie głównym. + Dotyczy też %1$s, która współdzieli z tą aplikacją identyfikator użytkownika Androida. + Pomiń TrackerControl + Aplikacja łączy się bezpośrednio, poza TrackerControl. Nic nie jest dla niej monitorowane ani blokowane. Użyj tego w ostateczności, jeśli aplikacja nadal nie działa.\n\nUwaga: opcja \"Blokuj połączenia bez VPN\" w ustawieniach VPN Androida musi być WYŁĄCZONA, aby to zadziałało. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9c607c4c8..66ec6cbec 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -284,8 +284,6 @@ O seu tráfego de internet não está sendo enviado para um servidor VPN remoto. Países Meus dados Nome do rastreador - Acesso à Internet - Você também pode tocar no ícone do app na tela principal. Gerenciar app Bloquear rastreadores @@ -346,9 +344,6 @@ O seu tráfego de internet não está sendo enviado para um servidor VPN remoto. Bloqueia tudo, incluindo serviços essenciais e domínios ambíguos. Falhas significativas em aplicativos — muitos aplicativos precisarão ser excluídos manualmente. Pesquisa Sem bloqueio do rastreador. Transmissões de logs para ADB e permite a extração SNI para melhor detecção de nome de host. Apenas pesquisa: isso vaza seu endereço IP para servidores de rastreadores. - Detecta e bloqueia rastreadores para este app. - Excluir da VPN - Habilite se você se deparar com problemas. O aplicativo irá ignorar completamente o TrackerControl\n\nNota: \"Bloquear conexões sem VPN\" nas configurações de VPN do Android deve ser DESATIVADA para funcionar. Desinstalar Configurações do app & Desinstalar Habilite o interruptor na tela principal e inicie o app para encontrar rastreadores @@ -454,4 +449,16 @@ O seu tráfego de internet não está sendo enviado para um servidor VPN remoto. Falha ao aplicar arquivos host Última atualização: %s + + + Proteção + Protegido + Os rastreadores são bloqueados e registrados para este aplicativo. + Rastreadores permitidos + O aplicativo continua passando pelo TrackerControl, mas seus rastreadores não são bloqueados nem registrados. Use isto se o bloqueio quebrar o aplicativo. + Sem Internet + Todas as conexões deste aplicativo estão bloqueadas. Você também pode tocar no ícone do aplicativo na tela principal. + Também se aplica a %1$s, que compartilha um ID de usuário do Android com este aplicativo. + Ignorar o TrackerControl + O aplicativo se conecta diretamente, fora do TrackerControl. Nada é monitorado nem bloqueado para ele. Use isto como último recurso se o aplicativo ainda não funcionar.\n\nObservação: \"Bloquear conexões sem VPN\" nas configurações de VPN do Android precisa estar DESATIVADO para que isto funcione. diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index dd8187a63..0c90201ee 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -238,7 +238,6 @@ Seu tráfego de Internet não está sendo enviado para um servidor VPN remoto.Países Meus dados Nome do Tracker - Acesso de Internet Gerenciar o aplicativo Rastreadores de bloqueio @@ -330,4 +329,16 @@ disso,\n\n]]> + + + Proteção + Protegida + Os rastreadores são bloqueados e registados para esta aplicação. + Rastreadores permitidos + A aplicação continua a passar pelo TrackerControl, mas os seus rastreadores não são bloqueados nem registados. Utilize isto se o bloqueio impedir a aplicação de funcionar. + Sem Internet + Todas as ligações desta aplicação estão bloqueadas. Também pode tocar no ícone da aplicação no ecrã principal. + Aplica-se também a %1$s, que partilha um ID de utilizador Android com esta aplicação. + Ignorar o TrackerControl + A aplicação liga-se diretamente, fora do TrackerControl. Nada é monitorizado nem bloqueado para ela. Utilize isto como último recurso se a aplicação continuar a não funcionar.\n\nNota: \"Bloquear ligações sem VPN\" nas definições de VPN do Android tem de estar DESATIVADO para que isto funcione. diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index 5fc766574..fc76fc54f 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -73,4 +73,16 @@ + + + Protecție + Protejată + Urmăritorii sunt blocați și înregistrați pentru această aplicație. + Urmăritori permiși + Aplicația trece în continuare prin TrackerControl, dar urmăritorii ei nu sunt nici blocați, nici înregistrați. Folosiți această opțiune dacă blocarea strică aplicația. + Fără Internet + Toate conexiunile acestei aplicații sunt blocate. Puteți atinge și pictograma aplicației din ecranul principal. + Se aplică și pentru %1$s, care împarte un ID de utilizator Android cu această aplicație. + Ocolește TrackerControl + Aplicația se conectează direct, în afara TrackerControl. Nimic nu este monitorizat sau blocat pentru ea. Folosiți această opțiune ca ultimă soluție dacă aplicația tot nu funcționează.\n\nNotă: \"Blochează conexiunile fără VPN\" din setările VPN Android trebuie să fie DEZACTIVAT pentru ca aceasta să funcționeze. diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index 247c96d2e..cbee352ea 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -299,8 +299,6 @@ Страны Мои данные Название трекера - Интернет-доступ - Вы также можете нажать на значок приложения на главном экране. Управление приложением Блокировать трекеры @@ -364,9 +362,6 @@ Блокирует все, включая основные сервисы и неоднозначные домены. Значительные поломки приложений — многие приложения должны быть исключены вручную. Исследование Нет блокировки трекера. Логирует передачу в ADB и позволяет извлекать SNI для лучшего определения имени хоста. Только для исследований: это позволяет утечь вашему IP-адреу на сервера трекера. - Обнаружает и блокирует трекеры для этого приложения. - Исключить из VPN - Включите, если вы столкнулись с проблемами. Приложение полностью обходит TrackerControl.\n\nПримечание: «Блокировать соединения без VPN» в настройках Android VPN должен быть отключен, чтобы это работало. Удаление Настройки приложения и деинсталляция Включите переключатель на главном экране, затем запустите приложение, чтобы найти трекеры @@ -491,4 +486,16 @@ Не удалось применить hosts файлы Последнее обновление: %s + + + Защита + Защищено + Трекеры для этого приложения блокируются и записываются. + Трекеры разрешены + Приложение по-прежнему работает через TrackerControl, но его трекеры не блокируются и не записываются. Выберите этот вариант, если блокировка ломает приложение. + Без Интернета + Все соединения этого приложения заблокированы. Также можно нажать на значок приложения на главном экране. + Относится и к %1$s: это приложение использует общий с ним идентификатор пользователя Android. + В обход TrackerControl + Приложение подключается напрямую, минуя TrackerControl. Для него ничего не отслеживается и не блокируется. Используйте это как крайнюю меру, если приложение по-прежнему не работает.\n\nПримечание: параметр \"Блокировать соединения без VPN\" в настройках VPN Android должен быть ОТКЛЮЧЁН, чтобы это работало. diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml index eea944e64..be56e0b22 100644 --- a/app/src/main/res/values-sl-rSI/strings.xml +++ b/app/src/main/res/values-sl-rSI/strings.xml @@ -415,8 +415,6 @@ Vaš internetni promet se ne pošilja na oddaljeni strežnik VPN. Države Moji podatki Ime sledilca - Dostop do interneta - Lahko se tudi dotaknete ikone programa na glavnem zaslonu. Upravljanje programa Blokiraj sledilce @@ -482,9 +480,6 @@ Vaš internetni promet se ne pošilja na oddaljeni strežnik VPN. Blokira vse, vključno z osnovnimi storitvami in nejasnimi domenami. Delovanje nekaterih programov bo znatno prizadeto in jih boste morali ročno izključiti. Raziskovalno Brez blokiranja sledilcev. Beleži prenose v ADB in omogoči izločitev SNI za boljše zaznavanje gostiteljskih imen. Samo za raziskave: to sledilnim strežnikom razkrije vaš naslov IP. - Zazna in blokira sledilce za ta program. - Izključi iz VPN-a - Omogočite, če naletite na težave. Program bo v celoti zaobšel TrackerControl.\n\nOpomba: Da bi to delovalo, morate v Androidovih nastavitvah VPN-a ONEMOGOČITI \"Blokiraj povezave brez VPN-a\". Odstrani Nastavitve programa in odstranitev Omogočite stikalo na glavnem zaslonu, nato zaženite program, da poiščete sledilce. @@ -613,4 +608,16 @@ Vaš internetni promet se ne pošilja na oddaljeni strežnik VPN. Uporaba datotek z gostitelji je spodletela. Zadnja posodobitev: %s + + + Zaščita + Zaščiteno + Sledilniki so za to aplikacijo blokirani in zabeleženi. + Sledilniki dovoljeni + Aplikacija še naprej teče prek TrackerControla, njeni sledilniki pa niso ne blokirani ne zabeleženi. Uporabite to, če blokiranje pokvari aplikacijo. + Brez interneta + Vse povezave te aplikacije so blokirane. Lahko se tudi dotaknete ikone aplikacije na glavnem zaslonu. + Velja tudi za %1$s, ki si s to aplikacijo deli Androidov ID uporabnika. + Obidi TrackerControl + Aplikacija se poveže neposredno, mimo TrackerControla. Zanjo se nič ne spremlja in nič ne blokira. Uporabite to kot zadnjo možnost, če aplikacija še vedno ne deluje.\n\nOpomba: možnost \"Blokiraj povezave brez VPN\" v Androidovih nastavitvah VPN mora biti IZKLOPLJENA, da to deluje. diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 60167cbd9..315c0552f 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -3,4 +3,16 @@ + + + Skydd + Skyddad + Spårare blockeras och registreras för den här appen. + Spårare tillåts + Appen fortsätter att gå via TrackerControl, men dess spårare varken blockeras eller registreras. Använd detta om blockeringen gör att appen slutar fungera. + Inget internet + Alla anslutningar från den här appen blockeras. Du kan även trycka på appikonen på huvudskärmen. + Gäller även %1$s, som delar ett Android-användar-ID med den här appen. + Förbigå TrackerControl + Appen ansluter direkt, utanför TrackerControl. Ingenting övervakas eller blockeras för den. Använd detta som sista utväg om appen fortfarande inte fungerar.\n\nObs: \"Blockera anslutningar utan VPN\" i Androids VPN-inställningar måste vara INAKTIVERAT för att detta ska fungera. diff --git a/app/src/main/res/values-ta-rIN/strings.xml b/app/src/main/res/values-ta-rIN/strings.xml index 7909074fb..6c1a1a946 100644 --- a/app/src/main/res/values-ta-rIN/strings.xml +++ b/app/src/main/res/values-ta-rIN/strings.xml @@ -12,4 +12,16 @@ + + + பாதுகாப்பு + பாதுகாக்கப்பட்டது + இந்த ஆப்ஸுக்கான டிராக்கர்கள் தடுக்கப்பட்டு பதிவு செய்யப்படுகின்றன. + டிராக்கர்கள் அனுமதிக்கப்பட்டன + ஆப்ஸ் தொடர்ந்து TrackerControl வழியாகச் செல்கிறது, ஆனால் அதன் டிராக்கர்கள் தடுக்கப்படுவதுமில்லை, பதிவு செய்யப்படுவதுமில்லை. தடுப்பதால் ஆப்ஸ் வேலை செய்யாவிட்டால் இதைப் பயன்படுத்தவும். + இணையம் இல்லை + இந்த ஆப்ஸின் அனைத்து இணைப்புகளும் தடுக்கப்படுகின்றன. முதன்மைத் திரையில் ஆப்ஸ் ஐகானைத் தட்டியும் மாற்றலாம். + இந்த ஆப்ஸுடன் Android பயனர் ஐடியைப் பகிர்ந்துகொள்ளும் %1$s-க்கும் இது பொருந்தும். + TrackerControl-ஐத் தவிர் + ஆப்ஸ் TrackerControl-ஐத் தவிர்த்து நேரடியாக இணைகிறது. அதற்காக எதுவும் கண்காணிக்கப்படுவதோ தடுக்கப்படுவதோ இல்லை. ஆப்ஸ் இன்னும் வேலை செய்யாவிட்டால் கடைசி வழியாக இதைப் பயன்படுத்தவும்.\n\nகுறிப்பு: இது வேலை செய்ய Android VPN அமைப்புகளில் \"VPN இல்லாத இணைப்புகளைத் தடு\" முடக்கப்பட்டிருக்க வேண்டும். diff --git a/app/src/main/res/values-te-rIN/strings.xml b/app/src/main/res/values-te-rIN/strings.xml index 7909074fb..bcecf9644 100644 --- a/app/src/main/res/values-te-rIN/strings.xml +++ b/app/src/main/res/values-te-rIN/strings.xml @@ -12,4 +12,16 @@ + + + రక్షణ + రక్షించబడింది + ఈ యాప్ కోసం ట్రాకర్‌లు నిరోధించబడతాయి మరియు రికార్డ్ చేయబడతాయి. + ట్రాకర్‌లు అనుమతించబడ్డాయి + యాప్ TrackerControl ద్వారానే కొనసాగుతుంది, కానీ దాని ట్రాకర్‌లు నిరోధించబడవు, రికార్డ్ చేయబడవు. నిరోధించడం వల్ల యాప్ పని చేయకపోతే దీన్ని ఉపయోగించండి. + ఇంటర్నెట్ లేదు + ఈ యాప్ యొక్క అన్ని కనెక్షన్‌లు నిరోధించబడ్డాయి. ప్రధాన స్క్రీన్‌లో యాప్ చిహ్నాన్ని కూడా నొక్కవచ్చు. + ఈ యాప్‌తో Android వినియోగదారు ID‌ను పంచుకునే %1$sకు కూడా ఇది వర్తిస్తుంది. + TrackerControlను దాటవేయి + యాప్ TrackerControl వెలుపల నేరుగా కనెక్ట్ అవుతుంది. దాని కోసం ఏదీ పర్యవేక్షించబడదు లేదా నిరోధించబడదు. యాప్ ఇప్పటికీ పని చేయకపోతే చివరి ప్రయత్నంగా దీన్ని ఉపయోగించండి.\n\nగమనిక: ఇది పని చేయాలంటే Android VPN సెట్టింగ్‌లలో \"VPN లేకుండా కనెక్షన్‌లను నిరోధించు\" నిలిపివేయబడాలి. diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index b7ba3f3b5..3d4863efe 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -237,7 +237,6 @@ Bu nedenle, lütfen bir sonraki iletişim kutusunda bir VPN bağlantısına izin Ülkeler Bilgilerim İzleyici Adı - İnternet Erişimi Uygulama Yönet İzleyicileri engelle @@ -356,4 +355,16 @@ Saygılarımla,\n\n]]> + + + Koruma + Korunuyor + Bu uygulama için izleyiciler engelleniyor ve kaydediliyor. + İzleyicilere izin ver + Uygulama TrackerControl üzerinden çalışmaya devam eder, ancak izleyicileri ne engellenir ne de kaydedilir. Engelleme uygulamayı bozuyorsa bunu kullanın. + İnternet yok + Bu uygulamanın tüm bağlantıları engellendi. Ana ekrandaki uygulama simgesine de dokunabilirsiniz. + Bu uygulamayla Android kullanıcı kimliğini paylaşan %1$s için de geçerlidir. + TrackerControl\'ü atla + Uygulama, TrackerControl dışında doğrudan bağlanır. Onun için hiçbir şey izlenmez veya engellenmez. Uygulama hâlâ çalışmıyorsa son çare olarak bunu kullanın.\n\nNot: Bunun çalışması için Android VPN ayarlarındaki \"VPN olmadan bağlantıları engelle\" seçeneği KAPALI olmalıdır. diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index c6f0cf4db..a99b2c335 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -412,8 +412,6 @@ Країни Мої дані Назва трекера - Доступ до Інтернету - Ви також можете натиснути на значок програми на головному екрані. Керувати додатком Блокувати трекери @@ -513,9 +511,6 @@ Блокує все, включаючи важливі служби та неоднозначні домени. Значні пошкодження програм — багато програм потрібно буде виключити вручну. Дослідження Не блокує трекери. Реєструє передачу даних до ADB та вмикає вилучення SNI для кращого виявлення імені хоста. Тільки для дослідницьких цілей: це призводить до витоку вашої IP-адреси на сервери трекерів. - Виявляє та блокує трекери для цієї програми. - Виключити з VPN - Увімкніть, якщо виникнуть проблеми. Додаток повністю обійде TrackerControl.\n\nПримітка: щоб це працювало, у налаштуваннях VPN Android необхідно вимкнути опцію «Блокувати з\'єднання без VPN». Видалити Налаштування Програми & Видалення Увімкніть перемикач на головному екрані, а потім запустіть додаток, щоб знайти трекери @@ -644,4 +639,16 @@ Не вдалося застосувати файли хосту Останнє оновлення: %s + + + Захист + Захищено + Трекери для цього застосунку блокуються та записуються. + Трекери дозволено + Застосунок і далі працює через TrackerControl, але його трекери не блокуються й не записуються. Виберіть це, якщо блокування ламає застосунок. + Без Інтернету + Усі з\'єднання цього застосунку заблоковано. Також можна торкнутися значка застосунку на головному екрані. + Стосується також %1$s, який має спільний із цим застосунком ідентифікатор користувача Android. + Обійти TrackerControl + Застосунок з\'єднується напряму, поза TrackerControl. Для нього нічого не відстежується й не блокується. Використовуйте це як останній засіб, якщо застосунок і далі не працює.\n\nПримітка: параметр \"Блокувати з\'єднання без VPN\" у налаштуваннях VPN Android має бути ВИМКНЕНИЙ, щоб це працювало. diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index e29525120..9a3d5f78e 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -294,7 +294,6 @@ Quốc gia Dữ liệu của tôi Tên trình theo dõi - Truy cập Internet Quản lý ứng dụng Chặn trình theo dõi @@ -375,4 +374,16 @@ + + + Bảo vệ + Được bảo vệ + Trình theo dõi bị chặn và được ghi lại cho ứng dụng này. + Cho phép trình theo dõi + Ứng dụng vẫn đi qua TrackerControl, nhưng các trình theo dõi của nó không bị chặn và cũng không được ghi lại. Hãy dùng tuỳ chọn này nếu việc chặn làm hỏng ứng dụng. + Không có Internet + Mọi kết nối của ứng dụng này đều bị chặn. Bạn cũng có thể chạm vào biểu tượng ứng dụng ở màn hình chính. + Cũng áp dụng cho %1$s, ứng dụng dùng chung ID người dùng Android với ứng dụng này. + Bỏ qua TrackerControl + Ứng dụng kết nối trực tiếp, bên ngoài TrackerControl. Không có gì được giám sát hay chặn cho nó. Hãy dùng tuỳ chọn này như biện pháp cuối cùng nếu ứng dụng vẫn không hoạt động.\n\nLưu ý: \"Chặn kết nối khi không có VPN\" trong cài đặt VPN của Android phải được TẮT thì tuỳ chọn này mới hoạt động. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e6a01a329..c59d20d3d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -408,8 +408,6 @@ 国家 我的数据 追踪器名称 - 互联网访问 - 您也可以点击主屏幕上的应用图标。 管理应用 屏蔽追踪器 @@ -508,9 +506,6 @@ 屏蔽一切,包括基本服务和模糊域。严重的应用程序异常 — 需手动排除众多应用。 研究 无跟踪器屏蔽。传输日志到 ADB 并允许提取SNI以更好地检测主机名。仅研究:这将泄漏您的 IP 地址到跟踪服务器。 - 检测并阻止此应用的跟踪器。 - 从 VPN 中排除 - 如果您遇到问题,请启用。应用将完全绕过 TrackerControl。\n\n注意:在Android VPN 设置中\"屏蔽不使用VPN的所有连接\"必须禁用才能让这个选项正常工作。 卸载 应用设置 & 卸载 在主界面开启开关,然后启动应用寻找追踪器 @@ -639,4 +634,16 @@ 应用主机文件失败 上次更新:%s + + + 保护 + 已保护 + 为此应用拦截并记录跟踪器。 + 允许跟踪器 + 应用仍然通过 TrackerControl 联网,但其跟踪器既不被拦截也不被记录。如果拦截导致应用无法正常使用,可选择此项。 + 无网络 + 此应用的所有连接都会被拦截。你也可以在主界面点按应用图标。 + 同样适用于 %1$s,它与此应用共用同一个 Android 用户 ID。 + 绕过 TrackerControl + 应用将绕过 TrackerControl 直接联网,不会对其进行任何监测或拦截。仅在应用仍然无法使用时作为最后手段使用。\n\n注意:必须在 Android 的 VPN 设置中停用\"屏蔽不使用 VPN 的连接\",此项才能生效。 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 24d443649..9a361761d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -126,7 +126,6 @@ 國家 我的資料 追蹤器名稱 - 網際網路連線 管理應用程式 阻擋追蹤器 @@ -165,4 +164,16 @@ + + + 保護 + 已保護 + 為此應用程式封鎖並記錄追蹤器。 + 允許追蹤器 + 應用程式仍會經由 TrackerControl 連線,但其追蹤器既不會被封鎖也不會被記錄。若封鎖導致應用程式無法正常運作,請選擇此項。 + 無網際網路 + 此應用程式的所有連線都會被封鎖。你也可以在主畫面點按應用程式圖示。 + 同樣適用於 %1$s,它與此應用程式共用同一個 Android 使用者 ID。 + 略過 TrackerControl + 應用程式會略過 TrackerControl 直接連線,不會對其進行任何監控或封鎖。僅在應用程式仍無法使用時作為最後手段使用。\n\n注意:必須在 Android 的 VPN 設定中停用\"封鎖不使用 VPN 的連線\",此項才會生效。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4d830c382..5ff419dad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -519,8 +519,6 @@ Your internet traffic is not being sent to a remote VPN server. Countries My Data Tracker Name - Internet Access - You can also tap the app icon in the main screen. Manage App @@ -633,10 +631,18 @@ Sincerely,\n\n]]> Research No tracker blocking. Logs transmissions to ADB and enables SNI extraction for better hostname detection. Research only: this leaks your IP address to tracker servers. - Tracker Protection - Detects and blocks trackers for this app. - Exclude from VPN - Enable if you run into issues. App will bypass TrackerControl completely.\n\nNote: \"Block connections without VPN\" in the Android VPN settings must be DISABLED for this to work. + + Protection + Protected + Trackers are blocked and recorded for this app. + Trackers allowed + The app keeps running through TrackerControl, but its trackers are neither blocked nor recorded. Use this if blocking breaks the app. + No Internet + All connections from this app are blocked. You can also tap the app icon in the main screen. + %1$s %2$s + Also applies to %1$s, which shares an Android user ID with this app. + Bypass TrackerControl + The app connects directly, outside TrackerControl. Nothing is monitored or blocked for it. Use this as a last resort if the app still does not work.\n\nNote: \"Block connections without VPN\" in the Android VPN settings must be DISABLED for this to work. Uninstall App Settings & Uninstall diff --git a/app/src/test/java/net/kollnig/missioncontrol/data/AppProtectionStateTest.java b/app/src/test/java/net/kollnig/missioncontrol/data/AppProtectionStateTest.java new file mode 100644 index 000000000..0eab2c360 --- /dev/null +++ b/app/src/test/java/net/kollnig/missioncontrol/data/AppProtectionStateTest.java @@ -0,0 +1,143 @@ +/* + * TrackerControl is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * TrackerControl is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Copyright © 2026 + */ + +package net.kollnig.missioncontrol.data; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import net.kollnig.missioncontrol.data.AppProtectionState.Change; + +import org.junit.Test; + +public class AppProtectionStateTest { + + @Test + public void defaultCombinationIsProtected() { + assertEquals(AppProtectionState.PROTECTED, + AppProtectionState.resolve(true, true, false)); + } + + @Test + public void protectionOffInsideTunnelIsTrackersAllowed() { + assertEquals(AppProtectionState.TRACKERS_ALLOWED, + AppProtectionState.resolve(true, false, false)); + } + + @Test + public void internetBlockWinsOverProtectionFlag() { + assertEquals(AppProtectionState.NO_INTERNET, + AppProtectionState.resolve(true, true, true)); + assertEquals(AppProtectionState.NO_INTERNET, + AppProtectionState.resolve(true, false, true)); + } + + /** + * An excluded app is removed from the tun, so the per-UID internet block + * cannot be enforced for it; Bypass has to dominate. + */ + @Test + public void bypassWinsOverEverything() { + for (boolean trackerProtect : new boolean[] { true, false }) + for (boolean internetBlocked : new boolean[] { true, false }) + assertEquals(AppProtectionState.BYPASSED, + AppProtectionState.resolve(false, trackerProtect, internetBlocked)); + } + + /** + * XML import restores the three stores independently and never normalises + * them, so resolve() must be total over all eight inputs. + */ + @Test + public void resolveIsTotalOverAllCombinations() { + int combinations = 0; + for (boolean apply : new boolean[] { true, false }) + for (boolean trackerProtect : new boolean[] { true, false }) + for (boolean internetBlocked : new boolean[] { true, false }) { + assertNotNull(AppProtectionState.resolve(apply, trackerProtect, internetBlocked)); + combinations++; + } + assertEquals(8, combinations); + } + + @Test + public void everyStateRoundTripsThroughItsChange() { + for (AppProtectionState state : AppProtectionState.values()) { + Change change = AppProtectionState.of(state); + + // Worst case: apply the change on top of every possible prior state. + for (boolean priorProtect : new boolean[] { true, false }) + for (boolean priorInternet : new boolean[] { true, false }) { + boolean protect = change.trackerProtect == null + ? priorProtect + : change.trackerProtect; + boolean internet = change.internetBlocked == null + ? priorInternet + : change.internetBlocked; + assertEquals(state, + AppProtectionState.resolve(change.apply, protect, internet)); + } + } + } + + @Test + public void noInternetKeepsTrackerProtectionChoice() { + Change change = AppProtectionState.of(AppProtectionState.NO_INTERNET); + assertNull(change.trackerProtect); + assertTrue(change.apply); + assertEquals(Boolean.TRUE, change.internetBlocked); + } + + @Test + public void bypassTouchesOnlyApply() { + Change change = AppProtectionState.of(AppProtectionState.BYPASSED); + assertNull(change.trackerProtect); + assertNull(change.internetBlocked); + } + + /** + * Leaving No-internet has to clear the block, otherwise the app would fall + * straight back into No-internet by precedence. + */ + @Test + public void leavingNoInternetClearsTheBlock() { + assertEquals(Boolean.FALSE, + AppProtectionState.of(AppProtectionState.PROTECTED).internetBlocked); + assertEquals(Boolean.FALSE, + AppProtectionState.of(AppProtectionState.TRACKERS_ALLOWED).internetBlocked); + } + + /** + * Browsers default to tracker protection off, so an untouched browser + * resolves to Trackers allowed while an ordinary app resolves to Protected. + * Selecting Protected writes the flag explicitly and overrides that default. + */ + @Test + public void browserDefaultResolvesToTrackersAllowed() { + boolean browserDefault = BlockingMode.resolveTrackerProtection(true, null); + assertEquals(AppProtectionState.TRACKERS_ALLOWED, + AppProtectionState.resolve(true, browserDefault, false)); + + boolean ordinaryDefault = BlockingMode.resolveTrackerProtection(false, null); + assertEquals(AppProtectionState.PROTECTED, + AppProtectionState.resolve(true, ordinaryDefault, false)); + + Change change = AppProtectionState.of(AppProtectionState.PROTECTED); + boolean configuredBrowser = BlockingMode.resolveTrackerProtection(true, change.trackerProtect); + assertEquals(AppProtectionState.PROTECTED, + AppProtectionState.resolve(change.apply, configuredBrowser, false)); + } +} diff --git a/app/src/test/java/net/kollnig/missioncontrol/data/BlockingModeLogicTest.java b/app/src/test/java/net/kollnig/missioncontrol/data/BlockingModeLogicTest.java index d7752e42c..ba58d42d1 100644 --- a/app/src/test/java/net/kollnig/missioncontrol/data/BlockingModeLogicTest.java +++ b/app/src/test/java/net/kollnig/missioncontrol/data/BlockingModeLogicTest.java @@ -131,6 +131,55 @@ public void clearingAutoExcludedAppRemovesItFromManagedSet() { BlockingModeLogic.clearAutoExcludedApp(Set.of("browser", "other"), "other")); } + /** + * The UI must keep an auto-excluded app in the managed set while it stays + * excluded, otherwise toggling it off and on again before the next mode + * switch silently converts a Minimal-mode auto-exclusion into a permanent + * one. This is the pre-sync window: syncVpnExclusions self-heals on the + * next mode switch, but only if membership survived until then. + */ + @Test + public void reExcludedAutoExcludedAppStillRestoresOnModeSwitch() { + Map applyPrefs = new HashMap<>(); + applyPrefs.put("incompatible", false); + + // Membership is retained because the resulting apply is false. + Set autoExcludedApps = Set.of("incompatible"); + + BlockingModeLogic.ExclusionSyncResult result = BlockingModeLogic.syncVpnExclusions( + BlockingModeLogic.MODE_STANDARD, + Set.of("incompatible"), + applyPrefs, + autoExcludedApps); + + assertEquals(Set.of("incompatible"), result.applyRemovals); + assertTrue(result.autoExcludedApps.isEmpty()); + } + + /** + * Re-including an auto-excluded app does clear its membership, and the next + * sync must then leave the app alone rather than excluding it again. + */ + @Test + public void reIncludedAutoExcludedAppIsNotExcludedAgain() { + Set autoExcludedApps = + BlockingModeLogic.clearAutoExcludedApp(Set.of("incompatible"), "incompatible"); + assertTrue(autoExcludedApps.isEmpty()); + + Map applyPrefs = new HashMap<>(); + applyPrefs.put("incompatible", true); + + BlockingModeLogic.ExclusionSyncResult result = BlockingModeLogic.syncVpnExclusions( + BlockingModeLogic.MODE_MINIMAL, + Set.of("incompatible"), + applyPrefs, + autoExcludedApps); + + assertTrue(result.applyFalsePackages.isEmpty()); + assertTrue(result.applyRemovals.isEmpty()); + assertTrue(result.autoExcludedApps.isEmpty()); + } + @Test public void browserCategoryIsNotParsedAsVpnExclusion() { Set excludedApps = BlockingModeLogic.parseExcludedAppsJson(