0
0
mirror of https://github.com/TrianguloY/UrlChecker.git synced 2024-09-19 20:02:16 +02:00

Merge branch 'master' into New_button_+_issue98

This commit is contained in:
bjbjorn 2023-05-15 11:20:25 +02:00 committed by GitHub
commit 87384a5647
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
81 changed files with 2361 additions and 817 deletions

View File

@ -39,7 +39,7 @@ jobs:
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
- name: Run Codacy Analysis CLI
uses: codacy/codacy-analysis-cli-action@master
uses: codacy/codacy-analysis-cli-action@v4
timeout-minutes: 5
with:
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository

View File

@ -0,0 +1,57 @@
# This action will send a comment to the pr for download the built apk.
# Needs to be as a separate action, artifacts are not available on the action used to upload them
name: Comment Artifact URL on PR
on:
workflow_run:
workflows:
- "Validate gradle build test"
types:
- "completed"
permissions:
actions: read # need to read the artifacts url
pull-requests: write # need to write the comment
jobs:
comment-on-pr:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
steps:
- name: Post url to artifact
env:
GITHUB_TOKEN: ${{ github.token }}
OWNER: ${{ github.repository_owner }}
REPO: ${{ github.event.repository.name }}
CURRENT_JOB_ID: ${{ github.run_id }}
PREVIOUS_JOB_ID: ${{ github.event.workflow_run.id }}
PREVIOUS_SUITE_ID: ${{ github.event.workflow_run.check_suite_id }}
run: |
# get artifacts
read PR_NUMBER ARTIFACT_ID EXPIRES_AT <<< $(gh api "/repos/$OWNER/$REPO/actions/runs/$PREVIOUS_JOB_ID/artifacts" --jq '"\(.artifacts[0].name) \(.artifacts[1].id) \(.artifacts[1].expires_at)"')
if [ "$ARTIFACT_ID" == "null" ]; then
echo "No artifacts, (probably) not a PR, exiting"
exit
fi
echo "PR NUMBER: $PR_NUMBER"
echo "ARTIFACT ID: $ARTIFACT_ID"
echo "EXPIRES_AT: $EXPIRES_AT"
# post link comment
gh api "/repos/$OWNER/$REPO/issues/$PR_NUMBER/comments" -F body=@- <<EOF
This PR builds correctly, here is the generated apk.
This unsigned version can be installed alongside the original app and should only be used for testing the changes, not for daily usage.
| [Download testing apk](https://github.com/$OWNER/$REPO/suites/$PREVIOUS_SUITE_ID/artifacts/$ARTIFACT_ID) |
| - |
You must be logged in for the link to work.
The link will expire at $EXPIRES_AT.
<hr>
<sub>This is an automatic comment created by a [Github Action](https://github.com/$OWNER/$REPO/actions/runs/$CURRENT_JOB_ID)</sub>
EOF

View File

@ -1,4 +1,5 @@
# This actions validates the gradle files and runs a build test to ensure the app is not corrupted
# if succeeded and the source is a pull request, builds an evaluation apk
name: Validate gradle build test
on:
@ -9,6 +10,11 @@ on:
branches:
- master
# parameters
env:
VARIANT: evaluation
NAME: URLCheck_evaluation.apk
jobs:
build:
runs-on: ubuntu-latest
@ -35,3 +41,28 @@ jobs:
arguments: >
build
test
# the following steps will only run for PRs
- name: Generate apk
if: ${{ github.event_name == 'pull_request' }}
uses: gradle/gradle-build-action@v2
with:
arguments: >
assemble${{ env.VARIANT }}
- name: Upload apk as artifact
if: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@v3
with:
path: ./app/build/outputs/apk/${{ env.VARIANT }}/app-${{ env.VARIANT }}.apk
name: ${{ env.NAME }}
retention-days: 14
- name: Upload PR id as artifact
if: ${{ github.event_name == 'pull_request' }}
uses: actions/upload-artifact@v3
with:
path: /dev/null
name: ${{ github.event.number }}
retention-days: 1

View File

@ -1,58 +1,46 @@
<!-- ---------- Header ---------- -->
<div align="center">
<!-- ---------- Header ---------- -->
<img src="./docs/featured.png">
<!-- Original background with CC0 from https://www.maxpixel.net/Digital-Network-Internet-Communication-Connections-3537400 -->
<!-- title -->
# URLCheck
### Android app made by [TrianguloY](https://github.com/TrianguloY)
With contributions from: [Ilithy](https://github.com/Ilithy), [PabloOQ](https://github.com/PabloOQ) \
And translations by: [Tiago Carmo](https://github.com/ReduxFlakes), [Ilithy](https://github.com/Ilithy), Idris, [Metezd](https://github.com/metezd), Nhman Mazuz, [404potato](https://github.com/404potato), [dperruso](https://github.com/dperruso), [Seviche CC](https://github.com/Sevichecc) and more users on [Weblate](https://hosted.weblate.org/engage/urlcheck/)
</div>
<br>
<!-- ---------- Badges ---------- -->
<div align="center">
[![App-Code Size](https://img.shields.io/github/languages/code-size/trianguloy/urlchecker.svg)](https://api.github.com/repos/TrianguloY/UrlChecker)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/TrianguloY/UrlChecker)](https://github.com/TrianguloY/UrlChecker/pulse/monthly)
[![Weblate (translation percentage)](https://hosted.weblate.org/widgets/urlcheck/-/svg-badge.svg)](https://hosted.weblate.org/engage/urlcheck/) \
[![Weblate (translation percentage)](https://hosted.weblate.org/widgets/urlcheck/-/svg-badge.svg)](https://hosted.weblate.org/engage/urlcheck/)
[![GitHub version (gradle versionName)](https://img.shields.io/badge/dynamic/json?label=Latest%20version&color=white&query=version&url=https%3A%2F%2Fgithub.com%2FTrianguloY%2FUrlChecker%2Freleases%2Fdownload%2Flatest%2Fshields.json)](https://github.com/TrianguloY/UrlChecker/blob/master/app/build.gradle)
[![F-Droid](https://img.shields.io/f-droid/v/com.trianguloy.urlchecker?label=F-Droid%20version)](https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/com.trianguloy.urlchecker.yml)
[![PlayShields](https://img.shields.io/endpoint?color=green&url=https%3A%2F%2Fplay.cuzi.workers.dev%2Fplay%3Fi%3Dcom.trianguloy.urlchecker%26l%3DPlay%2520Store%2520version%26m%3Dv%24version)](https://play.google.com/store/apps/details?id=com.trianguloy.urlchecker)
</div>
<!-- ---------- Download ---------- -->
<div align="center">
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/com.trianguloy.urlchecker)
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png"
alt="Get it on Google Play"
height="80">](https://play.google.com/store/apps/details?id=com.trianguloy.urlchecker)
</div>
<!-- <details><summary><h4>links</h4></summary>
- Google Play: https://play.google.com/store/apps/details?id=com.trianguloy.urlchecker
- FDroid: https://f-droid.org/packages/com.trianguloy.urlchecker/
<hr width="50%">
</details> -->
<!-- contributors -->
### Android app made by [TrianguloY](https://github.com/TrianguloY)
Special contributors: [Ilithy](https://github.com/Ilithy), [PabloOQ](https://github.com/PabloOQ)
All contributors: \
[![Contributors](https://contrib.rocks/image?repo=TrianguloY/UrlChecker&anon=1)](https://github.com/TrianguloY/UrlChecker/graphs/contributors) \
and [404potato](https://github.com/404potato) and maybe some more from [Weblate](https://hosted.weblate.org/engage/urlcheck/).
<hr>
<!-- ---------- Description ---------- -->
<div align="center">
**URLCheck** acts as an amazingly customizable and powerful intermediary when opening url links, allowing, among other things:
to remove trackers, affiliate links, unnecessary elements, check Hosts, facilitating link holding and sharing, protecting against certain phishing techniques and many more...
</div>
<!-- ---------- Screenshots ---------- -->
<div align="center">
<div style="display: flex;">
<img src="app/src/main/play/listings/en-US/graphics/phone-screenshots/1-title.png" width=30%>
<img src="app/src/main/play/listings/en-US/graphics/phone-screenshots/2-dialog.png" width=30%>
@ -64,7 +52,7 @@ to remove trackers, affiliate links, unnecessary elements, check Hosts, facilita
<img src="app/src/main/play/listings/en-US/graphics/phone-screenshots/8-settings.png" width=30%>
</div>
</div>
</div>

View File

@ -1,17 +1,17 @@
plugins {
id 'com.android.application'
id 'com.github.triplet.play' version '3.7.0'
id 'com.github.triplet.play' version '3.8.3'
}
android {
namespace 'com.trianguloy.urlchecker'
compileSdkVersion 32
compileSdkVersion 33
defaultConfig {
applicationId "com.trianguloy.urlchecker"
minSdkVersion 14
targetSdkVersion 32
versionCode 22
versionName "2.10"
targetSdkVersion 33
versionCode 23
versionName "2.11"
// generate buildconfig field with all locales
@ -52,6 +52,11 @@ android {
applicationIdSuffix '.alpha'
versionNameSuffix '-ALPHA'
}
evaluation {
initWith(buildTypes.debug)
applicationIdSuffix '.test'
versionNameSuffix '-TEST'
}
}
lint {

View File

@ -29,6 +29,7 @@
android:name=".dialogs.MainDialog"
android:exported="true"
android:noHistory="true"
android:windowSoftInputMode="adjustResize|stateHidden"
android:theme="@android:style/Theme.DeviceDefault.Dialog">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
@ -82,6 +83,9 @@
<action android:name="android.intent.action.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
<service

File diff suppressed because one or more lines are too long

View File

@ -42,9 +42,12 @@ public class AboutActivity extends Activity {
setTitle(R.string.a_about);
AndroidUtils.configureUp(this);
// on release, append version to the action bar title
if (!BuildConfig.DEBUG) {
// on release, append version to the action bar title
setTitle(getTitle() + " (V" + BuildConfig.VERSION_NAME + ")");
} else if (!"alpha".equals(BuildConfig.BUILD_TYPE)) {
// on no-alpha, append type
setTitle(getTitle() + " (" + BuildConfig.BUILD_TYPE + ")");
}
// fill contributors and translators
@ -58,7 +61,7 @@ public class AboutActivity extends Activity {
// create links
ViewGroup v_links = findViewById(R.id.links);
for (var link : LINKS) {
var v_link = Inflater.<TextView>inflate(R.layout.about_link, v_links, this);
var v_link = Inflater.<TextView>inflate(R.layout.about_link, v_links);
v_link.setText(link.first);
AndroidUtils.setAsClickable(v_link);
v_link.setTag(link.second.replace("{package}", getPackageName()));

View File

@ -98,7 +98,7 @@ public class ModulesActivity extends Activity {
final AModuleConfig config = module.getConfig(this);
// inflate
View parent = Inflater.inflate(R.layout.config_module, list, this);
View parent = Inflater.inflate(R.layout.config_module, list);
parent.setTag(module.getId());
Animations.enableAnimations(parent);
@ -142,7 +142,7 @@ public class ModulesActivity extends Activity {
AndroidUtils.longTapForDescription(toggleDecorations);
// configuration of the module
var child = Inflater.inflate(config.getLayoutId(), parent.findViewById(R.id.box), this);
var child = Inflater.inflate(config.getLayoutId(), parent.findViewById(R.id.box));
config.onInitialize(child);
// configure toggleable description

View File

@ -35,8 +35,9 @@ public class ShortcutsActivity extends Activity {
if (Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
// old android method
setResult(RESULT_OK, new Intent()
.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(this, getClass()))
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(this, getClass())
.setAction(Intent.ACTION_VIEW)
)
.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.shortcut_checkClipboard))
.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.mipmap.clipboard_launcher))
);

View File

@ -3,6 +3,7 @@ package com.trianguloy.urlchecker.dialogs;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
@ -57,6 +58,8 @@ public class JsonEditor {
.setCancelable(false)
.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
// prepare more dialog
// these are configured here to disable automatic auto-closing when they are pressed
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {

View File

@ -227,7 +227,7 @@ public class MainDialog extends Activity {
// set module block
if (ModuleManager.getDecorationsPrefOfModule(moduleData, this).get()) {
// init decorations
View block = Inflater.inflate(R.layout.dialog_module, ll_mods, this);
View block = Inflater.inflate(R.layout.dialog_module, ll_mods);
final TextView title = block.findViewById(R.id.title);
title.setText(getString(R.string.dd, getString(moduleData.getName())));
parent = block.findViewById(R.id.mod);
@ -237,7 +237,7 @@ public class MainDialog extends Activity {
}
// set module content
child = Inflater.inflate(layoutId, parent, this);
child = Inflater.inflate(layoutId, parent);
views.add(child);
}
@ -261,7 +261,7 @@ public class MainDialog extends Activity {
* Adds a separator component to the list of mods
*/
private View addSeparator() {
return Inflater.inflate(R.layout.separator, ll_mods, this);
return Inflater.inflate(R.layout.separator, ll_mods);
}
/**

View File

@ -14,6 +14,7 @@ import com.trianguloy.urlchecker.modules.list.RemoveQueriesModule;
import com.trianguloy.urlchecker.modules.list.StatusModule;
import com.trianguloy.urlchecker.modules.list.TextInputModule;
import com.trianguloy.urlchecker.modules.list.UnshortenModule;
import com.trianguloy.urlchecker.modules.list.UriPartsModule;
import com.trianguloy.urlchecker.modules.list.VirusTotalModule;
import com.trianguloy.urlchecker.utilities.GenericPref;
@ -41,6 +42,7 @@ public class ModuleManager {
modules.add(new VirusTotalModule());
modules.add(new ClearUrlModule());
modules.add(new RemoveQueriesModule());
modules.add(new UriPartsModule());
modules.add(new PatternModule());
modules.add(new HostsModule());
// new modules should preferably be added directly above this line

View File

@ -1,11 +1,15 @@
package com.trianguloy.urlchecker.modules.companions;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.GenericPref;
import com.trianguloy.urlchecker.utilities.TranslatableEnum;
/**
* Static elements related to CTabs
@ -16,13 +20,13 @@ public class CTabs {
/**
* Ctabs extra intent
*/
public static final String EXTRA = "android.support.customtabs.extra.SESSION";
private static final String EXTRA = "android.support.customtabs.extra.SESSION";
/**
* CTabs preference
*/
public static GenericPref.Enumeration<Config> PREF(Context cntx) {
return new GenericPref.Enumeration<>("open_ctabs", Config.AUTO, Config.class, cntx);
public static GenericPref.Enumeration<OnOffConfig> PREF(Context cntx) {
return new GenericPref.Enumeration<>("open_ctabs", OnOffConfig.AUTO, OnOffConfig.class, cntx);
}
/**
@ -32,35 +36,82 @@ public class CTabs {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
}
/* ------------------- state ------------------- */
private final GenericPref.Enumeration<OnOffConfig> pref;
private boolean state = false;
public CTabs(Context cntx) {
pref = PREF(cntx);
}
/**
* CTabs configuration
* Initialization from a given intent and a button to toggle
*/
public enum Config implements TranslatableEnum {
AUTO(0, R.string.auto),
ON(1, R.string.mOpen_ctabsOn),
OFF(2, R.string.mOpen_ctabsOff),
ENABLED(3, R.string.mOpen_ctabsEn),
DISABLED(4, R.string.mOpen_ctabsDis),
;
// -----
private final int id;
private final int stringResource;
Config(int id, int stringResource) {
this.id = id;
this.stringResource = stringResource;
public void initFrom(Intent intent, ImageButton button) {
boolean visible;
if (CTabs.isAvailable()) {
// configure
switch (pref.get()) {
case AUTO:
default:
// If auto we get it from the intent
state = intent.hasExtra(CTabs.EXTRA);
visible = true;
break;
case DEFAULT_ON:
state = true;
visible = true;
break;
case DEFAULT_OFF:
state = false;
visible = true;
break;
case ALWAYS_ON:
state = true;
visible = false;
break;
case ALWAYS_OFF:
state = false;
visible = false;
break;
}
} else {
// not available, just ignore
visible = false;
}
@Override
public int getId() {
return id;
// set
if (visible) {
// show
AndroidUtils.longTapForDescription(button);
AndroidUtils.toggleableListener(button,
o -> state = !state,
view -> view.setImageResource(state ? R.drawable.ctabs_on : R.drawable.ctabs_off)
);
button.setVisibility(View.VISIBLE);
} else {
// hide
button.setVisibility(View.GONE);
}
}
/**
* applies the setting to a given intent
*/
public void apply(Intent intent) {
if (!CTabs.isAvailable()) return;
if (state && !intent.hasExtra(CTabs.EXTRA)) {
// enable Custom tabs
Bundle extras = new Bundle();
extras.putBinder(CTabs.EXTRA, null); // Set to null for no session
intent.putExtras(extras);
}
@Override
public int getStringResource() {
return stringResource;
if (!state && intent.hasExtra(CTabs.EXTRA)) {
// disable Custom tabs
intent.removeExtra(CTabs.EXTRA);
}
}
}

View File

@ -5,6 +5,7 @@ import android.app.AlertDialog;
import android.util.Log;
import android.util.Pair;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
@ -223,6 +224,8 @@ public class ClearUrlCatalog {
.setCancelable(true)
.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
// prepare more dialog
// these are configured here to allow auto-closing the dialog when they are pressed
Button updateNow = dialog.getButton(AlertDialog.BUTTON_POSITIVE);

View File

@ -0,0 +1,269 @@
package com.trianguloy.urlchecker.modules.companions;
import static com.trianguloy.urlchecker.utilities.JavaUtils.valueOrDefault;
import android.app.Activity;
import android.content.Intent;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* Represents intent flags
* Stores all the flags and it states, can be retrieved as list or as int
* Non-compatible flags are ignored
*/
public class Flags {
// ------------------- static -------------------
// https://github.com/MuntashirAkon/AppManager/blob/19782da4c8556c817ba5795554a1cc21f38af13a/app/src/main/java/io/github/muntashirakon/AppManager/intercept/ActivityInterceptor.java#L92
private static final Set<String> ALL_FLAGS = Set.of(
// all have a 'FLAG_' prefix
"GRANT_READ_URI_PERMISSION",
"GRANT_WRITE_URI_PERMISSION",
"FROM_BACKGROUND",
"DEBUG_LOG_RESOLUTION",
"EXCLUDE_STOPPED_PACKAGES",
"INCLUDE_STOPPED_PACKAGES",
"GRANT_PERSISTABLE_URI_PERMISSION",
"GRANT_PREFIX_URI_PERMISSION",
"DIRECT_BOOT_AUTO",
"IGNORE_EPHEMERAL",
"ACTIVITY_NO_HISTORY",
"ACTIVITY_SINGLE_TOP",
"ACTIVITY_NEW_TASK",
"ACTIVITY_MULTIPLE_TASK",
"ACTIVITY_CLEAR_TOP",
"ACTIVITY_FORWARD_RESULT",
"ACTIVITY_PREVIOUS_IS_TOP",
"ACTIVITY_EXCLUDE_FROM_RECENTS",
"ACTIVITY_BROUGHT_TO_FRONT",
"ACTIVITY_RESET_TASK_IF_NEEDED",
"ACTIVITY_LAUNCHED_FROM_HISTORY",
"ACTIVITY_NEW_DOCUMENT",
"ACTIVITY_NO_USER_ACTION",
"ACTIVITY_REORDER_TO_FRONT",
"ACTIVITY_NO_ANIMATION",
"ACTIVITY_CLEAR_TASK",
"ACTIVITY_TASK_ON_HOME",
"ACTIVITY_RETAIN_IN_RECENTS",
"ACTIVITY_LAUNCH_ADJACENT",
"ACTIVITY_MATCH_EXTERNAL",
"ACTIVITY_REQUIRE_NON_BROWSER",
"ACTIVITY_REQUIRE_DEFAULT"
);
private static final Map<String, Integer> compatibleFlags = new TreeMap<>(); // TreeMap to have the entries sorted by key
static {
// Only get flags that are present in the current Android version
for (var flag : ALL_FLAGS) {
try {
compatibleFlags.put(flag, (Integer) Intent.class.getField("FLAG_" + flag).get(null));
} catch (NoSuchFieldException ignored) {
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public static Map<String, Integer> getCompatibleFlags() {
return new TreeMap<>(compatibleFlags);
}
// ------------------- CRUD -------------------
private Set<String> flags;
// TODO store non-compatible flags? as String "0x001000", int 0x001000
public Flags() {
this(0x00000000);
}
public Flags(int hex) {
setFlags(hex);
}
public boolean isSet(String flag) {
return flags.contains(flag);
}
public int getFlagsAsInt() {
return flagsSetToHex(flags);
}
public Set<String> getFlagsAsSet() {
return new TreeSet<>(flags); // TreeSet to have the entries sorted
}
/**
* Replaces the stored flags with the received hex
*/
public void setFlags(int hex) {
this.flags = hexFlagsToSet(hex);
}
/**
* Replaces the stored flags with the received list
*/
public void setFlags(Set<String> names) {
Set<String> res = new HashSet<>(names);
res.retainAll(compatibleFlags.keySet());
this.flags = res;
}
/**
* Sets the flag to the received boolean
*/
public boolean setFlag(String flag, boolean bool) {
if (compatibleFlags.containsKey(flag)) {
if (bool) {
return flags.add(flag);
} else {
return flags.remove(flag);
}
} else {
return false;
}
}
/**
* Add flags by applying a mask
*/
public void addFlags(int hex) {
flags.addAll(hexFlagsToSet(hex));
}
/**
* Add a list of flags based on its name
*/
public void addFlags(Set<String> flags) {
this.flags.addAll(flags);
}
/**
* Add a flag based on its name
*/
public boolean addFlag(String name) {
if (compatibleFlags.containsKey(name)) {
return flags.add(name);
} else {
return false;
}
}
/**
* Remove flags by applying a mask
*/
public boolean removeFlags(int hex) {
return flags.removeAll(hexFlagsToSet(hex));
}
/**
* Remove a list of flags based on its name
*/
public boolean removeFlags(Set<String> flags) {
return this.flags.removeAll(flags);
}
/**
* Remove a flag based on its name
*/
public boolean removeFlag(String name) {
return flags.remove(name);
}
// ------------------- utils -------------------
/**
* Decode an int as set
*/
private static Set<String> hexFlagsToSet(int hex) {
var foundFlags = new HashSet<String>();
for (var flag : compatibleFlags.entrySet()) {
// check if flag is present
if ((hex & flag.getValue()) != 0) {
foundFlags.add(flag.getKey());
}
}
return foundFlags;
}
/**
* Decode a set as hex
*/
private static int flagsSetToHex(Set<String> set) {
int hex = 0x00000000;
for (var flag : set) {
if (compatibleFlags.containsKey(flag)) {
hex = hex | compatibleFlags.get(flag);
}
}
return hex;
}
// ------------------- store/load flags -------------------
// this handles the store and load of the flags, if something wants to get the flags
// it should always use these methods.
private static final String DATA_FLAGS = "flagsEditor.flags";
private static final String REGEX = "(0x)?[a-fA-F\\d]{1,8}";
private static final int BASE = 16;
/**
* parses a text as an hexadecimal flags string.
* Returns null if invalid
*/
public static Integer toInteger(String text) {
if (text != null && text.matches(REGEX)) {
return Integer.parseInt(text.replaceAll("^0x", ""), BASE);
} else {
return null;
}
}
/**
* Converts an int flags to string
*/
public static String toHexString(int flags) {
return "0x" + Integer.toString(flags, BASE);
}
/**
* Retrieves the flags from GlobalData, if it is not defined it will return null
*/
public static Integer getGlobalFlagsNullable(AModuleDialog instance) {
return toInteger(instance.getData(DATA_FLAGS));
}
/**
* Loads the flags from GlobalData, if none were found it gets the flags from the intent that
* started this activity
*/
public static int getGlobalFlagsNonNull(AModuleDialog instance, Activity cntx) {
return getGlobalFlagsOrDefault(instance, cntx.getIntent().getFlags());
}
/**
* Loads the flags from GlobalData, if none were found it gets the flags from default
* Can be used by other modules
*/
public static int getGlobalFlagsOrDefault(AModuleDialog instance, int defaultFlags) {
return valueOrDefault(toInteger(instance.getData(DATA_FLAGS)), defaultFlags);
}
/**
* Stores the flags in GlobalData
*/
public static void setGlobalFlags(Flags flags, AModuleDialog instance) {
instance.putData(DATA_FLAGS, flags == null ? null : toHexString(flags.getFlagsAsInt()));
}
}

View File

@ -0,0 +1,84 @@
package com.trianguloy.urlchecker.modules.companions;
import android.content.Context;
import android.content.Intent;
import android.view.View;
import android.widget.ImageButton;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.GenericPref;
/**
* Manages the incognito feature
*/
public class Incognito {
/**
* preference
*/
public static GenericPref.Enumeration<OnOffConfig> PREF(Context cntx) {
return new GenericPref.Enumeration<>("open_incognito", OnOffConfig.AUTO, OnOffConfig.class, cntx);
}
private final GenericPref.Enumeration<OnOffConfig> pref;
private boolean state = false;
public Incognito(Context cntx) {
this.pref = PREF(cntx);
}
/**
* Initialization from a given intent and a button to toggle
*/
public void initFrom(Intent intent, ImageButton button) {
// init state
boolean visible;
switch (pref.get()) {
case AUTO:
default:
// for Firefox
state = intent.getBooleanExtra("private_browsing_mode", false);
visible = true;
break;
case DEFAULT_ON:
state = true;
visible = true;
break;
case DEFAULT_OFF:
state = false;
visible = true;
break;
case ALWAYS_ON:
state = true;
visible = false;
break;
case ALWAYS_OFF:
state = false;
visible = false;
break;
}
// init button
if (visible) {
// show and configure
button.setVisibility(View.VISIBLE);
AndroidUtils.longTapForDescription(button);
AndroidUtils.toggleableListener(button,
imageButton -> state = !state,
v -> v.setImageResource(state ? R.drawable.incognito : R.drawable.no_incognito)
);
} else {
// hide
button.setVisibility(View.GONE);
}
}
/**
* applies the setting to a given intent
*/
public void apply(Intent intent) {
// for Firefox
intent.putExtra("private_browsing_mode", state);
}
}

View File

@ -0,0 +1,36 @@
package com.trianguloy.urlchecker.modules.companions;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.Enums;
/**
* Enum for a toggle with on/off x default/always and auto states
*/
public enum OnOffConfig implements Enums.IdEnum, Enums.StringEnum {
AUTO(0, R.string.auto),
DEFAULT_ON(1, R.string.defaultOn),
DEFAULT_OFF(2, R.string.defaultOff),
ALWAYS_ON(3, R.string.alwaysOn),
ALWAYS_OFF(4, R.string.alwaysOff),
;
// -----
private final int id;
private final int stringResource;
OnOffConfig(int id, int stringResource) {
this.id = id;
this.stringResource = stringResource;
}
@Override
public int getId() {
return id;
}
@Override
public int getStringResource() {
return stringResource;
}
}

View File

@ -1,14 +1,16 @@
package com.trianguloy.urlchecker.modules.list;
import static com.trianguloy.urlchecker.utilities.JavaUtils.valueOrDefault;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.text.Editable;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@ -18,15 +20,27 @@ import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.AModuleConfig;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.modules.companions.Flags;
import com.trianguloy.urlchecker.url.UrlData;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.DefaultTextWatcher;
import com.trianguloy.urlchecker.utilities.Enums;
import com.trianguloy.urlchecker.utilities.GenericPref;
import com.trianguloy.urlchecker.utilities.Inflater;
import com.trianguloy.urlchecker.utilities.InternalFile;
import com.trianguloy.urlchecker.utilities.JavaUtils;
import com.trianguloy.urlchecker.views.CycleImageButton;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.Set;
import java.util.TreeSet;
/**
* This module allows flag edition
@ -37,6 +51,8 @@ public class FlagsModule extends AModuleData {
return new GenericPref.Str("flagsEditor_defaultFlags", null, cntx);
}
public static final String DEFAULT_GROUP = "default";
@Override
public String getId() {
return "flagsEditor";
@ -65,279 +81,398 @@ public class FlagsModule extends AModuleData {
class FlagsDialog extends AModuleDialog {
public static final String DATA_FLAGS = "flagsEditor.flags";
private final Flags defaultFlags;
private final Flags currentFlags;
// https://github.com/MuntashirAkon/AppManager/blob/19782da4c8556c817ba5795554a1cc21f38af13a/app/src/main/java/io/github/muntashirakon/AppManager/intercept/ActivityInterceptor.java#L92
private static final List<String> ALL_FLAGS = List.of(
"FLAG_GRANT_READ_URI_PERMISSION",
"FLAG_GRANT_WRITE_URI_PERMISSION",
"FLAG_FROM_BACKGROUND",
"FLAG_DEBUG_LOG_RESOLUTION",
"FLAG_EXCLUDE_STOPPED_PACKAGES",
"FLAG_INCLUDE_STOPPED_PACKAGES",
"FLAG_GRANT_PERSISTABLE_URI_PERMISSION",
"FLAG_GRANT_PREFIX_URI_PERMISSION",
"FLAG_DIRECT_BOOT_AUTO",
"FLAG_IGNORE_EPHEMERAL",
"FLAG_ACTIVITY_NO_HISTORY",
"FLAG_ACTIVITY_SINGLE_TOP",
"FLAG_ACTIVITY_NEW_TASK",
"FLAG_ACTIVITY_MULTIPLE_TASK",
"FLAG_ACTIVITY_CLEAR_TOP",
"FLAG_ACTIVITY_FORWARD_RESULT",
"FLAG_ACTIVITY_PREVIOUS_IS_TOP",
"FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS",
"FLAG_ACTIVITY_BROUGHT_TO_FRONT",
"FLAG_ACTIVITY_RESET_TASK_IF_NEEDED",
"FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY",
"FLAG_ACTIVITY_NEW_DOCUMENT",
"FLAG_ACTIVITY_NO_USER_ACTION",
"FLAG_ACTIVITY_REORDER_TO_FRONT",
"FLAG_ACTIVITY_NO_ANIMATION",
"FLAG_ACTIVITY_CLEAR_TASK",
"FLAG_ACTIVITY_TASK_ON_HOME",
"FLAG_ACTIVITY_RETAIN_IN_RECENTS",
"FLAG_ACTIVITY_LAUNCH_ADJACENT",
"FLAG_ACTIVITY_MATCH_EXTERNAL",
"FLAG_ACTIVITY_REQUIRE_NON_BROWSER",
"FLAG_ACTIVITY_REQUIRE_DEFAULT"
);
private final Map<String, Integer> flagMap = new TreeMap<>(); // TreeMap to have the entries sorted by key
private Map<String, FlagsConfig.FlagState> flagsStatePref;
private final GenericPref.Str defaultFlagsPref;
private ViewGroup shownFlagsVG;
private EditText searchInput;
private ViewGroup hiddenFlagsVG;
private ImageView overflowButton;
private EditText flagsHexText;
private AutoCompleteTextView flagNameText;
private ImageButton more;
private LinearLayout box;
private JSONObject groups;
public FlagsDialog(MainDialog dialog) {
super(dialog);
defaultFlagsPref = FlagsModule.DEFAULTFLAGS_PREF(dialog);
try {
// Only get flags that are present in the current Android version
for (var field : Intent.class.getFields()) {
if (ALL_FLAGS.contains(field.getName())) {
flagMap.put(field.getName(), (Integer) field.get(null));
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
defaultFlags = new Flags(getActivity().getIntent().getFlags());
currentFlags = new Flags();
}
@Override
public int getLayoutId() {
return R.layout.dialog_editflags;
return R.layout.dialog_flags;
}
@Override
public void onInitialize(View views) {
box = views.findViewById(R.id.box);
flagsHexText = views.findViewById(R.id.flagsHexText);
initGroups();
// set the flags to the adapter of the input text
flagNameText = views.findViewById(R.id.flagText);
flagNameText.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_spinner_dropdown_item, new ArrayList<>(
flagMap.keySet()
)));
// so the dropdown gets the maximum width possible
flagNameText.setDropDownAnchor(R.id.addFlagLayout);
// FIXME better search, currently it is an autofill, not a search
// FIXME sometimes its hidden behind keyboard
shownFlagsVG = views.findViewById(R.id.shownFlags);
searchInput = views.findViewById(R.id.search);
hiddenFlagsVG = views.findViewById(R.id.hiddenFlags);
// get initial flags
var defaultFlagsStr = defaultFlagsPref.get();
if (defaultFlagsStr != null) {
setFlags(toInteger(defaultFlagsStr));
}
// Button to open the `box` with the hidden flags (more indicator)
overflowButton = views.findViewById(R.id.overflowButton);
// press add to add a flag
views.<Button>findViewById(R.id.add).setOnClickListener(v -> {
var flag = flagMap.get(flagNameText.getText().toString());
if (flag != null) {
setFlags(getFlagsNonNull() | flag);
} else {
Toast.makeText(getActivity(), R.string.mFlags_invalid, Toast.LENGTH_LONG).show();
}
// Update views
updateLayout();
});
// press 'more' to expand/collapse the box
more = views.findViewById(R.id.more);
more.setOnClickListener(v -> {
box.setVisibility(box.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
// Update views
updateLayout();
});
box.setVisibility(View.GONE); // start collapsed
// press edit to start editing, press again to save
var edit = views.<Button>findViewById(R.id.edit);
edit.setOnClickListener(v -> {
if (flagsHexText.isEnabled()) {
// requested to save
var flags = toInteger(flagsHexText.getText().toString());
if (flags != null) {
// Extract flags
setFlags(flags);
}
}
flagsHexText.setEnabled(!flagsHexText.isEnabled());
// Update views
updateLayout();
});
// long press to reset
edit.setOnLongClickListener(v -> {
// Resets the flags
setFlags(null);
// Update views
updateLayout();
return true;
});
}
@Override
public void onDisplayUrl(UrlData urlData) {
updateLayout();
}
private void updateLayout() {
// set text
var flags = getFlagsNonNull();
flagsHexText.setText(toHexString(flags));
// set current flags list
var decodedFlags = decodeFlags(flags);
box.removeAllViews();
if (decodedFlags.size() == 0) {
// no flags, disable
AndroidUtils.setEnabled(more, false);
more.setImageResource(R.drawable.arrow_right);
} else {
// flags, enable
AndroidUtils.setEnabled(more, true);
more.setImageResource(box.getVisibility() == View.VISIBLE ? R.drawable.arrow_down : R.drawable.arrow_right);
// For each flag, create a button+text
for (var flag : decodedFlags) {
var button_text = Inflater.inflate(R.layout.button_text, box, getActivity());
// Button that removes the flag
var button = button_text.<Button>findViewById(R.id.button);
button.setText(R.string.remove);
// Apply mask to remove flag
button.setOnClickListener(v -> {
setFlags(getFlagsNonNull() & ~flagMap.get(flag));
// Update views
updateLayout();
// Hide hidden flags
hiddenFlagsVG.setVisibility(View.GONE);
AndroidUtils.toggleableListener(overflowButton,
v -> hiddenFlagsVG.setVisibility(hiddenFlagsVG.getVisibility() == View.GONE ? View.VISIBLE : View.GONE),
v -> {
searchInput.setVisibility(hiddenFlagsVG.getVisibility());
updateMoreIndicator();
});
var text = button_text.<TextView>findViewById(R.id.text);
text.setText(flag);
// SEARCH
// Set up search text
searchInput.addTextChangedListener(new DefaultTextWatcher() {
@Override
public void afterTextChanged(Editable text) {
for (int i = 0; i < hiddenFlagsVG.getChildCount(); i++) {
var checkbox_text = hiddenFlagsVG.getChildAt(i);
String flag = ((TextView) checkbox_text.findViewById(R.id.text)).getText().toString();
String search = text.toString();
// Set visibility based on search text
checkbox_text.setVisibility(JavaUtils.containsWords(flag, search) ? View.VISIBLE : View.GONE);
}
}
});
// TODO spinner with groups
loadGroup(FlagsModule.DEFAULT_GROUP);
}
private void initGroups() {
String fileString = new InternalFile(FlagsConfig.CONF_FILE, getActivity()).get();
groups = new JSONObject();
if (fileString != null) {
try {
groups = new JSONObject(fileString).getJSONObject("groups");
} catch (JSONException ignore) {
}
}
}
// ------------------- utils -------------------
/**
* Decode an int as flags
*/
private List<String> decodeFlags(int hex) {
var foundFlags = new ArrayList<String>();
for (var flag : flagMap.entrySet()) {
// check if flag is present
if ((hex & flag.getValue()) != 0) {
foundFlags.add(flag.getKey());
// To get all the groups names
private List<String> getGroups() {
List<String> res = new ArrayList<>();
// Always add FlagsModule.DEFAULT_GROUP first, even if it doesn't exist
res.add(FlagsModule.DEFAULT_GROUP);
for (Iterator<String> it = groups.keys(); it.hasNext(); ) {
String group = it.next();
if (!group.equals(FlagsModule.DEFAULT_GROUP)) {
res.add(group);
}
}
return foundFlags;
return res;
}
// ------------------- store/load flags -------------------
// this handles the store and load of the flags, if something wants to get the flags
// it should always use these methods.
void loadGroup(String group) {
currentFlags.setFlags(0);
private static final int BASE = 16;
protected static final String REGEX = "(0x)?[a-fA-F\\d]{1,8}";
// Load json
JSONObject groupPref = null;
try {
groupPref = groups.getJSONObject(group);
} catch (JSONException ignore) {
}
/**
* parses a text as an hexadecimal flags string.
* Returns null if invalid
*/
public static Integer toInteger(String text) {
if (text != null && text.matches(REGEX)) {
return Integer.parseInt(text.replaceAll("^0x", ""), BASE);
// Put shown flags
Set<String> shownFlagsSet = new TreeSet<>();
// Get state preference of flag from json and then store it in a map
flagsStatePref = new HashMap<>();
if (groupPref != null) {
for (Iterator<String> it = groupPref.keys(); it.hasNext(); ) {
String flag = it.next();
try {
flagsStatePref.put(flag, Enums.toEnum(FlagsConfig.FlagState.class,
groupPref.getJSONObject(flag).getInt("state")));
if (groupPref.getJSONObject(flag).getBoolean("show")) {
shownFlagsSet.add(flag);
}
} catch (JSONException ignored) {
}
}
}
// If it is not in shownFlags it must be in hiddenFlags
Set<String> hiddenFlagsSet = new TreeSet<>(Flags.getCompatibleFlags().keySet());
hiddenFlagsSet.removeAll(shownFlagsSet);
// Fill boxes with flags, load flags into currentFlags too
fillWithFlags(shownFlagsSet, shownFlagsVG);
fillWithFlags(hiddenFlagsSet, hiddenFlagsVG);
// Update global
Flags.setGlobalFlags(currentFlags, this);
updateMoreIndicator();
}
void updateMoreIndicator() {
if (hiddenFlagsVG.getChildCount() == 0) {
overflowButton.setImageDrawable(null);
} else {
return null;
overflowButton.setImageResource(hiddenFlagsVG.getVisibility() == View.VISIBLE ? R.drawable.arrow_down : R.drawable.arrow_right);
}
}
/**
* Converts an int flags to string
* Sets up a ViewGroup with the flags received. The state of the flag is read from flagsStatePref.
* The default state of the flag is read from defaultFlags. Also sets currentFlags.
*
* @param flags flags to add
* @param vg ViewGroup to fill with flags
*/
public static String toHexString(int flags) {
return "0x" + Integer.toString(flags, BASE);
private void fillWithFlags(Set<String> flags, ViewGroup vg) {
vg.removeAllViews();
for (String flag : flags) {
var checkbox_text = Inflater.inflate(R.layout.dialog_flags_entry, vg);
// Checkbox
var checkBox = checkbox_text.<ImageView>findViewById(R.id.state);
boolean bool;
switch (valueOrDefault(flagsStatePref.get(flag), FlagsConfig.FlagState.AUTO)) {
case ON:
bool = true;
break;
case OFF:
bool = false;
break;
case AUTO:
default:
bool = defaultFlags.isSet(flag);
}
currentFlags.setFlag(flag, bool);
checkBox.setTag(R.id.text, flag);
AndroidUtils.toggleableListener(checkBox,
v -> {
currentFlags.setFlag(flag, !currentFlags.isSet(flag));
// Update global
Flags.setGlobalFlags(currentFlags, this);
// To update debug module view of GlobalData
setUrl(new UrlData(getUrl()).dontTriggerOwn().asMinorUpdate());
},
v -> checkBox.setImageResource(currentFlags.isSet(flag) ? R.drawable.flag_on : R.drawable.flag_off)
);
// Text
((TextView) checkbox_text.findViewById(R.id.text)).setText(flag);
// Color indicators
var defaultIndicator = checkbox_text.findViewById(R.id.defaultIndicator);
var preferenceIndicator = checkbox_text.findViewById(R.id.preferenceIndicator);
checkBox.setTag(R.id.defaultIndicator, defaultIndicator);
checkBox.setTag(R.id.preferenceIndicator, preferenceIndicator);
setColors(flag, defaultIndicator, preferenceIndicator);
}
}
/**
* Retrieves the flags from GlobalData, if it is not defined it will return null
* Intended for use in other modules
*/
public static Integer getFlagsNullable(AModuleDialog instance) {
return toInteger(instance.getData(DATA_FLAGS));
}
void setColors(String flag, View defaultIndicator, View preferenceIndicator) {
AndroidUtils.setRoundedColor(defaultFlags.isSet(flag) ? R.color.good : R.color.bad, defaultIndicator);
/**
* Loads the flags from GlobalData, if none were found it gets the flags from the intent that
* started this activity
*/
private int getFlagsNonNull() {
return getFlagsOrDefault(this, getActivity().getIntent().getFlags());
}
int color;
switch (valueOrDefault(flagsStatePref.get(flag), FlagsConfig.FlagState.AUTO)) {
case ON:
color = R.color.good;
break;
case OFF:
color = R.color.bad;
break;
case AUTO:
default:
color = R.color.grey;
}
/**
* Loads the flags from GlobalData, if none were found it gets the flags from default
* Can be used by other modules
*/
public static int getFlagsOrDefault(AModuleDialog instance, int defaultFlags) {
var flags = toInteger(instance.getData(DATA_FLAGS));
return flags == null ? defaultFlags : flags;
}
/**
* Stores the flags in GlobalData
*/
private void setFlags(Integer flags) {
putData(DATA_FLAGS, flags == null ? null : toHexString(flags));
AndroidUtils.setRoundedColor(color, preferenceIndicator);
}
}
class FlagsConfig extends AModuleConfig {
private final GenericPref.Str defaultFlagsPref;
protected static final String CONF_FILE = "flags_editor_settings";
public FlagsConfig(ModulesActivity activity) {
super(activity);
defaultFlagsPref = FlagsModule.DEFAULTFLAGS_PREF(activity);
}
@Override
public int getLayoutId() {
return R.layout.config_flagseditor;
return R.layout.config_flags;
}
@Override
public void onInitialize(View views) {
defaultFlagsPref.attachToEditText(
views.findViewById(R.id.flags),
str -> str,
str -> str.matches(FlagsDialog.REGEX) ? str : defaultFlagsPref.defaultValue
);
views.findViewById(R.id.button).setOnClickListener(showDialog -> {
View flagsDialogLayout = getActivity().getLayoutInflater().inflate(R.layout.flags_editor, null);
ViewGroup box = flagsDialogLayout.findViewById(R.id.box);
InternalFile file = new InternalFile(CONF_FILE, getActivity());
// Get all flags
fillBoxViewGroup(box, file, FlagsModule.DEFAULT_GROUP);
AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
.setView(flagsDialogLayout)
.setPositiveButton(views.getContext().getText(R.string.save), (dialog, which) -> {
// Save the settings
storePreferences(box, file, FlagsModule.DEFAULT_GROUP);
})
.setNegativeButton(views.getContext().getText(android.R.string.cancel), null)
.setNeutralButton(views.getContext().getText(R.string.reset), null)
.show();
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(listener -> {
// Reset current group flags (does not save)
resetFlags(box);
});
// Search
((EditText) flagsDialogLayout.findViewById(R.id.search)).addTextChangedListener(new DefaultTextWatcher() {
@Override
public void afterTextChanged(Editable text) {
for (int i = 0; i < box.getChildCount(); i++) {
var entryView = box.getChildAt(i);
String flag = ((TextView) entryView.findViewById(R.id.text)).getText().toString();
String search = text.toString();
// Set visibility based on search text
entryView.setVisibility(JavaUtils.containsWords(flag, search) ? View.VISIBLE : View.GONE);
}
}
});
// TODO add dialog button to set all to on/off/auto
});
}
private void fillBoxViewGroup(ViewGroup vg, InternalFile file, String group) {
String prefString = file.get();
JSONObject oldPref = null; // Null if there is no file or fails to parse
try {
oldPref = prefString == null ? null : new JSONObject(file.get()).getJSONObject("groups").getJSONObject(group);
} catch (JSONException ignored) {
}
// Fill the box
for (String flag : Flags.getCompatibleFlags().keySet()) {
var entryView = Inflater.inflate(R.layout.flags_editor_entry, vg);
TextView textView = entryView.findViewById(R.id.text);
textView.setText(flag);
var flagState = entryView.<CycleImageButton<FlagState>>findViewById(R.id.state);
flagState.setStates(List.of(FlagState.values()));
// Load preferences from settings
Boolean showValue = null;
Integer stateValue = null;
// Get current preferences
if (oldPref != null) {
JSONObject flagPref;
try {
flagPref = oldPref.getJSONObject(flag);
showValue = flagPref.getBoolean("show");
stateValue = flagPref.getInt("state");
} catch (JSONException ignored) {
}
}
flagState.setCurrentState(Enums.toEnum(FlagState.class, valueOrDefault(stateValue, FlagState.AUTO.id)));
var show = entryView.<ImageButton>findViewById(R.id.show);
show.setTag(valueOrDefault(showValue, false));
AndroidUtils.toggleableListener(show,
v -> v.setTag(v.getTag() == Boolean.FALSE),
v -> v.setImageResource(v.getTag() == Boolean.TRUE ? R.drawable.show : R.drawable.hide)
);
}
}
private void storePreferences(ViewGroup vg, InternalFile file, String group) {
// Retrieve previous config, to keep other groups
JSONObject oldSettings = null;
String content = file.get();
// It's ok if there is no file yet
if (content != null) {
try {
oldSettings = new JSONObject(content);
} catch (JSONException ignore) {
// If the json fails to parse then we will create a new file
}
}
try {
// Collect all the settings of the vg
JSONObject newSettings = new JSONObject();
for (int i = 0; i < vg.getChildCount(); i++) {
View v = vg.getChildAt(i);
FlagState state = v.<CycleImageButton<FlagState>>findViewById(R.id.state).getCurrentState();
boolean show = v.findViewById(R.id.show).getTag() == Boolean.TRUE;
newSettings.put(((TextView) v.findViewById(R.id.text)).getText().toString(),
new JSONObject()
.put("state", state.getId())
.put("show", show));
}
// If there are no old settings, create a new one
// Replace the old settings from group with the new ones
newSettings = oldSettings == null ?
new JSONObject().put("groups", new JSONObject().put(group, newSettings)) :
oldSettings.put("groups", oldSettings.getJSONObject("groups").put(group, newSettings));
// TODO should groups be sorted?
file.set(newSettings.toString());
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(getActivity(), R.string.toast_invalid, Toast.LENGTH_SHORT).show();
}
}
private void resetFlags(ViewGroup vg) {
// Set everything to default values
for (int i = 0; i < vg.getChildCount(); i++) {
View v = vg.getChildAt(i);
v.<CycleImageButton<FlagState>>findViewById(R.id.state).setCurrentState(FlagState.AUTO);
var visible = v.<ImageButton>findViewById(R.id.show);
visible.setImageResource(R.drawable.hide);
visible.setTag(Boolean.FALSE);
}
}
public enum FlagState implements Enums.IdEnum, Enums.ImageEnum {
AUTO(0, R.drawable.flag_auto),
ON(1, R.drawable.flag_on),
OFF(2, R.drawable.flag_off),
;
// -----
private final int id;
private final int imageResource;
FlagState(int id, int imageResource) {
this.id = id;
this.imageResource = imageResource;
}
@Override
public int getId() {
return id;
}
@Override
public int getImageResource() {
return imageResource;
}
}
}

View File

@ -4,6 +4,7 @@ import android.app.AlertDialog;
import android.content.Context;
import android.text.util.Linkify;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
@ -138,6 +139,8 @@ class LogConfig extends AModuleConfig {
// show
AlertDialog dialog = builder.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
// prepare more dialog
// these are configured here to disable automatic auto-closing when they are pressed
if (editable) {

View File

@ -3,7 +3,6 @@ package com.trianguloy.urlchecker.modules.list;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
@ -17,7 +16,10 @@ import com.trianguloy.urlchecker.modules.AModuleConfig;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.modules.companions.CTabs;
import com.trianguloy.urlchecker.modules.companions.Flags;
import com.trianguloy.urlchecker.modules.companions.Incognito;
import com.trianguloy.urlchecker.modules.companions.LastOpened;
import com.trianguloy.urlchecker.modules.companions.OnOffConfig;
import com.trianguloy.urlchecker.url.UrlData;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.GenericPref;
@ -71,9 +73,8 @@ class OpenDialog extends AModuleDialog {
private final GenericPref.Bool closeOpenPref;
private final GenericPref.Bool closeSharePref;
private final GenericPref.Bool noReferrerPref;
private final GenericPref.Enumeration<CTabs.Config> ctabsPref;
private boolean ctabs = false;
private final CTabs cTabs;
private final Incognito incognito;
private List<String> packages;
private Button btn_open;
@ -81,11 +82,11 @@ class OpenDialog extends AModuleDialog {
private View openParent;
private Menu menu;
private PopupMenu popup;
private ImageButton btn_ctabs;
public OpenDialog(MainDialog dialog) {
super(dialog);
ctabsPref = CTabs.PREF(dialog);
cTabs = new CTabs(dialog);
incognito = new Incognito(dialog);
closeOpenPref = OpenModule.CLOSEOPEN_PREF(dialog);
closeSharePref = OpenModule.CLOSESHARE_PREF(dialog);
noReferrerPref = OpenModule.NOREFERRER_PREF(dialog);
@ -100,38 +101,11 @@ class OpenDialog extends AModuleDialog {
public void onInitialize(View views) {
Intent intent = getActivity().getIntent();
// init ctabs
btn_ctabs = views.findViewById(R.id.ctabs);
if (CTabs.isAvailable()) {
btn_ctabs.setOnClickListener(v -> toggleCtabs());
AndroidUtils.longTapForDescription(btn_ctabs);
switch (ctabsPref.get()) {
case AUTO:
default:
// If auto we get it from the intent
setCtabs(intent.hasExtra(CTabs.EXTRA));
break;
case ON:
setCtabs(true);
break;
case OFF:
setCtabs(false);
break;
case ENABLED:
// enable but hide
setCtabs(true);
btn_ctabs.setVisibility(View.GONE);
break;
case DISABLED:
// disable but hide
setCtabs(false);
btn_ctabs.setVisibility(View.GONE);
break;
}
} else {
// not available, just ignore
btn_ctabs.setVisibility(View.GONE);
}
// ctabs
cTabs.initFrom(intent, views.findViewById(R.id.ctabs));
// incognito
incognito.initFrom(intent, views.findViewById(R.id.mode_incognito));
// init open
openParent = views.findViewById(R.id.open_parent);
@ -239,23 +213,14 @@ class OpenDialog extends AModuleDialog {
intent = UrlUtils.getViewIntent(getUrl(), chosen);
}
if (ctabs && !intent.hasExtra(CTabs.EXTRA)) {
// enable Custom tabs
// ctabs
cTabs.apply(intent);
if (CTabs.isAvailable()) {
Bundle extras = new Bundle();
extras.putBinder(CTabs.EXTRA, null); // Set to null for no session
intent.putExtras(extras);
}
}
if (!ctabs && intent.hasExtra(CTabs.EXTRA)) {
// disable ctabs
intent.removeExtra(CTabs.EXTRA);
}
// incognito
incognito.apply(intent);
// Get flags from global data (probably set by flags module, if active)
Integer flags = FlagsDialog.getFlagsNullable(this);
Integer flags = Flags.getGlobalFlagsNullable(this);
if (flags != null) {
intent.setFlags(flags);
}
@ -295,21 +260,6 @@ class OpenDialog extends AModuleDialog {
}
}
/**
* Toggle the custom tabs state
*/
private void toggleCtabs() {
setCtabs(!ctabs);
}
/**
* Sets the custom tabs state
*/
private void setCtabs(boolean state) {
btn_ctabs.setImageResource(state ? R.drawable.ctabs_on : R.drawable.ctabs_off);
ctabs = state;
}
}
class OpenConfig extends AModuleConfig {
@ -317,13 +267,15 @@ class OpenConfig extends AModuleConfig {
private final GenericPref.Bool closeOpenPref;
private final GenericPref.Bool closeSharePref;
private final GenericPref.Bool noReferrerPref;
private final GenericPref.Enumeration<CTabs.Config> ctabsPref;
private final GenericPref.Enumeration<OnOffConfig> ctabsPref;
private final GenericPref.Enumeration<OnOffConfig> incognitoPref;
private final GenericPref.Bool perDomainPref;
public OpenConfig(ModulesActivity activity) {
super(activity);
ctabsPref = CTabs.PREF(activity);
incognitoPref = Incognito.PREF(activity);
closeOpenPref = OpenModule.CLOSEOPEN_PREF(activity);
closeSharePref = OpenModule.CLOSESHARE_PREF(activity);
noReferrerPref = OpenModule.NOREFERRER_PREF(activity);
@ -343,6 +295,7 @@ class OpenConfig extends AModuleConfig {
} else {
views.findViewById(R.id.ctabs_parent).setVisibility(View.GONE);
}
incognitoPref.attachToSpinner(views.findViewById(R.id.incognito_pref), null);
closeOpenPref.attachToSwitch(views.findViewById(R.id.closeopen_pref));
closeSharePref.attachToSwitch(views.findViewById(R.id.closeshare_pref));
noReferrerPref.attachToSwitch(views.findViewById(R.id.noReferrer));

View File

@ -193,7 +193,7 @@ class PatternDialog extends AModuleDialog {
for (Message message : messages) {
// either matches and/or applied is true
View row = Inflater.inflate(R.layout.button_text, box, getActivity());
View row = Inflater.inflate(R.layout.button_text, box);
// text
TextView text = row.findViewById(R.id.text);

View File

@ -37,6 +37,11 @@ public class RemoveQueriesModule extends AModuleData {
return R.string.mRemove_name;
}
@Override
public boolean isEnabledByDefault() {
return false;
}
@Override
public AModuleDialog getDialog(MainDialog cntx) {
return new RemoveQueriesDialog(cntx);
@ -105,7 +110,7 @@ class RemoveQueriesDialog extends AModuleDialog {
// for each query, create a button
for (int i = 0; i < parts.queriesSize(); i++) {
var button_text = Inflater.inflate(R.layout.button_text, box, getActivity());
var button_text = Inflater.inflate(R.layout.button_text, box);
// button that removes the query
var queryName = parts.getQueryName(i);

View File

@ -25,7 +25,7 @@ import java.net.URL;
import java.net.URLDecoder;
/**
* A module that checks the page status code by performing a HEAD petition
* A module that checks the page status code by performing a GET petition
* Allows checking for redirection
*/
public class StatusModule extends AModuleData {
@ -181,9 +181,8 @@ class StatusDialog extends AModuleDialog {
HttpURLConnection conn = null;
try {
// perform HEAD to the url
// perform GET to the url
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestMethod("HEAD");
conn.setInstanceFollowRedirects(false); // Make the logic below easier to detect redirections
conn.setConnectTimeout(StreamUtils.CONNECT_TIMEOUT);
var responseCode = conn.getResponseCode();

View File

@ -1,7 +1,6 @@
package com.trianguloy.urlchecker.modules.list;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
@ -13,6 +12,7 @@ import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.modules.DescriptionConfig;
import com.trianguloy.urlchecker.url.UrlData;
import com.trianguloy.urlchecker.utilities.DefaultTextWatcher;
import com.trianguloy.urlchecker.utilities.DoubleEvent;
/**
@ -41,9 +41,10 @@ public class TextInputModule extends AModuleData {
}
}
class TextInputDialog extends AModuleDialog implements TextWatcher {
class TextInputDialog extends AModuleDialog {
private final DoubleEvent doubleEdit = new DoubleEvent(1000); // if two updates happens in less than this milliseconds, they are considered as the same
private boolean skipUpdate = false;
private EditText edtxt_url;
@ -59,39 +60,31 @@ class TextInputDialog extends AModuleDialog implements TextWatcher {
@Override
public void onInitialize(View views) {
edtxt_url = views.findViewById(R.id.url);
edtxt_url.addTextChangedListener(this);
edtxt_url.addTextChangedListener(new DefaultTextWatcher() {
@Override
public void afterTextChanged(Editable s) {
if (skipUpdate) return;
// new url by the user
var newUrlData = new UrlData(s.toString())
.dontTriggerOwn()
.disableUpdates();
// mark as minor if too quick
if (doubleEdit.checkAndTrigger()) newUrlData.asMinorUpdate();
// set
setUrl(newUrlData);
}
});
}
@Override
public void onDisplayUrl(UrlData urlData) {
// setText fires the afterTextChanged listener, so we need to remove it
edtxt_url.removeTextChangedListener(this);
// setText fires the afterTextChanged listener, so we need to skip it
skipUpdate = true;
edtxt_url.setText(urlData.url);
edtxt_url.addTextChangedListener(this);
skipUpdate = false;
doubleEdit.reset(); // next user update, even if immediately after, will be considered new
}
// ------------------- TextWatcher -------------------
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
// new url by the user
var newUrlData = new UrlData(s.toString())
.dontTriggerOwn()
.disableUpdates();
// mark as minor if too quick
if (doubleEdit.checkAndTrigger()) newUrlData.asMinorUpdate();
// set
setUrl(newUrlData);
}
}

View File

@ -110,7 +110,7 @@ class UnshortenDialog extends AModuleDialog {
// get response
var response = new JSONObject(StreamUtils.readFromUrl("https://unshorten.me/json/" + getUrl()));
var resolved_url = response.getString("resolved_url");
var usage_count = Integer.parseInt(response.getString("usage_count"));
var usage_count = Integer.parseInt(response.optString("usage_count", "0"));
var ref = new Object() { // reference object to allow using these inside lambdas
int usage_limit = 10; // documented but hardcoded
int remaining_calls = usage_limit - usage_count;
@ -143,7 +143,10 @@ class UnshortenDialog extends AModuleDialog {
} else if (Objects.equals(resolved_url, getUrl())) {
// same, nothing to replace
getActivity().runOnUiThread(() -> {
info.setText(getActivity().getString(R.string.mUnshort_notFound, ref.remaining_calls, ref.usage_limit));
var pending = ref.remaining_calls <= ref.usage_limit / 2
? " (" + getActivity().getString(R.string.mUnshort_pending, ref.remaining_calls, ref.usage_limit) + ")"
: "";
info.setText(getActivity().getString(R.string.mUnshort_notFound) + pending);
AndroidUtils.clearRoundedColor(info);
});
} else {
@ -151,7 +154,10 @@ class UnshortenDialog extends AModuleDialog {
getActivity().runOnUiThread(() -> {
setUrl(new UrlData(resolved_url).dontTriggerOwn());
info.setText(getActivity().getString(R.string.mUnshort_ok, ref.remaining_calls, ref.usage_limit));
var pending = ref.remaining_calls <= ref.usage_limit / 2
? " (" + getActivity().getString(R.string.mUnshort_pending, ref.remaining_calls, ref.usage_limit) + ")"
: "";
info.setText(getActivity().getString(R.string.mUnshort_ok) + pending);
AndroidUtils.setRoundedColor(R.color.good, info);
// a short url can redirect to another short url
unshort.setEnabled(true);

View File

@ -0,0 +1,199 @@
package com.trianguloy.urlchecker.modules.list;
import android.net.Uri;
import android.util.Pair;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.activities.ModulesActivity;
import com.trianguloy.urlchecker.dialogs.MainDialog;
import com.trianguloy.urlchecker.modules.AModuleConfig;
import com.trianguloy.urlchecker.modules.AModuleData;
import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.modules.DescriptionConfig;
import com.trianguloy.urlchecker.url.UrlData;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.Inflater;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* This module shows all parts of the url decoded
*/
public class UriPartsModule extends AModuleData {
@Override
public String getId() {
return "uriparts";
}
@Override
public int getName() {
return R.string.mParts_name;
}
@Override
public AModuleDialog getDialog(MainDialog cntx) {
return new UriPartsDialog(cntx);
}
@Override
public AModuleConfig getConfig(ModulesActivity cntx) {
return new DescriptionConfig(R.string.mParts_desc);
}
}
class UriPartsDialog extends AModuleDialog {
private LinearLayout box;
public UriPartsDialog(MainDialog dialog) {
super(dialog);
}
@Override
public int getLayoutId() {
return R.layout.dialog_parts;
}
@Override
public void onInitialize(View views) {
box = views.findViewById(R.id.box);
}
@Override
public void onDisplayUrl(UrlData urlData) {
// clear
box.removeAllViews();
// parse
var uri = Uri.parse(urlData.url);
// domain elements
if (uri.getAuthority() != null || uri.getScheme() != null) {
var domain = addGroup("Domain", null);
addPart("scheme", uri.getScheme(), domain, null);
addPart("user info", uri.getUserInfo(), domain, null);
addPart("host", uri.getHost(), domain, null);
addPart("port", uri.getPort() != -1 ? String.valueOf(uri.getPort()) : null, domain, null);
}
// paths
var pathSegments = uri.getPathSegments();
if (pathSegments.size() > 0) {
var paths = addGroup("Paths (" + pathSegments.size() + ")", uri.buildUpon().path(null));
for (var i = 0; i < pathSegments.size(); i++) {
var pathSegment = pathSegments.get(i);
var builder = uri.buildUpon();
builder.path(null);
for (int newI = 0; newI < pathSegments.size(); newI++) {
if (newI != i) builder.appendPath(pathSegments.get(newI));
}
addPart("/", pathSegment, paths, builder);
}
}
// queries
var queryParts = getQueryParts(uri);
if (queryParts.size() > 0) {
var queries = addGroup("Queries (" + queryParts.size() + ")", uri.buildUpon().query(null));
for (var queryPart : queryParts) {
var builder = uri.buildUpon();
builder.query(null);
for (var newQuerypart : queryParts) {
if (!Objects.equals(newQuerypart, queryPart))
builder.appendQueryParameter(newQuerypart.first, newQuerypart.second);
}
addPart(queryPart.first, queryPart.second, queries, builder);
}
}
// fragment
if (uri.getFragment() != null) {
var fragment = addGroup("Fragment", uri.buildUpon().fragment(null));
addPart("#", uri.getFragment(), fragment, null);
}
setVisibility(box.getChildCount() > 0);
}
/**
* Adds a collapsible group, removes it
*/
private LinearLayout addGroup(String name, Uri.Builder onDelete) {
var title = Inflater.inflate(R.layout.uri_part, box);
title.findViewById(R.id.key).setVisibility(View.GONE);
var name_view = title.<TextView>findViewById(R.id.value);
name_view.setText(name);
AndroidUtils.setAsClickable(name_view);
var delete_view = title.<Button>findViewById(R.id.delete);
if (onDelete == null) delete_view.setVisibility(View.GONE);
else delete_view.setOnClickListener(v -> setUrl(onDelete.build().toString()));
var group = Inflater.<LinearLayout>inflate(R.layout.dialog_parts, box);
group.setVisibility(View.GONE);
AndroidUtils.toggleableListener(
title,
v -> group.setVisibility(group.getVisibility() == View.GONE ? View.VISIBLE : View.GONE),
v -> AndroidUtils.setStartDrawables(name_view,
group.getVisibility() != View.GONE ? R.drawable.arrow_down : R.drawable.arrow_right
)
);
return group;
}
/**
* Adds a part
*/
private void addPart(String name, String value, LinearLayout container, Uri.Builder onDelete) {
if (value == null) return;
var part = Inflater.inflate(R.layout.uri_part, container);
part.<TextView>findViewById(R.id.key).setText(name);
var value_view = part.<TextView>findViewById(R.id.value);
value_view.setText(value);
AndroidUtils.setAsClickable(value_view);
value_view.setOnClickListener(v -> setUrl(value));
var delete_view = part.<Button>findViewById(R.id.delete);
if (onDelete != null) {
try {
var newUrl = onDelete.build().toString();
delete_view.setOnClickListener(v -> setUrl(newUrl));
} catch (UnsupportedOperationException ignored) {
delete_view.setVisibility(View.GONE);
}
} else {
delete_view.setVisibility(View.GONE);
}
}
/**
* Gets the queries, in order (except for same-name ones)
*/
private List<Pair<String, String>> getQueryParts(Uri uri) {
try {
var queries = new ArrayList<Pair<String, String>>();
for (var name : uri.getQueryParameterNames()) {
for (var value : uri.getQueryParameters(name)) {
queries.add(Pair.create(name, value));
}
}
return queries;
} catch (UnsupportedOperationException e) {
return Collections.emptyList();
}
}
}

View File

@ -4,10 +4,8 @@ import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Color;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.trianguloy.urlchecker.R;
@ -19,6 +17,7 @@ import com.trianguloy.urlchecker.modules.AModuleDialog;
import com.trianguloy.urlchecker.modules.companions.VirusTotalUtility;
import com.trianguloy.urlchecker.url.UrlData;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.DefaultTextWatcher;
import com.trianguloy.urlchecker.utilities.GenericPref;
import com.trianguloy.urlchecker.utilities.UrlUtils;
@ -57,7 +56,7 @@ public class VirusTotalModule extends AModuleData {
}
}
class VirusTotalConfig extends AModuleConfig implements TextWatcher {
class VirusTotalConfig extends AModuleConfig {
final GenericPref.Str api_key;
@ -79,23 +78,15 @@ class VirusTotalConfig extends AModuleConfig implements TextWatcher {
@Override
public void onInitialize(View views) {
final EditText edit_key = (EditText) views.findViewById(R.id.api_key);
var edit_key = views.<TextView>findViewById(R.id.api_key);
edit_key.setText(api_key.get());
edit_key.addTextChangedListener(this);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
api_key.set(s.toString());
if (!canBeEnabled()) disable();
edit_key.addTextChangedListener(new DefaultTextWatcher() {
@Override
public void afterTextChanged(Editable s) {
api_key.set(s.toString());
if (!canBeEnabled()) disable();
}
});
}
}

View File

@ -128,7 +128,7 @@ public interface AndroidSettings {
/**
* The theme setting
*/
enum Theme implements TranslatableEnum {
enum Theme implements Enums.IdEnum, Enums.StringEnum {
DEFAULT(0, R.string.deviceDefault),
DARK(1, R.string.spin_darkTheme),
LIGHT(2, R.string.spin_lightTheme),

View File

@ -103,6 +103,7 @@ public interface AndroidUtils {
}
}, 0, text.length(), 0);
textview.setText(text);
// TODO: remove underline (set color only). textview.setTextColor(textview.getResources().getColor(R.color.app)); doesn't work
}
/**

View File

@ -0,0 +1,21 @@
package com.trianguloy.urlchecker.utilities;
import android.text.Editable;
import android.text.TextWatcher;
/***
* TextWatcher empty implementation, so you can override only what you need
*/
public class DefaultTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
}
}

View File

@ -0,0 +1,50 @@
package com.trianguloy.urlchecker.utilities;
import java.util.HashMap;
import java.util.Map;
public interface Enums {
interface StringEnum {
/**
* This must return the string resourced associated with this enum value
*/
int getStringResource();
}
interface IdEnum {
/**
* The id of the saved preference. Must never change
*/
int getId();
}
interface ImageEnum {
int getImageResource();
}
/**
* Get an enum from an id
*/
static <TE extends IdEnum> TE toEnum(Class<TE> te, int id) {
TE[] enumConstants = te.getEnumConstants();
for (TE constant : enumConstants) {
if (constant.getId() == id) {
return constant;
}
}
return null;
}
/**
* Get a map of id and enum
*/
static <TE extends IdEnum> Map<Integer, TE> toEnumMap(Class<TE> te) {
Map<Integer, TE> res = new HashMap<>();
TE[] enumConstants = te.getEnumConstants();
for (TE constant : enumConstants) {
res.put(constant.getId(), constant);
}
return res;
}
}

View File

@ -3,7 +3,6 @@ package com.trianguloy.urlchecker.utilities;
import android.content.Context;
import android.content.SharedPreferences;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
@ -198,15 +197,7 @@ public abstract class GenericPref<T> {
*/
public void attachToEditText(EditText editText, JavaUtils.UnaryOperator<String> loadMod, JavaUtils.UnaryOperator<String> storeMod) {
editText.setText(loadMod.apply(get()));
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
editText.addTextChangedListener(new DefaultTextWatcher() {
@Override
public void afterTextChanged(Editable s) {
set(storeMod.apply(s.toString()));
@ -257,7 +248,7 @@ public abstract class GenericPref<T> {
/**
* A list of options (enumeration) preference
*/
static public class Enumeration<T extends Enum<T> & TranslatableEnum> extends GenericPref<T> {
static public class Enumeration<T extends Enum<T> & Enums.IdEnum & Enums.StringEnum> extends GenericPref<T> {
private final Class<T> type;
public Enumeration(String prefName, T defaultValue, Class<T> type, Context cntx) {
@ -281,6 +272,7 @@ public abstract class GenericPref<T> {
/**
* Populate a spinner with this preference
* if listener is not null, it will be called each time the spinner changes value
*/
public void attachToSpinner(Spinner spinner, JavaUtils.Consumer<T> listener) {
// Put elements in the spinner

View File

@ -1,6 +1,6 @@
package com.trianguloy.urlchecker.utilities;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -12,8 +12,8 @@ public interface Inflater {
* like {@link android.view.LayoutInflater#inflate(int, ViewGroup)}, but returns the inflated view (not the root view)
* Note: root must not be null (otherwise just use the original)
*/
static <T extends View> T inflate(int resource, ViewGroup root, Activity cntx) {
final View view = cntx.getLayoutInflater().inflate(resource, root, false);
static <T extends View> T inflate(int resource, ViewGroup root) {
final View view = LayoutInflater.from(root.getContext()).inflate(resource, root, false);
root.addView(view);
//noinspection unchecked
return ((T) view);

View File

@ -45,6 +45,33 @@ public interface JavaUtils {
: clamp(max, value, min);
}
/**
* Applies a filter to both strings to check if all words of keywords are in body.
* The order does not matter.
*/
static boolean containsWords(String body, String keywords){
JavaUtils.Function<String, String> filter = s -> s.toUpperCase().replaceAll("[\\s-_]+", " ");
// Match all words
String[] words = filter.apply(keywords).split(" ");
body = filter.apply(body);
boolean match = true;
for (String str : words) {
if (!body.contains(str)){
match = false;
break;
}
}
return match;
}
/**
* Returns the object, or default if null
* java.util.Optional requires api 24
*/
static <T> T valueOrDefault(T value, T defaultValue){
return value == null ? defaultValue : value;
}
/**
* java.util.function.Consumer requires api 24
*/

View File

@ -1,17 +0,0 @@
package com.trianguloy.urlchecker.utilities;
/**
* On java, an enum can't be extended :(
* This is the best I can do...unless I discover how to create annotations!
*/
public interface TranslatableEnum {
/**
* The id of the saved preference. Must never change
*/
int getId();
/**
* This must return the string resourced associated with this enum value
*/
int getStringResource();
}

View File

@ -0,0 +1,61 @@
package com.trianguloy.urlchecker.views;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.ImageButton;
import com.trianguloy.urlchecker.utilities.Enums;
import java.util.List;
public class CycleImageButton<T extends Enums.ImageEnum> extends ImageButton {
private List<T> states;
private int currentState;
public CycleImageButton(Context context) {
super(context);
}
public CycleImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CycleImageButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setStates(List<T> states) {
this.states = states;
updateImageResource(0);
}
public void setCurrentState(T currentState) {
updateImageResource(states.indexOf(currentState));
}
public T getCurrentState() {
return states == null || states.isEmpty() ? null : states.get(currentState);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
@Override
public boolean performClick() {
updateImageResource(currentState + 1);
return super.performClick();
}
private void updateImageResource(int newState) {
if (states == null || states.isEmpty()) {
setImageDrawable(null);
} else {
currentState = newState >= 0 ? newState % states.size() : 0;
setImageResource(states.get(currentState).getImageResource());
}
}
}

View File

@ -1,4 +1,3 @@
Questa applicazione agisce come un intermediario nell'apertura di link. Quando premi su un link, una finestra contenente informazioni riguardo l'url viene mostrata, permettendoti di modificarlo.
È particolarmente utile quando ti serve aprire un link da una mail, un social network, od altro.

View File

@ -1 +1 @@
URLChecker è un'app che permette di analizzare urls prima di aprirli.
Permette di analizzare (o condividere) gli URL prima di aprirli.

View File

@ -0,0 +1,36 @@
Ця програма діє як посередник під час переходу за посиланням. Коли ви натиснете на одне з них, відобразиться діалогове вікно з інформацією про це посилання та можливостями відредагувати його перед відкриттям.
Це корисно, коли ви відкриваєте посилання з електронного листа, публікації в соцмережі чи будь-де інде.
Спочатку TrianguloY розробив URLCheck для особистого використання. Програма опублікована з відкритим вихідним кодом (під ліцензією CC BY 4.0), безкоштовна, без будь-якої реклами чи трекерів, має невеликий розмір і використовує мінімум дозволів (лише дозвіл на доступ до Інтернету для перевірки модулів, а це відбувається лише за запитом користувача). Вихідний код доступний на GitHub, де ви можете запропонувати зміни чи допомогти з перекладом: https://github.com/TrianguloY/UrlChecker
Додаток має модульну структуру, і ви можете вмикати/вимикати та змінювати порядок цих модулів, зокрема:
* Вхідний текст: відображає поточне посилання для ручного редагування. Не можна вимкнути.
* Історія: переглядайте та скасовуйте будь-які зміни з інших модулів, включно з редагуванням користувача (типова функція скасування/повторення)
* Журнал: веде журнал усіх перевірених посилань, який можна переглядати, редагувати, копіювати, очищати...
* Код статусу: за натисканням кнопки надсилає запит до серверу та показує код статусу (добре, помилка сервера, не знайдено тощо). Окрім того, якщо посилання розпізнається як перенаправлення, ви можете натиснути на повідомлення, щоб перевірити нове посилання. Важливо розуміти, що посилання лише отримується, а не перевіряється, тому перенаправлення на основі JavaScript не знайдеться.
* Сканер посилань: сканує їх за допомогою VirusTotal і надає звіт. Для роботи модуля потрібен безкоштовний персональний ключ VirusTotal API. VirusTotal™ є торговою маркою Google, Inc.
* Прибиральник посилань: використовує каталог ClearURLs для видалення реферальних і непотрібних параметрів. Це також дозволяє звичайні офлайн-перенаправлення. У програму вбудований каталог із https://docs.clearurls.xyz/latest/specs/rules/
* Розкорочувач: використовує https://unshorten.me/ для віддаленого отримання довгих посилань.
* Прибиральник запитів: відображає декодовані окремі посилання, які можна видалити або перевірити.
* Модуль шаблонів: перевіряє посилання за допомогою шаблонів з регулярними виразами, які попереджають, пропонують або застосовують зміни. Ви можете змінювати або створювати власні шаблони, як і використовувати уже створені користувачами.
Серед вбудованих шаблонів є:
- Попередження, якщо посилання містить символи, відмінні від таблиці ASCII, як-от грецькі літери. Це можуть використовувати для фішингу: googĺe.com проти google.com
- Пропонування замінити "http" на "https"
- Пропонування замінити YouTube, Reddit або Twitter альтернативами, які забезпечують конфіденційність [за умовчанням вимкнено]
* Перевірка хостів: цей модуль попереджує про хости, які можна налаштувати вручну або з файлу (схожого на віддалені хости). Це можна використовувати для попередження про небезпечні або спеціальні сайти. Вбудована конфігурація містить хости StevenBlack (рекламне програмне забезпечення/зловмисне програмне забезпечення, фейкові новини, азартні ігри та вміст для дорослих) із https://github.com/StevenBlack/hosts
* Модуль налагодження: відображає URI Intent'ів та, за бажанням, інформацію про службу ctabs (Custom Tabs). Це призначено для розробників.
* Модуль відкриття: містить кнопки відкриття та спільного доступу. Якщо посилання можна відкрити за допомогою кількох програм, з’явиться стрілка, яка дозволить вибрати ту, яку потрібно. Не можна вимкнути.

View File

@ -0,0 +1 @@
Дозволяє аналізувати (або ділитися) посиланнями перед відкриттям.

View File

@ -1 +1 @@
在打开网址之前,允许您分析(或共享)它们。
在打开链接之前允许应用分析(或共享)它们。

View File

@ -1,3 +1,14 @@
V 2.11
- New module: Edit Flags
- New module: Uri parts (substitute of Queries remover)
- New config: excludeRegex field on Pattern Checker module
- Change: modules are now hidden when unused
- Fix: opened apps weren't showing on recents
- Fix: standard shortcuts weren't available
- Fix: keyboard was obstructing the dialog
- Fix: status module wasn't working properly
- Translations: New and updates from symbuzzer and other from Weblate
V 2.10
- New tutorial screen
- New module: Unshortener

View File

@ -1,3 +1,14 @@
V 2.11
- Nuevo módulo: Editor de flags
- Nuevo módulo: Partes de la URI (substituto de Eliminador de parámetros)
- Nueva configuración: excludeRegex en módulo Verificador de patrones
- Cambio: los módulos sin uso se ocultan
- Arreglo: aplicaciones no se mostraban en recientes
- Arreglo: atajos estándar no estaban disponibles
- Arreglo: teclado ocultaba la ventana
- Arreglo: Código de estado no funcionaba correctamente
- Traducciones: Nuevas y actualizaciones de symbuzzer y otros en Weblate
V 2.10
- Nueva pantalla tutorial
- Nuevo módulo: Desacortador

View File

@ -1,3 +1,14 @@
V 2.11
- New module: Edit Flags
- New module: Uri parts (substitute of Queries remover)
- New config: excludeRegex field on Pattern Checker module
- Change: modules are now hidden when unused
- Fix: opened apps weren't showing on recents
- Fix: standard shortcuts weren't available
- Fix: keyboard was obstructing the dialog
- Fix: status module wasn't working properly
- Translations: New and updates from symbuzzer and other from Weblate
V 2.10
- Nouvel écran didactique
- Nouveau module: Déraccourcisseur

View File

@ -1,10 +1,21 @@
V 2.11
- New module: Edit Flags
- New module: Uri parts (substitute of Queries remover)
- New config: excludeRegex field on Pattern Checker module
- Change: modules are now hidden when unused
- Fix: opened apps weren't showing on recents
- Fix: standard shortcuts weren't available
- Fix: keyboard was obstructing the dialog
- Fix: status module wasn't working properly
- Translations: New and updates from symbuzzer and other from Weblate
V 2.10
- New tutorial screen
- New module: Unshortener
- New features and improvements to status module
- New shortcut & tile to open clipboard links
- New chinese translation. Many thanks to Seviche CC!
- Visual fixes
- Ny veiledningsskjerm
- Ny modul: Avforkorter
- Nye funksjoner og forbedringer i statusmodulen
- Ny snarvei og flis for åpning av utklippstavlelenker
- Ny kinesisk oversettelse, takket være Seviche CC.
- Visuelle forbedringer
V 2.9.1
- New Italian translation. Thanks to dperruso!

View File

@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="24"
android:viewportHeight="24">
<!-- <path-->
<!-- android:fillColor="@color/app"-->
<!-- android:pathData="M5 4 5 6 7 6 18 15 18 17 20 17 20 6 14 6 13 4M5 7 5 9 7 9 7 7M5 13 5 15 7 15 7 13M5 16 5 18 7 18 7 16M5 19 5 21 7 21 7 19M8 13 8 15 10 15 10 13M11 13 11 15 12 15 13 17 14 17 14 15 13 13M15 15 15 17 17 17 17 15M5 10 5 12 7 12 7 10" />-->
<path
android:fillColor="@color/app"
android:pathData="M5 4 5 15 7 15 7 13 18 8 20 8 20 6 14 6 13 4M5 16 5 18 7 18 7 16M5 19 5 21 7 21 7 19M8 13 8 15 10 15 10 13M11 13 11 15 12 15 13 17 14 17 14 15 13 13M15 15 15 17 17 17 17 15M18 15 18 17 20 17 20 15M18 12 18 14 20 14 20 12M18 9 18 11 20 11 20 9" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/app"
android:pathData="M5 4 5 6 7 6 7 4M5 7 5 9 7 9 7 7M5 13 5 15 7 15 7 13M5 16 5 18 7 18 7 16M5 19 5 21 7 21 7 19M8 13 8 15 10 15 10 13M11 13 11 15 12 15 13 17 14 17 14 15 13 13M15 15 15 17 17 17 17 15M18 15 18 17 20 17 20 15M18 12 18 14 20 14 20 12M18 6 18 8 20 8 20 6M15 6 15 8 17 8 17 6M11 4 11 6 12 6 13 8 14 8 14 6 13 4M8 4 8 6 10 6 10 4M5 10 5 12 7 12 7 10M18 9 18 11 20 11 20 9" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/app"
android:pathData="M14 6 13 4H5v17h2v-7h5l1 2h7V6z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/app"
android:pathData="M12 17C6 17 1 8 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c0-4-5 5-11 5z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="512"
android:viewportHeight="512">
<path
android:fillColor="@color/app"
android:pathData="M508.692,167.211c-14.625,0.984-64.391,5.859-128.781,5.859c-90.734,0-96.594,32.188-123.922,32.188 c-31.203,0-29.25-32.188-123.906-32.188c-64.391,0-114.156-4.875-128.781-5.859c-10.531-0.703,3.906,103.406,46.828,142.438 c32.5,29.547,111.234,54.656,172.703,13.656c23.422-18.516,33.156-18.516,33.156-18.516s9.781,0,33.188,18.516 c61.453,41,140.203,15.891,172.688-13.656C504.786,270.617,519.239,166.508,508.692,167.211z M202.442,255.305 c-45.656,50.922-120.297,15.797-121.172-35.141C165.552,207.008,205.755,251.602,202.442,255.305z M309.552,255.305 c-3.313-3.703,36.875-48.297,121.172-35.141C429.849,271.102,355.224,306.227,309.552,255.305z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="48"
android:viewportHeight="48">
<path
android:fillColor="@color/app"
android:pathData="M24,4C12.954,4,4,12.954,4,24s8.954,20,20,20c11.046,0,20-8.954,20-20S35.046,4,24,4z M31.96,22 c-0.208-5.225-1.223-9.846-2.726-13.103c5.649,1.964,9.861,6.998,10.627,13.103H31.96z M24,39.9 c-1.213-0.955-3.608-5.736-3.954-13.9h7.908C27.608,34.164,25.213,38.945,24,39.9z M20.046,22C20.392,13.836,22.787,9.055,24,8.1 c1.213,0.955,3.608,5.736,3.954,13.9H20.046z M18.766,8.897C17.264,12.154,16.248,16.775,16.04,22H8.139 C8.905,15.896,13.117,10.861,18.766,8.897z M16.04,26c0.208,5.225,1.223,9.846,2.726,13.103C13.117,37.139,8.905,32.104,8.139,26 H16.04z M29.234,39.103c1.502-3.257,2.518-7.878,2.726-13.103h7.902C39.095,32.104,34.883,37.139,29.234,39.103z" />
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/app"
android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z" />
</vector>

View File

@ -5,16 +5,15 @@
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/mFlag_desc" />
<EditText
android:id="@+id/flags"
<Button
android:id="@+id/button"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="0xFFFFFFFF"
android:inputType="textPersonName" />
android:text="@string/mFlag_editFlags" />
</LinearLayout>

View File

@ -30,6 +30,26 @@
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/smallPadding"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="@string/mOpen_incognito" />
<Spinner
android:id="@+id/incognito_pref"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
<Switch
android:id="@+id/closeopen_pref"
android:layout_width="match_parent"

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:id="@+id/flagHexLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/edit"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="@string/edit" />
<EditText
android:id="@+id/flagsHexText"
style="@android:style/Widget.TextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:enabled="false"
android:inputType="textPersonName"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:id="@+id/addFlagLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/add"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="@string/add" />
<AutoCompleteTextView
android:id="@+id/flagText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="@string/mFlag_flagHint" />
<ImageButton
android:id="@+id/more"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:src="@drawable/arrow_down"
android:tint="?attr/colorAccent" />
</LinearLayout>
<LinearLayout
android:id="@+id/box"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:id="@+id/shownFlags"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right|end|center_vertical"
android:orientation="horizontal">
<EditText
android:id="@+id/search"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@android:string/search_go" />
<ImageView
android:id="@+id/overflowButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/smallPadding"
android:src="@drawable/arrow_down"
android:tint="?attr/colorAccent" />
</LinearLayout>
<LinearLayout
android:id="@+id/hiddenFlags"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout>

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<ImageButton
android:id="@+id/state"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="@dimen/square_button"
android:layout_height="@dimen/square_button"
android:layout_weight="0"
android:src="@drawable/flag_auto" />
<TextView
android:id="@+id/defaultIndicator"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="0" />
<TextView
android:id="@+id/preferenceIndicator"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_margin="3dp"
android:layout_weight="0" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical" />
</LinearLayout>

View File

@ -10,8 +10,20 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="@string/mOpen_tabsDesc"
android:minWidth="0dp"
android:minHeight="0dp"
android:src="@drawable/ctabs_off" />
<ImageButton
android:id="@+id/mode_incognito"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="@string/mOpen_incognitoDesc"
android:minWidth="0dp"
android:minHeight="0dp"
android:src="@drawable/no_incognito" />
<LinearLayout
android:id="@+id/open_parent"
android:layout_width="0dp"

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:id="@+id/box"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />
</LinearLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="@android:string/search_go"
android:inputType="textPersonName" />
<LinearLayout
android:id="@+id/box"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"></LinearLayout>
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<view
android:id="@+id/state"
style="?android:attr/buttonBarButtonStyle"
class="com.trianguloy.urlchecker.views.CycleImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
android:minHeight="0dp"
android:src="@drawable/flag_auto" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="left|center_vertical" />
<ImageButton
android:id="@+id/show"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="0dp"
android:minHeight="0dp"
android:src="@drawable/show" />
</LinearLayout>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="25dp">
<TextView
android:id="@+id/key"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingStart="20dp"
android:paddingLeft="20dp" />
<TextView
android:id="@+id/value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableTint="?android:attr/colorAccent" />
<Button
android:id="@+id/delete"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="40dp"
android:layout_height="match_parent"
android:padding="0dp"
android:scaleType="center"
android:text="X" />
</LinearLayout>

View File

@ -117,13 +117,13 @@ Hay algunos enlaces cuyo único propósito es redirigirte a otro enlace. Si el e
<string name="mPttrn_noSchemeHttp">Falta esquema HTTP.</string>
<string name="mPttrn_noSchemeHttps">Falta esquema HTTPS.</string>
<string name="mPttrn_ok">No hay patrones coincidentes</string>
<string name="mPttrn_editor">Aquí puede editar o añadir un nuevo patrón. Formato:
\n- \'regex\': cadena: un regex de java válido que debe coincidir para que coincida todo el patrón.
\n- \'excludeRegex\': cadena: si se proporciona, un regex java válido que no debe coincidir para que coincida todo el patrón.
\n- \'replacement\': cadena|lista: si se proporciona, el botón \'fix\' ejecutará \'url=url.replaceAll(regex,replacement)\'. Si es una lista, el reemplazo será un elemento aleatorio de la misma.
\n- \'automatic\': booleano: se establece en true para aplicar automáticamente el patrón.
\n- \'enabled\': booleano: establece false para desactivar el patrón.
\nNota: si editas los patrones, los nuevos patrones incorporados de las actualizaciones de la aplicación no se añadirán automáticamente (puedes restaurarlos con la opción restaurar).</string>
<string name="mPttrn_editor">Aquí puedes editar o añadir un nuevo patrón. Formato:
\n- \'regex\': cadena: un regex de java válido que debe coincidir para que coincida todo el patrón.
\n- \'excludeRegex\': cadena: si se proporciona, un regex java válido que no debe coincidir para que coincida todo el patrón.
\n- \'replacement\': string|list: si se proporciona, el botón \'fix\' ejecutará \'url=url.replaceAll(regex,replacement)\'. Si es una lista, el reemplazo será un elemento aleatorio de la misma.
\n- \'automatic\': booleano: se establece en true para aplicar automáticamente el patrón.
\n- \'enabled\': booleano: establecido en false para desactivar el patrón.
\nNota: si editas los patrones, los nuevos patrones incorporados de las actualizaciones de la app no se añadirán automáticamente (puedes restaurarlos con la opción reset).</string>
<!-- -->
<string name="mOpen_name">Abrir y compartir</string>
<string name="mOpen_desc">"Contiene los siguientes botones (de izquierda a derecha):
@ -131,10 +131,10 @@ Hay algunos enlaces cuyo único propósito es redirigirte a otro enlace. Si el e
- Boton de abrir: pulsa el nombre de la aplicación para abrir el enlace en ella. Si un enlace puede ser abierto por varias se mostrará una flecha para poder elegir.
- Botón de compartir: Púlsalo para compartir el enlace. Mantenlo pulsado para copiarlo diréctamente en el navegador."</string>
<string name="mOpen_ctabs">"'Custom tabs':"</string>
<string name="mOpen_ctabsOn">Activado por defecto</string>
<string name="mOpen_ctabsOff">Desactivado por defecto</string>
<string name="mOpen_ctabsEn">Siempre activado</string>
<string name="mOpen_ctabsDis">Siempre desactivado</string>
<string name="defaultOn">Activado por defecto</string>
<string name="defaultOff">Desactivado por defecto</string>
<string name="alwaysOn">Siempre activado</string>
<string name="alwaysOff">Siempre desactivado</string>
<string name="mOpen_closeOpen">Cierra la ventana después de abrir</string>
<string name="mOpen_closeShare">Cierra la ventana después de compartir</string>
<string name="mOpen_perDomain">Ordenar diferentes dominios de forma independiente</string>
@ -147,7 +147,7 @@ Hay algunos enlaces cuyo único propósito es redirigirte a otro enlace. Si el e
<string name="mOpen_tabsDesc">"Activa/desactiva 'custom tabs'"</string>
<!-- -->
<string name="mStatus_name">Código de estado</string>
<string name="mStatus_desc">Al presionar el botón de verificación, se realizará una petición para recuperar y mostrar el código de estado del sitio. Si el resultado es una redirección, podrá ver la URL de destino. El contenido de la URL se obtiene (HEAD), pero no se evalúa, por lo que no se detectarán las redirecciones basadas en JavaScript.</string>
<string name="mStatus_desc">Al presionar el botón de verificación, se realizará una petición para recuperar y mostrar el código de estado del sitio. Si el resultado es una redirección, podrá ver la URL de destino. El contenido de la URL se obtiene (GET), pero no se evalúa, por lo que no se detectarán las redirecciones basadas en JavaScript.</string>
<string name="mStatus_ioerror">Error de red al intentar comprobar la URL: %s</string>
<string name="mStatus_error">Error interno al intentar comprobar la URL: %s</string>
<string name="mStatus_check">Comprobar código de estado</string>
@ -179,7 +179,7 @@ Hay algunos enlaces cuyo único propósito es redirigirte a otro enlace. Si el e
<string name="mInput_desc">Muestra la URL actual, que puede ser modificada manualmente.</string>
<!-- -->
<string name="mVT_name">Escáneador de la URL</string>
<string name="mVT_desc">Cuando este módulo se habilita puedes escanear la URL mediante VirusTotal y comprobar el informe. Se necesita una clave de la API de VirusTotal para que funcione, puedes obtener una tras registrarte gratis aquí: https://www.virustotal.com/gui/join-us.</string>
<string name="mVT_desc">Cuando este módulo se habilita puedes escanear la URL mediante VirusTotal y comprobar el informe. Se necesita una clave de la API de VirusTotal para que funcione, puedes obtener una tras registrarte gratis aquí: https://www.virustotal.com/gui/join-us .</string>
<string name="mVT_apiKey">Clave de la API</string>
<string name="mVT_tm">VirusTotal™ es una marca registrada de Google, Inc.</string>
<string name="mVT_scan">Escanear</string>
@ -238,9 +238,11 @@ Pulsa en el Intent o en UrlData para copiarlo al portapapeles. Mantenlo pulsado
<string name="mClear_editor">Catálogo de reglas: deben seguir el formato definido en https://docs.clearurls.xyz/latest/specs/rules/. Ten en cuenta que las modificaciones del objeto principal \'providers\' serán sobreescritas al actualizar el catálogo automática o manualmente desde la ventana del actualizador. Para añadir reglas personales inclúyelas en un objeto padre distinto (cualquier nombre).</string>
<!-- -->
<string name="mRemove_name">Eliminador de parámetros</string>
<string name="mRemove_desc">"Con este módulo puedes eliminar los parámetros de la URL.
Púlsa el botón para borrarlos todos o la flecha para ir uno a uno.
¡Gracias a PabloOQ por la idea e implementación original!"</string>
<string name="mRemove_desc">[DEPRECADO] Con este módulo puede eliminar parámetro de la URL.
\nPresione el botón para eliminarlos todos o presione la flecha para eliminar uno a uno.
\n¡Gracias a PabloOQ por la idea y la implementación original!
\n
\nEste módulo ha quedado deprecado en favor del módulo \'Partes de la URI\'</string>
<string name="mRemove_found1">1 parámetro encontrado</string>
<string name="mRemove_found">%d parámetros encontrados</string>
<string name="mRemove_noQueries">Sin parámetros</string>
@ -290,14 +292,17 @@ El servicio está limitado a 10 peticiones por hora para nuevos enlaces. La resp
<string name="mUnshort_checking">Comprobando…</string>
<string name="mUnshort_error">Error de servidor: %s</string>
<string name="mUnshort_internal">Error interno (%s)</string>
<string name="mUnshort_notFound">No se ha encontrado redirección (quedan: %d/%d)</string>
<string name="mUnshort_ok">Desacortado (quedan: %d/%d)</string>
<string name="mUnshort_notFound">No se ha encontrado redirección</string>
<string name="mUnshort_pending">quedan: %d/%d</string>
<string name="mUnshort_ok">Desacortado</string>
<!-- -->
<string name="mFlags_name">Editor de flags</string>
<string name="mFlags_invalid">Flag inválida</string>
<string name="mFlag_desc">[Funcionalidad beta] Este módulo avanzado te permite editar las flags del intent cuando abres una aplicación. En el cuadro de texto de debajo puedes marcar flags que sobreescribirán a las de por defecto, aquellas obtenidas del intent que se usó para abrir esta aplicación. Al usar el módulo puedes mantener pulsado el botón de editar para guardar las flags como valor por defecto. Puedes añadir flags escribiendo su nombre en el cuadro de entrada</string>
<string name="mFlag_flagHint">Nombre de flag</string>
<string name="remove">Eliminar</string>
<string name="edit">Editar</string>
<string name="add">Añadir</string>
<string name="mFlag_desc">[Funcionalidad beta] Este es un módulo avanzado que te permite editar las marcas del intent al abrir otra aplicación.
\nEste módulo mostrará una lista de marcas, se puede cambiar si la marca se establece o no tocando el icono. También hay un menú de desbordamiento para ocultar las marcas allí, es sólo visual, las marcas seguirán utilizando el estado asignado.
\nLas marcas tendrán dos indicadores de color junto a la casilla de verificación. El de la izquierda muestra el valor recibido del intent, el de la derecha indica el estado establecido por el propio módulo. Rojo significa que la marca no está establecida y verde significa que sí lo está. Adicionalmente, el indicador puede ser gris, que significa que el estado se estableció en automático.
\nCon el botón de abajo puede editar el estado por defecto y la visibilidad de las marcas.</string>
<string name="mFlag_editFlags">Editar los valores por defecto de los marcadores</string>
<!-- -->
<string name="mParts_name">Partes de la URI</string>
<string name="mParts_desc">Este módulo muestra todas las partes de la url decodificadas: esquema, autoridad, rutas, parámetros y fragmento. Al hacer clic en una parte, se establecerá como la nueva URL, útil por ejemplo si una de las consultas o rutas era una URL de redirección codificada. También puedes hacer clic en el botón \'X\' para eliminar algunos de ellos. Esta es una versión avanzada del módulo \'Eliminador de parámetros\'.</string>
</resources>

View File

@ -130,10 +130,10 @@ Remarque: si vous modifiez les modèles, les nouveaux modèles intégrés lors d
- Bouton Ouvrir: appuyez sur le nom de l'application pour ouvrir le lien avec. Si un lien peut être ouvert avec plusieurs applications, une flèche s'affiche afin de vous offrir le choix.
- Bouton Partager: appuyez sur le bouton pour partager le lien. Appuyez longuement pour le copier rapidement dans le presse-papiers."</string>
<string name="mOpen_ctabs">Onglets personnalisés:</string>
<string name="mOpen_ctabsOn">Activé par défaut</string>
<string name="mOpen_ctabsOff">Désactivé par défaut</string>
<string name="mOpen_ctabsEn">Toujours activé</string>
<string name="mOpen_ctabsDis">Toujours désactivé</string>
<string name="defaultOn">Activé par défaut</string>
<string name="defaultOff">Désactivé par défaut</string>
<string name="alwaysOn">Toujours activé</string>
<string name="alwaysOff">Toujours désactivé</string>
<string name="mOpen_closeOpen">Fermer la boîte de dialogue après l\'ouverture du lien</string>
<string name="mOpen_closeShare">Fermer la boîte de dialogue après le partage du lien</string>
<string name="mOpen_perDomain">Triez les différents domaines indépendamment</string>
@ -148,7 +148,7 @@ Remarque: si vous modifiez les modèles, les nouveaux modèles intégrés lors d
<string name="mStatus_name">Code d\'état</string>
<string name="mStatus_desc">"En appuyant sur le bouton de vérification, une requête sera faite pour récupérer et afficher le code d'état du site.
Si le résultat est une redirection, vous pourrez voir l'url de destination.
Le contenu de l'url est obtenu (HEAD), mais n'est pas évaluée, les redirections basées sur javascript ne seront donc pas détectées."</string>
Le contenu de l'url est obtenu (GET), mais n'est pas évaluée, les redirections basées sur javascript ne seront donc pas détectées."</string>
<string name="mStatus_ioerror">Erreur réseau lors de la tentative de vérification de l\'URL: %s</string>
<string name="mStatus_error">Erreur interne lors de la tentative de vérification de l\'URL: %s</string>
<string name="mStatus_check">Vérifier le statut</string>
@ -181,7 +181,7 @@ Le contenu de l'url est obtenu (HEAD), mais n'est pas évaluée, les redirection
<!-- -->
<string name="mVT_name">Scanneur</string>
<string name="mVT_desc">"Lorsque ce module est activé, vous pouvez analyser l'URL à l'aide de VirusTotal et en vérifier le rapport.
Une clé personnelle de l'Api VirusTotal est nécessaire pour que cela fonctionne, vous pouvez en obtenir une après vous être inscrit gratuitement ici: https://www.virustotal. com/gui/join-us."</string>
Une clé personnelle de l'Api VirusTotal est nécessaire pour que cela fonctionne, vous pouvez en obtenir une après vous être inscrit gratuitement ici: https://www.virustotal.com/gui/join-us ."</string>
<string name="mVT_apiKey">Clé d\'api</string>
<string name="mVT_tm">VirusTotal™ est une marque de Google, Inc.</string>
<string name="mVT_scan">Analyse</string>
@ -293,6 +293,7 @@ Leur API est limitée à 10 requêtes par heure pour les nouveaux contrôles. L
<string name="mUnshort_checking">Vérification…</string>
<string name="mUnshort_error">Erreur de serveur: %s</string>
<string name="mUnshort_internal">Erreur interne (%s)</string>
<string name="mUnshort_notFound">"Aucune redirection n'a été trouvée (en attente: %d/%d)"</string>
<string name="mUnshort_ok">Déraccourci (en attente: %d/%d)</string>
<string name="mUnshort_notFound">"Aucune redirection n'a été trouvée"</string>
<string name="mUnshort_pending">en attente: %d/%d</string>
<string name="mUnshort_ok">Déraccourci</string>
</resources>

View File

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Translator(s) name:
If you create or update a translation, add how you want to be credited here.
@ -8,25 +9,21 @@
Locale name:
Write the locale name in the locale language, for users that doesn't know english. For example 'Español' instead of 'Spanish'-->
<string name="locale">Italiano</string>
<!-- main -->
<string name="txt_info">"Quest'app agisce come uno step intermedio tra il premere su un link e la sua apertura. Quando premi su un link e scegli quest'app per aprirlo, ti verrà mostrata una finestra con delle informazioni riguardo il link. Premi il pulsante dei moduli in basso per dare un'occhiata a tutti i moduli disponibili."</string>
<string name="txt_sample">Premi il link qui in basso per provare:</string>
<string name="a_modules">Moduli</string>
<string name="a_settings">Impostazioni</string>
<string name="a_about">Informazioni</string>
<!-- about -->
<string name="txt_about">"App creata da TrianguloY.
Contributi: %s.
Traduzioni: %s."</string>
<string name="link_blog">"TrianguloY's blog"</string>
<string name="link_blog">Blog di TrianguloY</string>
<string name="link_changelog">Changelog</string>
<string name="link_source">Codice sorgente</string>
<string name="link_privacy">Privacy policy</string>
<string name="link_privacy">Informativa sulla privacy</string>
<!-- modules -->
<string name="txt_conf">Qui puoi vedere tutti i moduli disponibili, la loro descrizione, ed impostazioni. Puoi anche re-ordinarli, ed abilitarli o disabilitarli.</string>
<string name="toast_cantEnable">"Impossibile abilitare il modulo, configurazione mancante?"</string>
@ -36,22 +33,20 @@ Traduzioni: %s."</string>
<string name="desc_down">Muovi giù</string>
<string name="desc_decorations">Mostra/nascondi titoli</string>
<string name="desc_enable">Attiva/disattiva modulo</string>
<!-- settings -->
<string name="txt_openLinks">"Durante gli anni, il modo per configurare l'apertura dei link nelle app è cambiato. Trovi qui in basso tutte le impostazioni disponibili al riguardo per il tuo dispositivo, se i link non vengono aperti in quest'app, dai un'occhiata a tutti."</string>
<string name="btn_setBrowser">Imposta come browser di default</string>
<string name="toast_defaultSet">"L'app è impostata come browser di default"</string>
<string name="btn_configureBrowser">Browser di default</string>
<string name="toast_defaultSet">L\'app è ora il browser web predefinito</string>
<string name="btn_configureBrowser">Browser web predefinito</string>
<string name="btn_linksSettings">Apri link supportati</string>
<string name="btn_androidSettings">Informazioni app</string>
<string name="txt_theme">Tema:</string>
<string name="spin_darkTheme">Scuro</string>
<string name="spin_lightTheme">Chiaro</string>
<string name="txt_locale">Lingua:</string>
<!-- generic -->
<string name="toast_noApp">"Impossibile aprire l'app"</string>
<string name="toast_noBrowser">"Impossibile aprire il browser"</string>
<string name="toast_noApp">Impossibile aprire l\'app</string>
<string name="toast_noBrowser">Impossibile aprire il browser web</string>
<string name="title_choose">Scegli app</string>
<string name="toast_invalid">Invalido</string>
<string name="save">Salva</string>
@ -62,45 +57,39 @@ Traduzioni: %s."</string>
<string name="share">Condividi</string>
<string name="canceled">Cancellato</string>
<string name="deviceDefault">Impostazioni predefinite</string>
<string name="json_desc">"[Funzionalità beta] Questo è un editor avanzato, il contenuto dev'essere formattato in JSON. Puoi premere il pulsante in alto a destra per formattare e controllare."</string>
<string name="json_edit">Editor avanzato</string>
<!-- modules -->
<string name="mPttrn_name">Controllo dei patterns</string>
<string name="mPttrn_name">Controllo dei pattern</string>
<string name="mPttrn_desc">"Controlla cose comuni nell'url. Patterns inclusi:
* Caratteri non-ascii come lettere greche. Quest'ultimi possono essere usati per phishing: googĺe.com vs google.com
* Links http
* Schema http(s) mancante"</string>
<string name="mPttrn_userContent">Lista di altri patterns creati dalla community: %s</string>
<string name="mPttrn_fix">Applica</string>
<string name="mPttrn_fixed">Applicato - %s</string>
<string name="mPttrn_ascii">Attenzione! Caratteri non ascii rilevati.</string>
<string name="mPttrn_http">Link HTTP, considera di utilizzare HTTPS.</string>
<string name="mPttrn_noSchemeHttp">Schema http mancante.</string>
<string name="mPttrn_noSchemeHttps">Schema https mancante.</string>
<string name="mPttrn_ok">Nessun pattern combacia</string>
<string name="mPttrn_editor">"Qui puoi modificare od aggiungere altri patterns. Formato:
- 'regex': stringa: regex valida in java che verrà confrontata con l'url.
- 'replacement': stringa|lista: se configurato, il pulsante "fix" eseguirà 'url=url.replaceAll(regex,replacement)'. Se viene configurata una lista, verrà preso un elemento a random da essa.
- 'automatic': booleana: settala a true per applicare il pattern automaticamente.
- 'enabled' booleana: settala a false per disabilitare il pattern.
Nota: se modifichi i patterns, i nuovi patterns inclusi con eventuali aggiornamenti, non verranno aggiunti. (puoi ripristinarli con l'opzione di reset)."</string>
<string name="mOpen_name"><![CDATA[Apri e condividi]]></string>
<string name="mPttrn_ascii">Attenzione! Rilevati caratteri non ASCII.</string>
<string name="mPttrn_http">Collegamento HTTP. Considera l\'utilizzo di HTTPS.</string>
<string name="mPttrn_noSchemeHttp">Schema HTTP mancante.</string>
<string name="mPttrn_noSchemeHttps">Schema HTTPS mancante.</string>
<string name="mPttrn_ok">Nessun pattern combaciante</string>
<string name="mPttrn_editor">Qui puoi modificare od aggiungere altri patterns. Formato:
\n- \'regex\': stringa: una regex java valida che deve combaciare con l\'intero pattern.
\n- \'excludeRegex\': stringa: se fornita, una regex java valida che non deve combaciare con l\'intero pattern.
\n- \'replacement\': stringa|lista: se configurato, il pulsante fix eseguirà \'url=url.replaceAll(regex,replacement)\'. Se viene configurata una lista, verrà preso un elemento a random da essa.
\n- \'automatic\': booleana: settala a true per applicare il pattern automaticamente.
\n- \'enabled\' booleana: settala a false per disabilitare il pattern.
\nNota: se modifichi i patterns, i nuovi patterns inclusi con eventuali aggiornamenti, non verranno aggiunti. (puoi ripristinarli con l\'opzione di reset).</string>
<string name="mOpen_name">Apri e condividi</string>
<string name="mOpen_desc">"Continene i seguenti pulsanti (da sinistra a destra):
- Schede custom: premi per attivare o disattivare le schede custom. Quando abilitato il browser dovrebbe essere aperto in modalità "light".
- Pulsante apri: Premi il nome dell'app per aprire il link in quell'app. Se un link può essere aperto con più app, una freccia verrà mostrata per permetterti di scegliere tra le app disponibili.
- Pulsante condividi: Premi il pulsante per condividere il link. Tienilo premuto per copiare nella clipboard."</string>
<string name="mOpen_ctabs">Schede custom:</string>
<string name="mOpen_ctabsOn">Abilitato di default</string>
<string name="mOpen_ctabsOff">Disabilitato di default</string>
<string name="mOpen_ctabsEn">Sempre on</string>
<string name="mOpen_ctabsDis">Sempre off</string>
<string name="defaultOn">Abilitato di default</string>
<string name="defaultOff">Disabilitato di default</string>
<string name="alwaysOn">Sempre on</string>
<string name="alwaysOff">Sempre off</string>
<string name="mOpen_closeOpen">"Chiudi finestra dopo l'apertura"</string>
<string name="mOpen_closeShare">Chiudi finestra dopo la condivisione</string>
<string name="mOpen_perDomain">Ordina domini diversi indipendentemente</string>
@ -108,13 +97,12 @@ Nota: se modifichi i patterns, i nuovi patterns inclusi con eventuali aggiorname
<string name="mOpen_with">Apri con %s</string>
<string name="mOpen_open">Apri</string>
<string name="mOpen_share">Condividi</string>
<string name="mOpen_clipboard">Url copiato nella clipboard</string>
<string name="mOpen_clipboard">URL copiato negli appunti</string>
<string name="mOpen_noapps">Nessuna app</string>
<string name="mOpen_tabsDesc">Attiva/disattiva</string>
<string name="mStatus_name">Status code</string>
<string name="mStatus_desc">"Premendo il pulsante di check, una richiesta verrà inviata per recuperare lo status code del sito. Se il risultato è una re-indirizzazione, ti verrà mostrato l'url di destinazione.
Il contenuto viene recuperato (HEAD) ma non controllato, quindi re-indirizzamenti basati su javascript non verranno rilevati."</string>
Il contenuto viene recuperato (GET) ma non controllato, quindi re-indirizzamenti basati su javascript non verranno rilevati."</string>
<string name="mStatus_ioerror">"Errore di rete durante il controllo dell'url: %s"</string>
<string name="mStatus_error">"Errore interno durante il controllo dell'url: %s"</string>
<string name="mStatus_check">Controlla stato</string>
@ -139,14 +127,11 @@ Il contenuto viene recuperato (HEAD) ma non controllato, quindi re-indirizzament
</string-array>
<string name="mStatus_unknownCode">%d: Status code sconosciuto</string>
<string name="mStatus_redir">Re-indirizzazione: %s</string>
<string name="mInput_name">Modifica link</string>
<string name="mInput_desc">"Mostra l'url corrente, che può essere modificato manualmente."</string>
<string name="mVT_name">Url Scanner</string>
<string name="mVT_desc">"Quando questo modulo è abilitato puoi scansionare l'url utilizzando VirusTotal e visualizzare il report.
Una chiave API personale di VirusTotal è richiesta per il funzionamento, puoi crearne una qui dopo esserti registrato con un account gratuito: https://www.virustotal.com/gui/join-us."</string>
Una chiave API personale di VirusTotal è richiesta per il funzionamento, puoi crearne una qui dopo esserti registrato con un account gratuito: https://www.virustotal.com/gui/join-us ."</string>
<string name="mVT_apiKey">chiave api</string>
<string name="mVT_tm">VirusTotal™ è un trademark di Google, Inc.</string>
<string name="mVT_scan">Scansiona</string>
@ -163,12 +148,9 @@ Una chiave API personale di VirusTotal è richiesta per il funzionamento, puoi c
Se attivi questa funzione, verrà mostrato l'intent come uri, utile per sviluppatori.
Premi su Intent od UrlData per copiare nella clipboard. Tieni premuto per copiare tutto."</string>
<string name="mD_ctabs">Mostra i messaggi di debug dal serivzio di schede custom.</string>
<string name="mHist_name">Cronologia</string>
<string name="mHist_desc">"Quando l'url viene modificato, sia manualmente o da altri moduli, quest'ultimo ti permette di annullare le modifiche."</string>
<string name="mClear_name">Pulitore URL</string>
<string name="mClear_desc">Questo modulo rimuove parametri inutili e referrals. Inoltre permette una pulizia semplice quando offline.</string>
<string name="mClear_tm">Lista di default presa da ClearURLs: https://docs.clearurls.xyz/latest/specs/rules/</string>
@ -204,8 +186,6 @@ Premi su Intent od UrlData per copiare nella clipboard. Tieni premuto per copiar
<string name="mClear_restore">Ripristina percorsi ClearURLs</string>
<string name="mClear_editor">"Lista regole: Devono seguire il formato da https://docs.clearurls.xyz/latest/specs/rules/.
Tieni conto che qualsiasi modifica ai 'providers' verrà sovrscaritta se la lista viene aggiornata automaticamente o manualmente dalla finestra degli aggiornamenti. Per avere regole custom impostale in un parent object diverso."</string>
<string name="mRemove_name">Pulitore queries</string>
<string name="mRemove_desc">"Con questo modulo puoi rimuovere queries dall'URL.
Premi il pulsante per rimuoverle tutte o premi la freccia per rimuoverne una alla volta.
@ -216,7 +196,6 @@ Grazie a PabloOQ per l'idea originale!"</string>
<string name="mRemove_all">Rimuovi tutte</string>
<string name="mRemove_one">Rimuovi %s</string>
<string name="mRemove_empty">Rimuovi vuota</string>
<string name="mLog_name">Log</string>
<string name="mLog_desc">"Questo modulo logga tutti gli url controllati.
Puoi visualizzare, pulire o modificare l'intero log qui.
@ -224,7 +203,6 @@ Per disabilitare il logging, ti basta disabilitare il modulo."</string>
<string name="mLog_view">Visualizza log</string>
<string name="mLog_edit">Modifica log</string>
<string name="mLog_empty">Nessun dato</string>
<string name="mHosts_name">Categorie hosts</string>
<string name="mHosts_desc">"Questo modulo etichetta gli hosts, e può essere configurato manualmente od utilizzando un file remoto hosts-like.
Puoi utilizzarlo per generare avvertimenti riguardo siti pericolosi o speciali. La configurazione di default utilizza la lista hosts di StevenBlack (adware/malware, fakenews, scommesse e contenuto per adulti) da https://github.com/StevenBlack/hosts"</string>
@ -250,5 +228,28 @@ Per disabilitare il logging, ti basta disabilitare il modulo."</string>
<string name="mHosts_buildDownload">"Scaricando '%s' hosts da %s…"</string>
<string name="mHosts_buildSave">Salvando…</string>
<string name="mHosts_built">Database pronto: %d hosts</string>
</resources>
<string name="txt_tutorial1">Grazie per aver scaricato l\'applicazione!
\n
\nQuesto è il tutorial, se vuoi saltarlo puoi farlo con il pulsante qui sotto. Puoi sempre tornare a questo tutorial dal menu delle impostazioni.</string>
<string name="txt_tutorial4">I moduli sono il modo in cui l\'applicazione interagisce con gli URL.
\nOgni modulo ha una funzione specifica. Di solito per presentare informazioni sull\'URL o per consentirne la modifica.
\nLeggi i moduli e configurali secondo le necessità.
\n
\nImportante: tutte le azioni sono manuali per impostazione predefinita. L\'app non modificherà nulla né si collegherà a Internet a meno che tu non lo consenta espressamente, ma alcune azioni possono essere applicate automaticamente, se lo preferisci.
\n
\nApri l\'elenco dei moduli dalla schermata principale o toccando il pulsante sottostante.</string>
<string name="txt_tutorial5">Questo è tutto. Ecco alcuni suggerimenti che possono essere utili:
\n
\nQuando un\'app non consente di aprire o condividere un URL, ma offre un modo per fare l\'altro, è possibile risolvere il problema utilizzando questa app. Puoi anche copiare l\'URL negli appunti premendo a lungo il pulsante di condivisione.
\n
\nCi sono alcuni URL il cui unico scopo è reindirizzarti a un altro URL. Se l\'URL finale può essere aperto in un\'app, puoi evitare di aprirlo in un browser.
\n
\nSpero che l\'applicazione ti sia utile! E non esitare a suggerire funzionalità, segnalare bug o proporre modifiche. Trovi tutti i link pertinenti nella schermata delle informazioni.</string>
<string name="btn_tutorialSettings">Ripeti il tutorial</string>
<string name="tutorial">Tutorial</string>
<string name="txt_tutorial3">Imposta l\'app come browser web predefinito per intercettare gli URL all\'apertura.
\n(Non necessario se gli URL vengono reindirizzati utilizzando la funzionalità \"Condividi\".)</string>
<string name="btn_tutorialSkip">Salta il tutorial</string>
<string name="btn_tutorialEnd">Termina il tutorial</string>
<string name="shortcut_checkClipboard">Controlla gli URL dagli appunti</string>
</resources>

View File

@ -9,24 +9,20 @@
Locale name:
Write the locale name in the locale language, for users that doesn't know english. For example 'Español' instead of 'Spanish'-->
<string name="locale">עברית</string>
<!-- main -->
<string name="txt_info">אפליקציה זו פועלת כצעד ביניים לקראת פתיחת קישורי url. כאשר תלחץ על קישור ובחר באפליקציה זו כדי לפתוח אותה, היא תציג תיבת דו-שיח עם מידע על הקישור. לחץ על לחצן המודול למטה כדי לבדוק ולהגדיר את כל המודולים הזמינים.</string>
<string name="txt_sample">לחץ על הקישור למטה כדי לבדוק את זה:</string>
<string name="a_modules">מודולים</string>
<string name="a_about">על אודות</string>
<!-- about -->
<string name="txt_about">"אפליקציה שנוצרה על ידי TrianguloY.
תרומות: %s.
תרגומים: %s."</string>
<string name="link_blog">"הבלוג של TrianguloY"</string>
<!-- configuration -->
<string name="txt_conf">רשימת מודולים: אתה יכול להפעיל או לבטל אותם, גם לבדוק את התיאור והתצורה שלו.</string>
<string name="toast_cantEnable">"לא ניתן להפעיל את המודול, חסרה תצורה?"</string>
<string name="menu_resetOrder">אפס סדר</string>
<!-- generic -->
<string name="toast_noApp">"לא ניתן לפתוח את האפליקציה"</string>
<string name="toast_noBrowser">"לא מצליח לפתוח את הדפדפן"</string>
@ -35,11 +31,8 @@
<string name="save">להציל</string>
<string name="reset">איפוס</string>
<string name="share">שתף אפליקציה</string>
<string name="json_desc">[תכונת בטא] זהו עורך מתקדם, התוכן חייב להיות בפורמט ל-JSON חוקי. אתה יכול ללחוץ על הכפתור הימני העליון כדי לעצב ולאמת אותו.</string>
<string name="json_edit">עורך מתקדם</string>
<!-- modules -->
<string name="mPttrn_name">בודק דפוסים</string>
<string name="mPttrn_desc">"בודק בעיות נפוצות בכתובת האתר. דפוסים מובנים:
@ -59,7 +52,6 @@
- 'אוטומטי': בוליאני: מוגדר כ-true כדי להחיל את התבנית באופן אוטומטי.
- 'מופעל': בוליאני: הוגדר ל-false כדי להשבית את התבנית.
הערה: אם תערוך את התבניות, דפוסים מובנים חדשים מעידכוני אפליקציה לא יתווספו אוטומטית (תוכל לשחזר אותם עם אפשרות האיפוס)."</string>
<string name="mOpen_name"><![CDATA[Open & Share]]></string>
<string name="mOpen_desc">"מכיל את הכפתורים הבאים (משמאל לימין):
- לחצן כרטיסיות מותאמות אישית: החלף כדי להפעיל/לבטל את תכונת הכרטיסיות המותאמת אישית. כאשר מופעל הדפדפן צריך להיפתח במצב 'לייט'.
@ -70,11 +62,10 @@
<string name="mOpen_share">לַחֲלוֹק</string>
<string name="mOpen_clipboard">כתובת האתר הועתקה ללוח</string>
<string name="mOpen_noapps">אין אפליקציות</string>
<string name="mStatus_name">קוד סטטוס</string>
<string name="mStatus_desc">"בלחיצה על כפתור הסימון, תוגש עצומה לאחזור והצגת קוד סטטוס האתר.
אם התוצאה היא הפניה מחדש, תוכל לראות את כתובת אתר היעד.
תוכן ה-URL מתקבל (HEAD), אך לא מוערך, כך שהפניות מחדש המבוססות על javascript לא יזוהו.."</string>
תוכן ה-URL מתקבל (GET), אך לא מוערך, כך שהפניות מחדש המבוססות על javascript לא יזוהו.."</string>
<string name="mStatus_ioerror">שגיאת רשת בעת ניסיון לבדוק את כתובת האתר: %s</string>
<string name="mStatus_error">שגיאה פנימית בעת ניסיון לבדוק את כתובת האתר: %s</string>
<string name="mStatus_check">חשבון</string>
@ -99,13 +90,11 @@
</string-array>
<string name="mStatus_unknownCode">%d: קוד סטטוס לא ידוע</string>
<string name="mStatus_redir">הפניה מחדש: %s</string>
<string name="mInput_name">הקלד טקסט</string>
<string name="mInput_desc">"מציג את כתובת האתר הנוכחית, אותה ניתן לערוך באופן ידני."</string>
<string name="mVT_name">סורק כתובות אתרים</string>
<string name="mVT_desc">"כאשר מודול זה מופעל אתה יכול לסרוק את כתובת האתר באמצעות וירוס טוטאל ולבדוק את הדוח.
יש צורך במפתח API אישי של וירוס טוטאל כדי שזה יעבוד, אתה יכול לקבל אחד לאחר הרשמה לחשבון בחינם כאן: https://www.virustotal.com/gui/join-us."</string>
יש צורך במפתח API אישי של וירוס טוטאל כדי שזה יעבוד, אתה יכול לקבל אחד לאחר הרשמה לחשבון בחינם כאן: https://www.virustotal.com/gui/join-us ."</string>
<string name="mVT_apiKey">מפתח api</string>
<string name="mVT_tm">VirusTotal™ הוא סימן מסחרי של Google, Inc.</string>
<string name="mVT_scan">לִסְרוֹק</string>
@ -116,16 +105,13 @@
<string name="mVT_badUrl">זָהִיר! %d/%d מנועים זיהו את כתובת האתר (נכון לתאריך %s)</string>
<string name="mVT_connectError">"לא ניתן להתחבר ל-VirusTotal. ודא שיש לך חיבור אינטרנט פעיל או נסה שוב מאוחר יותר."</string>
<string name="mVT_jsonError">"לא ניתן להתחבר ל-VirusTotal. ודא שמפתח ה-API חוקי או נסה שוב מאוחר יותר."</string>
<string name="mD_name">מודול ניפוי באגים/סמן</string>
<string name="mD_desc">"אם תסדר מחדש את המודולים, חדשים שנוספו בעדכונים עתידיים יוצבו מעל זה.
אם תפעיל את זה, זה יציג את הכוונה שהתקבלה בתור uri, שימושי למפתחים."</string>
<string name="mD_ctabs">הצג הודעות ניפוי באגים משירות הכרטיסיות המותאמות אישית</string>
<string name="mHist_name">הִיסטוֹרִיָה</string>
<string name="mHist_desc">כאשר כתובת האתר נערכת, ידנית או על ידי מודולים אחרים, הכתובת הזו מאפשרת לך להציג שינויים ולבטל אותם.</string>
<string name="mClear_name">מנקה כתובות אתרים</string>
<string name="mClear_desc">מודול זה מסיר מעקב, מפנה ופרמטרים חסרי תועלת אחרים מכתובת האתר. זה גם מאפשר הפניות נפוצות של כתובות אתרים לא מקוונות.</string>
<string name="mClear_tm">קטלוג מובנה הועתק מכתובות ClearURL: https://docs.clearurls.xyz/latest/specs/rules/</string>
@ -158,7 +144,6 @@
<string name="mClear_restore">שחזר נתיבי ClearURLs</string>
<string name="mClear_editor">"כללי קטלוג: עליהם לפעול לפי הפורמט של https://docs.clearurls.xyz/latest/specs/rules/.
שים לב שכל שינוי באובייקט האב 'ספקי' ידרוס אם הקטלוג יתעדכן אוטומטית או ידנית מתיבת הדו-שיח של העדכון. כדי שהכללים האישיים יקבעו אותם באובייקט אב אחר (כל שם)."</string>
<string name="mRemove_name">מסיר שאילתות</string>
<string name="mRemove_desc">"עם מודול זה תוכל להסיר שאילתות מכתובת האתר.
לחץ על הלחצן כדי להסיר את כולם או לחץ על החץ כדי להסיר אחד בכל פעם.
@ -169,5 +154,4 @@
<string name="mRemove_all">להסיר את כל</string>
<string name="mRemove_one">הסר את %s</string>
<string name="mRemove_empty">הסר ריקים</string>
</resources>
</resources>

View File

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Translator(s) name:
If you create or update a translation, add how you want to be credited here.
@ -8,14 +9,12 @@
Locale name:
Write the locale name in the locale language, for users that doesn't know english. For example 'Español' instead of 'Spanish'-->
<string name="locale">日本語</string>
<!-- main -->
<string name="txt_info">このアプリは、URLリンクを開くための中間ステップとして機能します。リンクをクリックし、このアプリを選んで開くと、そのリンクに関する情報をダイアログで表示します。\n下のモジュールボタンを押すと、利用可能なすべてのモジュールを確認・設定することができます。</string>
<string name="txt_sample">以下のリンクをタップしてテストしてみてください。</string>
<string name="a_modules">モジュール</string>
<string name="a_settings">設定</string>
<string name="a_about">このアプリについて</string>
<!-- about -->
<string name="txt_about">"このアプリは TrianguloY によって開発されました。
@ -25,7 +24,6 @@
<string name="link_changelog">変更履歴</string>
<string name="link_source">ソースコード</string>
<string name="link_privacy">プライバシーポリシー</string>
<!-- modules -->
<string name="txt_conf">以下は、モジュールのリストです。これらは有効化・無効化、並び替えすることができ、タップすると、その説明と設定も確認できます。\nまた、タイトルの表示・非表示の切り替えも可能です。</string>
<string name="toast_cantEnable">モジュールを有効にできません。設定を忘れていませんか?</string>
@ -35,7 +33,6 @@
<string name="desc_down">下に移動</string>
<string name="desc_decorations">モジュール名の表示・非表示を切り替え</string>
<string name="desc_enable">モジュールの有効・無効の切り替え</string>
<!-- settings -->
<string name="txt_openLinks">このアプリで外部リンクを開くように設定してください。\n設定方法は、Androidのバージョンによって異なります。\n以下の設定をお試しください。</string>
<string name="btn_setBrowser">デフォルトのアプリとして設定する</string>
@ -47,7 +44,6 @@
<string name="spin_darkTheme">ダーク</string>
<string name="spin_lightTheme">ライト</string>
<string name="txt_locale">言語:</string>
<!-- generic -->
<string name="toast_noApp">アプリを開けません</string>
<string name="toast_noBrowser">ブラウザを開けません</string>
@ -61,12 +57,8 @@
<string name="share">このアプリを友達に自慢する</string>
<string name="canceled">キャンセルされました</string>
<string name="deviceDefault">デバイスの設定に従う</string>
<string name="json_desc">[ベータ機能] これは上級者向けのエディタです。内容は有効な JSON にフォーマットされている必要があります。右上のボタンをタップすると、フォーマット・検証ができます。</string>
<string name="json_edit">上級者向けエディタ</string>
<!-- modules -->
<string name="mPttrn_name">パターンチェッカー</string>
<string name="mPttrn_desc">"正規表現パターンで URL をチェックし、警告・提案・置換をします。パターンは変更したり、独自に作成したり、あるいは他のユーザーが作成したものを使用することもできます。
@ -88,17 +80,16 @@
- 'automatic': ブール値: true に設定すると、パターンが自動的に適用されます。
- 'enabled': ブール値: パターンを無効にするには false に設定します。
注: パターンを編集した場合、アプリの更新による新しい組み込みパターンは自動的に追加されません (リセットオプションで復元できます)。"</string>
<string name="mOpen_name"><![CDATA[開く・共有する]]></string>
<string name="mOpen_desc">"次のボタンが含まれています (左から右へ):
- 「カスタムタブ」ボタン: カスタムタブ機能を有効化/無効化します。有効にすると、ブラウザは「ライト」モードで開かれます。
- 「開く」ボタン: アプリ名を押すと、そのアプリのリンクが開きます。複数のアプリでリンクを開くことができる場合は、選択できるように矢印が表示されます。
- 共有ボタン: ボタンを押してリンクを共有します。長押しすると、クリップボードにすばやくコピーできます。\nこのモジュールを無効にすることはできません。"</string>
<string name="mOpen_ctabs">カスタムタブ:</string>
<string name="mOpen_ctabsOn">デフォルトで有効</string>
<string name="mOpen_ctabsOff">デフォルトで無効</string>
<string name="mOpen_ctabsEn">常にオン</string>
<string name="mOpen_ctabsDis">常にオフ</string>
<string name="defaultOn">デフォルトで有効</string>
<string name="defaultOff">デフォルトで無効</string>
<string name="alwaysOn">常にオン</string>
<string name="alwaysOff">常にオフ</string>
<string name="mOpen_closeOpen">開いた後にダイアログを閉じる</string>
<string name="mOpen_closeShare">共有後にダイアログを閉じる</string>
<string name="mOpen_perDomain">異なるドメインを個別にソートする</string>
@ -109,11 +100,10 @@
<string name="mOpen_clipboard">URLをクリップボードにコピーしました。</string>
<string name="mOpen_noapps">アプリがありません</string>
<string name="mOpen_tabsDesc">カスタムタブ機能の有効化・無効化を切り替えます</string>
<string name="mStatus_name">ステータス コード</string>
<string name="mStatus_desc">"チェックボタンを押すと、サイトのステータスコードを取得し表示します。
結果がリダイレクトの場合は、リダイレクト先URLが表示されます。
URLコンテンツは取得 (HEAD) されますが、JavaScript によるリダイレ​​クトは評価されないため、検出されません。"</string>
URLコンテンツは取得 (GET) されますが、JavaScript によるリダイレ​​クトは評価されないため、検出されません。"</string>
<string name="mStatus_ioerror">URLの確認中にネットワークエラーが発生しました: %s</string>
<string name="mStatus_error">URLのチェック中に内部エラーが発生しました: %s</string>
<string name="mStatus_check">ステータスコードを確認</string>
@ -138,10 +128,8 @@ URLコンテンツは取得 (HEAD) されますが、JavaScript によるリダ
</string-array>
<string name="mStatus_unknownCode">%d: 不明なステータスコードです</string>
<string name="mStatus_redir">リダイレクト: %s</string>
<string name="mInput_name">URLの表示</string>
<string name="mInput_desc">手動で編集できる現在のURLを表示します。</string>
<string name="mVT_name">URL スキャナー</string>
<string name="mVT_desc">"このモジュールを有効にすると、VirusTotal を使用してURLをスキャンし、レポートを確認できます。
これが機能するには、個人用の VirusTotal API キーが必要です。https://www.virustotal.com/gui/join-us\nで無料アカウントに登録した後に取得できます。"</string>
@ -155,7 +143,6 @@ URLコンテンツは取得 (HEAD) されますが、JavaScript によるリダ
<string name="mVT_badUrl">注意! %dつのエンジンの内 %dつがURLを検出しました (%s 時点データ)</string>
<string name="mVT_connectError">VirusTotal に接続できません。インターネット接続が有効であることを確認するか、後でもう一度試してください。</string>
<string name="mVT_jsonError">VirusTotal に接続できません。APIキーが有効であることを確認するか、後でもう一度試してください。</string>
<string name="mD_name">デバッグ/マーカー モジュール</string>
<string name="mD_desc">"モジュールの順序を変更すると、将来のアップデートで追加される新しいモジュールがこのモジュールの上に配置されます。
@ -163,10 +150,8 @@ URLコンテンツは取得 (HEAD) されますが、JavaScript によるリダ
Intent または URLData をタップすると、クリップボードにコピーされます。長押しすると全てコピーできます。"</string>
<string name="mD_ctabs">カスタムタブ サービスからのデバッグメッセージを表示する</string>
<string name="mHist_name">履歴</string>
<string name="mHist_desc">手動または他のモジュールによってURLが編集されると、このモジュールを使用して変更を表示および元に戻すことができます。</string>
<string name="mClear_name">URL クリーナー</string>
<string name="mClear_desc">このモジュールは、トラッキング、リファラル、およびその他の不要なパラメーターをURLから削除します。また、一般的なURLリダイレクトは、オフラインでも可能です。</string>
<string name="mClear_tm">ClearURLs からコピーされた組み込みカタログ:\nhttps://docs.clearurls.xyz/latest/specs/rules/</string>
@ -202,7 +187,6 @@ Intent または URLData をタップすると、クリップボードにコピ
<string name="mClear_restore">URLをリセット</string>
<string name="mClear_editor">"パターンデータの形式は\nhttps://docs.clearurls.xyz/latest/specs/rules/ \nの形式に従う必要があります。
- カタログが自動または手動で更新された場合、親オブジェクト「providers」への変更はすべて上書きされることに注意してください。手動でルールを設定するには、別の親オブジェクト任意の名前に設定してください。"</string>
<string name="mRemove_name">クエリの削除</string>
<string name="mRemove_desc">"このモジュールを使用すると、URLからクエリを削除できます。
ボタンを押すとすべて削除され、矢印を押すと2つずつ削除されます。
@ -213,7 +197,6 @@ PabloOQさんのアイデアとはじめの実装に感謝します!"</string>
<string name="mRemove_all">すべて削除</string>
<string name="mRemove_one">%s を削除</string>
<string name="mRemove_empty">空のクエリを削除</string>
<string name="mLog_name">ログ</string>
<string name="mLog_desc">"このモジュールは、チェックされたすべてのURLをログに記録します。
ここで完全なログを表示、消去、または編集できます。メインダイアログには視覚的な表示はありません。
@ -221,7 +204,6 @@ PabloOQさんのアイデアとはじめの実装に感謝します!"</string>
<string name="mLog_view">ログを表示</string>
<string name="mLog_edit">ログを編集</string>
<string name="mLog_empty">ログはありません</string>
<string name="mHosts_name">ホスト ラベラー</string>
<string name="mHosts_desc">このモジュールは、手動で指定するか、リモートホストのようなファイルを使って設定されたホストにラベル付けします。危険なサイトや特殊なサイトについて警告するために使用することができます。\nデフォルトの設定では、StevenBlack のホスト (アドウェア/マルウェア、fakenews、ギャンブル、アダルトコンテンツ) を https://github.com/StevenBlack/hosts から取得します。</string>
<string name="mHosts_malware">アドウェア/マルウェア</string>
@ -247,5 +229,4 @@ PabloOQさんのアイデアとはじめの実装に感謝します!"</string>
<string name="mHosts_buildDownload">"%s個のホストを %s からダウンロード中…"</string>
<string name="mHosts_buildSave">保存中…</string>
<string name="mHosts_built">データベースが作成されました: %d個のホスト</string>
</resources>
</resources>

View File

@ -33,7 +33,7 @@
<string name="mPttrn_ascii">Advarsel! Fant ikke-ASCII -tegn.</string>
<string name="mPttrn_ok">Ingen samsvarende mønster</string>
<string name="mOpen_ctabs">Egendefinerte faner:</string>
<string name="mOpen_ctabsOn">Påskrudd som forvalg</string>
<string name="defaultOn">Påskrudd som forvalg</string>
<string name="mOpen_closeOpen">Lukk dialog etter åpning</string>
<string name="mOpen_closeShare">Lukk dialog etter deling</string>
<string name="mOpen_perDomain">Sorter forskjellige domener for seg</string>
@ -103,9 +103,9 @@
<string name="mClear_name">URL-renser</string>
<string name="mStatus_name">Statuskode</string>
<string name="mClear_matches">Samsvarer med %s</string>
<string name="mOpen_ctabsOff">Avskrudd som forvalg</string>
<string name="mOpen_ctabsDis">Alltid avslått</string>
<string name="mOpen_ctabsEn">Alltid påslått</string>
<string name="defaultOff">Avskrudd som forvalg</string>
<string name="alwaysOff">Alltid avslått</string>
<string name="alwaysOn">Alltid påslått</string>
<string name="mOpen_open">Åpne</string>
<string name="mOpen_share">Del</string>
<string name="mClear_urlHint">Katalog-nettadresse</string>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="link_privacy">ଗୋପନୀୟତା ନୀତି</string>
<string name="spin_darkTheme">ଗାଢ଼</string>
<string name="tutorial">ଅନୁଶିକ୍ଷଣ</string>
<string name="defaultOff">ଡିଫଲ୍ଟ ଭାଵରେ ଅକ୍ଷମ</string>
<string name="alwaysOn">ସର୍ଵଦା ଚାଲୁ</string>
<string name="alwaysOff">ସର୍ଵଦା ବନ୍ଦ</string>
<string name="mStatus_recheck">ଯାଞ୍ଚ କର</string>
<string name="a_settings">ସେଟିଂ</string>
<string name="a_about">ଵିଷୟରେ</string>
<string name="txt_theme">ଥିମ୍:</string>
<string name="spin_lightTheme">ହାଲୁକା</string>
<string name="auto">ସ୍ୱଚାଳିତ</string>
<string name="deviceDefault">ଡିଵାଇସ୍ ଡିଫଲ୍ଟ</string>
<string name="toast_invalid">ଅଵୈଧ</string>
<string name="mStatus_checking">ଯାଞ୍ଚ ଚାଲିଛି…</string>
<string name="mStatus_check">ସ୍ଥିତି ଯାଞ୍ଚ</string>
<string name="mHist_name">ଇତିଵୃତ୍ତି</string>
<string name="mClear_updateNow">ଏବେ ଅଦ୍ୟତନ କରିବା</string>
<string name="mClear_autoUpdate">ସମୟ ସମୟରେ ଅଦ୍ୟତନ କରିବା</string>
<string name="mClear_lastCheck">ଗତ ଯାଞ୍ଚ:</string>
<string name="mClear_lastUpdate">ଗତ ଅଦ୍ୟତନ:</string>
<string name="defaultOn">ଡିଫଲ୍ଟ ଭାଵରେ ସକ୍ଷମ</string>
</resources>

View File

@ -7,9 +7,8 @@
<string name="tutorial">Tutorial</string>
<string name="canceled">Cancelado</string>
<string name="next">Próximo</string>
<string name="add">Adicionar</string>
<string name="json_edit">Editor avançado</string>
<string name="mOpen_ctabsOff">Desabilitado por padrão</string>
<string name="defaultOff">Desabilitado por padrão</string>
<string name="mClear_clear">Aplicar</string>
<string name="mLog_empty">Sem dados</string>
<string name="btn_tutorialSkip">Pular tutorial</string>
@ -38,7 +37,7 @@
<string name="btn_setBrowser">Definir como navegador padrão</string>
<string name="save">Salvar</string>
<string name="back">Voltar</string>
<string name="mOpen_ctabsEn">Sempre ligado</string>
<string name="alwaysOn">Sempre ligado</string>
<string name="desc_decorations">Exibir/ocultar título</string>
<string name="desc_up">Mover para cima</string>
<string name="reset">Redefinir</string>
@ -47,9 +46,7 @@
<string name="auto">Automático</string>
<string name="mHist_name">Histórico</string>
<string name="mLog_name">Log</string>
<string name="remove">Remover</string>
<string name="edit">Editar</string>
<string name="mOpen_ctabsDis">Sempre desligado</string>
<string name="alwaysOff">Sempre desligado</string>
<string name="mOpen_with">Abrir com %s</string>
<string name="mOpen_open">Abrir</string>
<string name="mStatus_check">Verificar status</string>
@ -72,9 +69,17 @@
<string name="toast_noApp">Não foi possível abrir o aplicativo</string>
<string name="toast_noBrowser">Não foi possível abrir o navegador web</string>
<string name="mOpen_name">Abrir e compartilhar</string>
<string name="mOpen_ctabsOn">Habilitado por padrão</string>
<string name="defaultOn">Habilitado por padrão</string>
<string name="mVT_apiKey">Chave de API</string>
<string name="btn_androidSettings">Configurações Android do aplicativo</string>
<string name="txt_locale">Localização:</string>
<string name="btn_linksSettings">Abrir links suportados</string>
<string name="txt_sample">Clique no link abaixo para testá-lo:</string>
<string name="mStatus_name">Códigos de status</string>
<string name="mPttrn_fixed">Aplicado - %s</string>
<string name="mVT_connectError">Não foi possível conectar-se ao VirusTotal. Verifique se você está conectado à Internet ou tente novamente mais tarde.</string>
<string name="mVT_jsonError">Não foi possível conectar-se ao VirusTotal. Verifique se a chave de API é válida ou tente novamente mais tarde.</string>
<string name="mUnshort_error">Erro de servidor: %s</string>
<string name="mUnshort_checking">Verificando…</string>
<string name="mUnshort_internal">Erro interno (%s)</string>
</resources>

View File

@ -97,10 +97,10 @@ Nota: se editar os padrões, novos padrões integrados de atualizações de apli
- Botão Abrir: Pressione o nome do aplicativo para abrir o link nesse aplicativo. Se um link puder ser aberto com vários aplicativos, uma seta será exibida para permitir que escolha.
- Botão Compartilhar: Pressione o botão para compartilhar o link. Pressione e segure para copiar rapidamente para a área de transferência."</string>
<string name="mOpen_ctabs">Abas personalizadas:</string>
<string name="mOpen_ctabsOn">Ativado por padrão</string>
<string name="mOpen_ctabsOff">Desativado por padrão</string>
<string name="mOpen_ctabsEn">Sempre ativado</string>
<string name="mOpen_ctabsDis">Sempre desativado</string>
<string name="defaultOn">Ativado por padrão</string>
<string name="defaultOff">Desativado por padrão</string>
<string name="alwaysOn">Sempre ativado</string>
<string name="alwaysOff">Sempre desativado</string>
<string name="mOpen_with">Abrir com %s</string>
<string name="mOpen_open">Abrir</string>
<string name="mOpen_share">Partilhar</string>
@ -111,7 +111,7 @@ Nota: se editar os padrões, novos padrões integrados de atualizações de apli
<string name="mStatus_name">Código de status</string>
<string name="mStatus_desc">"Ao pressionar o botão de verificação, será feita uma petição para recuperar e exibir o código de status do site.
Se o resultado for um redirecionamento, poderá visualizar o URL de destino.
O conteúdo da url é obtido (HEAD), mas não avaliado, então redirecionamentos baseados em javascript não serão detectados."</string>
O conteúdo da url é obtido (GET), mas não avaliado, então redirecionamentos baseados em javascript não serão detectados."</string>
<string name="mStatus_ioerror">Erro de rede ao tentar verificar o URL: %s</string>
<string name="mStatus_error">Erro interno ao tentar verificar a url: %s</string>
<string name="mStatus_check">Verificar</string>
@ -141,7 +141,7 @@ O conteúdo da url é obtido (HEAD), mas não avaliado, então redirecionamentos
<string name="mInput_desc">Exibe o URL atual, que pode ser editado manualmente.</string>
<!-- -->
<string name="mVT_name">VirusTotal</string>
<string name="mVT_desc">Quando este módulo está ativado, pode verificar o URL usando o VirusTotal e verificar o relatório.\nÉ necessária uma chave de API pessoal do VirusTotal para que funcione, pode obter uma após se registrar para uma conta gratuita aqui: https://www.virustotal.com/gui/join-us.</string>
<string name="mVT_desc">Quando este módulo está ativado, pode verificar o URL usando o VirusTotal e verificar o relatório.\nÉ necessária uma chave de API pessoal do VirusTotal para que funcione, pode obter uma após se registrar para uma conta gratuita aqui: https://www.virustotal.com/gui/join-us .</string>
<string name="mVT_apiKey">api key</string>
<string name="mVT_tm">VirusTotal™ é uma marca comercial da Google, Inc.</string>
<string name="mVT_scan">Examinar</string>

View File

@ -29,4 +29,81 @@
\n
\nAcesta este tutorialul, dacă vrei să-l sări, o poți face cu butonul de mai jos. Puteți reveni oricând la acest tutorial din meniul de setări.</string>
<string name="tutorial">Tutorial</string>
<string name="mClear_rule">- parametru inutil găsit</string>
<string name="mClear_forcedRedirection">- redirecționare forțată găsită</string>
<string name="mClear_redirection">- redirecționare găsită</string>
<string name="mClear_auto">Aplicare automată</string>
<string name="mClear_error">Nu s-a putut verifica regula</string>
<string name="mClear_sourceDesc">Adresa URL a catalogului de fișiere JSON cu regulile:</string>
<string name="mClear_urlHint">Catalog URL</string>
<string name="mClear_hashHint">Fără verificare hash</string>
<string name="mClear_updateNow">Actualizează acum</string>
<string name="mClear_autoUpdate">Actualizarea periodică</string>
<string name="mClear_lastCheck">Ultima verificare:</string>
<string name="mClear_lastUpdate">Ultima actualizare:</string>
<string name="mClear_updated">Catalog actualizat</string>
<string name="mClear_upToDate">Catalog actualizat</string>
<string name="mClear_urlError">Nu se pot prelua regulile, asigurați-vă că adresa URL este validă și că aveți o conexiune activă</string>
<string name="mClear_hashError">Nu se poate prelua hash-ul, asigurați-vă că adresa URL este validă și că aveți o conexiune activă</string>
<string name="mClear_restore">Restaurarea traseelor ClearURLs</string>
<string name="mRemove_found">%d interogări găsite</string>
<string name="mPttrn_editor">Aici puteți edita sau adăuga un model nou. Format: - „regex”: șir: un regex java valid care trebuie să se potrivească pentru ca întregul model să se potrivească. - „excludeRegex”: șir: dacă este furnizat, o expresie regex java validă care nu trebuie să se potrivească pentru ca întregul model să se potrivească. - „înlocuire”: șir|listă: dacă este furnizat, butonul „remediare” va rula „url=url.replaceAll(regex,replacement)”. Dacă este listă, înlocuirea va fi un element aleatoriu din ea. - \'automatic\': boolean: setat la true pentru a aplica automat modelul. - \'activat\': boolean: setat la false pentru a dezactiva modelul. Notă: dacă editați modelele, modelele noi încorporate din actualizările aplicației nu vor fi adăugate automat (le puteți restaura cu opțiunea de resetare).</string>
<string name="txt_tutorial5">Asta e tot. Iată câteva sfaturi care pot fi utile:
\n
\nAtunci când o aplicație nu vă oferă o modalitate de a deschide sau de a partaja un URL, dar vă oferă o modalitate de a face celălalt, puteți rezolva problema folosind această aplicație. De asemenea, puteți copia url-ul în clipboard apăsând lung butonul de partajare.
\n
\nExistă unele URL-uri care scopul său numai este redirecționarea vă la un alt URL- ul. Dacă url-ul final poate fi deschis într-o aplicație, atunci puteți evita deschiderea acestuia într-un browser.
\n
\nSper că veți găsi aplicația utilă! Și nu ezitați să sugerați caracteristici, să raportați bug-uri sau chiar să propuneți modificări. Găsiți toate linkurile relevante pe ecranul despre.</string>
<string name="txt_tutorial4">Modulele reprezintă modul în care aplicația interacționează cu adresele URL.
\nFiecare dintre module are o funcție specifică. De obicei, pentru a prezenta informații despre URL-ul, sau permițându-i să fie modificate.
\nCitiți despre ele și configurați-le după cum este necesar.
\n
\nImportant: Toate acțiunile sunt manuale în mod implicit. Aplicația nu va modifica nimic și nici nu se va conecta la Internet decât dacă o permiteți în mod specific, dar unele acțiuni pot fi aplicate automat dacă doriți.
\n
\nDeschideți lista de module din ecranul principal sau atingând butonul de mai jos.</string>
<string name="mClear_blocked">-BLOCAT!</string>
<string name="mClear_exception">- ignorat din cauza excepției %s</string>
<string name="mClear_rawRule">- conținut inutil găsit</string>
<string name="mClear_hashDesc">URL-ul fișierului hash de catalog. Dacă este omisă, descărcarea nu va fi verificată pentru a vedea dacă a fost manipulată/modificat (nu este recomandat)</string>
<string name="mClear_hashMismatch">Hashurile nu se potrivesc, este posibil ca fișierul să fi fost modificat. Dacă doriți să omiteți verificarea, eliminați adresa URL hash</string>
<string name="mClear_editor">Reguli de catalog: trebuie să respecte formatul de la https://docs.clearurls.xyz/latest/specs/rules/. Rețineți că orice modificare a obiectului părinte „furnizori” va fi suprascrisă dacă catalogul este actualizat automat sau manual din dialogul de actualizare. Pentru ca regulile personale să le seteze într-un obiect părinte diferit (orice nume).</string>
<string name="mRemove_desc">[DEPRECAT] Cu acest modul puteți elimina interogări de la adresa URL. Apăsați butonul pentru a le elimina pe toate sau apăsați pe săgeată pentru a le elimina pe rând. Mulțumim lui PabloOQ pentru idee și implementare originală!
\n
\nAcest modul a fost depreciat în favoarea modulului „Uri parts”.</string>
<string name="desc_decorations">Afișează/ascunde titlul</string>
<string name="desc_enable">Activarea/dezactivarea modulului</string>
<string name="btn_tutorialSettings">Repetarea tutorial-ul</string>
<string name="btn_tutorialSkip">Săriți peste tutorial</string>
<string name="btn_tutorialEnd">Termină tutorial-ul</string>
<string name="toast_noApp">Nu se poate deschide aplicația</string>
<string name="toast_noBrowser">Nu se poate deschide browser-ul web</string>
<string name="title_choose">Alegeți aplicația</string>
<string name="toast_invalid">Invalid</string>
<string name="save">Salvează</string>
<string name="reset">Resetare</string>
<string name="close">Închide</string>
<string name="clear">Șterge</string>
<string name="auto">Automat</string>
<string name="share">Partajați</string>
<string name="canceled">Anulat</string>
<string name="deviceDefault">Dispozitiv implicit</string>
<string name="next">Următor</string>
<string name="back">Înainte</string>
<string name="json_desc">[Funcția beta] Acesta este un editor avansat, conținutul trebuie formatat în JSON valid. Puteți apăsa butonul din dreapta sus pentru a-l formata și valida.</string>
<string name="json_edit">Editor avansat</string>
<string name="mPttrn_desc">Acest modul verifică adresa URL cu modele regexp care avertizează, sugerează sau aplică înlocuiri. Puteți modifica sau crea propriile modele sau chiar să le utilizați pe cele create de utilizator. Modelele încorporate includ: - Avertizare când conține caractere non-ascii, cum ar fi literele grecești. Acesta poate fi folosit pentru phishing: googĺe.com vs google.com - Sugerați înlocuirea „http” cu „https” - Sugerați înlocuirea Youtube, Reddit sau Twitter cu alternative care să favorizeze confidențialitatea [dezactivate în mod implicit]</string>
<string name="mPttrn_fix">Aplică</string>
<string name="mPttrn_fixed">Aplicat - %s</string>
<string name="mPttrn_ascii">Atenție! S-au găsit caractere non-ASCII.</string>
<string name="mPttrn_http">Link HTTP. Luați în considerare utilizarea HTTPS.</string>
<string name="mPttrn_noSchemeHttp">Lipsește schema HTTP.</string>
<string name="mPttrn_noSchemeHttps">Lipsește schema HTTPS.</string>
<string name="mOpen_name">Deschideți și partajați</string>
<string name="mClear_tm">Catalogul încorporat copiat de la ClearURLs: https://docs.clearurls.xyz/latest/specs/rules/</string>
<string name="mClear_desc">Acest modul elimină urmărirea, referințele și alți parametri inutili din URL. De asemenea, permite redirecționări URL offline obișnuite.</string>
<string name="mClear_clear">Aplică</string>
<string name="mClear_matches">Potriviri %s</string>
<string name="mLog_name">Jurnal</string>
<string name="mLog_desc">Acest modul înregistrează toate adresele URL verificate. Puteți vizualiza, șterge sau edita jurnalul complet aici, nicio indicație vizuală nu va apărea în dialogul principal. Pentru a dezactiva înregistrarea, trebuie doar să dezactivați modulul.</string>
</resources>

View File

@ -4,7 +4,7 @@
If you create or update a translation, add how you want to be credited here.
For multiple translators, separate them by semicolon.
Example: <string name="translators">John Doe; Jane Doe</string> -->
<string name="translators">Metezd</string>
<string name="translators">Metezd;symbuzzer</string>
<!--
Locale name:
Write the locale name in the locale language, for users that doesn't know english. For example 'Español' instead of 'Spanish'-->
@ -15,21 +15,70 @@
<string name="txt_info">Bu uygulama bağlantıları açmak için bir tür ara adım görevi görür. Bir bağlantıya tıkladığınızda ve onu açmak için bu uygulamayı seçtiğinizde, bağlantı hakkında bazı bilgiler içeren bir iletişim kutusu gösterecektir. Mevcut bileşenleri ve ne yaptıklarını görmek için aşağıdaki düğmeye tıklayın.</string>
<string name="txt_sample">Test etmek için aşağıdaki linke tıklayın:</string>
<string name="a_modules">Bileşenler</string>
<string name="a_settings">Ayarlar</string>
<string name="a_about">Hakkında</string>
<!--
about
-->
<string name="txt_about">"Uygulama TrianguloY tarafından geliştirilmiştir.
Contributions: %s.
Translations: %s."</string>
Geliştiriciler: %s.
Çeviriler: %s."</string>
<string name="link_blog">TrianguloY\'un blog sayfası</string>
<string name="link_changelog">Değişiklikler</string>
<string name="link_source">Kaynak kodu</string>
<string name="link_privacy">Gizlilik politikası</string>
<!--
configuration
-->
<string name="txt_conf">Bileşenlerin listesi: Bunları etkinleştirebilir veya devre dışı bırakabilir, ayrıca açıklamasını ve yapılandırmasını inceleyebilirsiniz.</string>
<string name="toast_cantEnable">Bileşen etkinleştirilemiyor, eksik yapılandırma olabilir mi?</string>
<string name="menu_resetOrder">Düzeni Sıfırla</string>
<string name="menu_toggleDecorations">Bütün başlıkları</string>
<string name="desc_up">Yukarı taşı</string>
<string name="desc_down">Aşağı taşı</string>
<string name="desc_decorations">Başlığı göster/gizle</string>
<string name="desc_enable">Modülü aç/kapat</string>
<!--
settings
-->
<string name="txt_openLinks">Bağlantıları bu uygulamada açma: Yıllar geçtikçe Android onu yapılandırma şeklini değiştirdi ve sürümler arasında farklılıklar var. Aşağıda cihazınız için mevcut tüm ayarları bulun, bağlantılar halen bu uygulamada açılmıyorsa hepsini deneyin.</string>
<string name="btn_setBrowser">Varsayılan tarayıcı olarak ayarla</string>
<string name="toast_defaultSet">Bu uygulama artık varsayılan web tarayıcı</string>
<string name="btn_configureBrowser">Varsayılan web tarayıcı</string>
<string name="btn_linksSettings">Desteklenen linkleri aç</string>
<string name="btn_androidSettings">Android uygulama ayarları</string>
<string name="txt_theme">Tema:</string>
<string name="spin_darkTheme">Karanlık</string>
<string name="spin_lightTheme">Aydınlık</string>
<string name="txt_locale">Yerel:</string>
<string name="btn_tutorialSettings">Öğreticiyi tekrarla</string>
<!--
tutorial
-->
<string name="tutorial">Öğretici</string>
<string name="txt_tutorial1">"Uygylamayı indirdiğiniz için teşekkürler!
Bu öğreticiyi aşağıdaki butonu kullanarak atlayabilirsiniz. Bu öğreticiye istediğiniz zaman ayarlar menüsünden geri dönebilirsiniz."</string>
<string name="txt_tutorial2">Uygulama, url bağlantılarını açarken veya paylaşırken aracı görevi görür. Uygulamaya bir url gönderildiğinde, modüller aracılığıyla onunla etkileşim kurabilirsiniz. Bundan sonra bağlantıyı (istediğiniz uygulamada) açabilir, paylaşabilir veya panoya kopyalayabilirsiniz.</string>
<string name="txt_tutorial3">Uygulamayı, URL\'leri açarken engellemek için varsayılan web tarayıcısı olarak ayarlayın.
\n(“Paylaş” işlevi kullanılarak URL\'ler yeniden yönlendiriliyorsa gerekli değildir.)</string>
<string name="txt_tutorial4">Modüller, uygulamanın URL\'lerle nasıl etkileşime girdiğine ilişkindir.
\nModüllerin her birinin belirli bir işlevi vardır. Genellikle URL hakkında bilgi sunmak veya değiştirilmesine izin vermek için kullanılır.
\nOnlar hakkında bilgi edinin ve gerektiği gibi ayarlayın.
\n
\nÖnemli: Varsayılan olarak tüm eylemler manueldir. Özellikle izin vermediğiniz sürece uygulama hiçbir şeyi değiştirmeyecek veya İnternet\'e bağlanmayacaktır, ancak istenirse bazı işlemler otomatik olarak uygulanabilir.
\n
\nAna ekrandan veya aşağıdaki butona dokunarak modül listesini açın.</string>
<string name="txt_tutorial5">"Hepsi bu kadar. Yararlı olabilecek bazı ipuçları:
Bir uygulama size bir url'yi açma veya paylaşma yolu sunmuyorsa, ancak diğerini yapmanız için bir yol veriyorsa, bu uygulamayı kullanarak sorunu çözebilirsiniz. Ayrıca, paylaş butonuna uzun basarak URL'yi panoya kopyalayabilirsiniz.
Tek amacı sizi başka bir url'ye yönlendirmek olan bazı url'ler vardır. Nihai url bir uygulamada açılabiliyorsa, onu bir tarayıcıda açmaktan kaçınabilirsiniz.
Umarım uygulamayı yararlı bulursunuz! Ve özellikler önermekten, hataları bildirmekten ve hatta değişiklik önermekten çekinmeyin. Hakkında ekranında ilgili tüm bağlantıları bulabilirsiniz."</string>
<string name="btn_tutorialSkip">Öğreticiyi geç</string>
<string name="btn_tutorialEnd">Öğreticiyi bitir</string>
<!--
generic
-->
@ -39,28 +88,69 @@ Translations: %s."</string>
<string name="toast_invalid">Geçersiz</string>
<string name="save">Kaydet</string>
<string name="reset">Sıfırla</string>
<string name="share">Uygulamayı Paylaş</string>
<string name="close">Kapat</string>
<string name="clear">Temizle</string>
<string name="none">Hiçbiri</string>
<string name="auto">Otomatik</string>
<string name="share">Paylaş</string>
<string name="canceled">İptal edildi</string>
<string name="deviceDefault">Cihaz varsayılanı</string>
<string name="next">Sonraki</string>
<string name="back">Geri</string>
<!--
json
-->
<string name="json_desc">[Beta özelliği] Bu gelişmiş bir düzenleyicidir, içerik geçerli JSON olarak biçimlendirilmelidir. Biçimlendirmek ve doğrulamak için sağ üstteki butona basabilirsiniz.</string>
<string name="json_edit">Gelişmiş düzenleyici</string>
<!--
shortcuts
-->
<string name="shortcut_checkClipboard">Kopyalanan URL\'leri kontrol et</string>
<!--
modules
-->
<string name="mPttrn_name">Kalıp denetleyicisi</string>
<string name="mPttrn_desc">"URL\'deki yaygın sorunları kontrol eder:
* Yunan harfleri gibi ascii olmayan karakterler. Bu kimlik avı için kullanılabilir: googĺe.com vs google.com
* http bağlantıları, bunun yerine https kullanmalısınız"</string>
<string name="mPttrn_desc">"Bu modül, değiştirmeleri uyaran, öneren veya uygulayan normal ifade kalıplarıyla url'yi kontrol eder. Kendi kalıplarınızı değiştirebilir veya oluşturabilir, hatta kullanıcılar tarafından oluşturulanları kullanabilirsiniz.
Dahili modeller şunları içerir:
- Yunan harfleri gibi ascii olmayan karakterler içerdiğinde uyarı. Bu, kimlik avı için kullanılabilir: googĺe.com vs google.com
- 'http'nin 'https' ile değiştirilmesini öner
- Youtube, Reddit veya Twitter'ı gizlilik dostu alternatiflerle değiştirmeyi öner [varsayılan olarak devre dışıdır]"</string>
<string name="mPttrn_userContent">Kullanıcılar tarafından oluşturulan diğer faydalı modellerin listesi: %s</string>
<string name="mPttrn_fix">Uygula</string>
<string name="mPttrn_fixed">Uygulandı - %s</string>
<string name="mPttrn_ascii">Uyarı! Ascii dışı karakter bulundu</string>
<string name="mPttrn_http">HTTP bağlantısı. HTTPS kullanmayı unutmayın.</string>
<string name="mPttrn_ok">Herhangi bir sorun bulunamadı</string>
<string name="mPttrn_noSchemeHttp">Eksik HTTP şeması.</string>
<string name="mPttrn_noSchemeHttps">Eksik HTTPS şeması.</string>
<string name="mPttrn_ok">Eşleşen kalıp yok</string>
<string name="mPttrn_editor">"Burada yeni kalıpları düzenleyebilir veya ekleyebilirsiniz. Biçim:
- 'regex': string: tüm kalıbın eşleşmesi için eşleşmesi gereken geçerli bir java regex'i.
- 'excludeRegex': string: sağlanırsa, tüm kalıbın eşleşmesi için eşleşmemesi gereken geçerli bir java normal ifadesi.
- 'replacement': string|list: sağlanırsa, 'düzelt' butonu 'url=url.replaceAll(regex,replacement)' işlevini çalıştırır. Eğer listeyse, değiştirme ondan rastgele bir öğe olacaktır.
- 'automatic': boolean: kalıbı otomatik olarak uygulamak için true değerine ayarlayın.
- 'enabled': boolean: kalıbı devre dışı bırakmak için false değerine ayarlayın.
Not: kalıpları düzenlerseniz, uygulama güncellemelerinden yeni yerleşik kalıplar otomatik olarak eklenmeyecektir (sıfırlama seçeneğiyle bunları geri yükleyebilirsiniz)."</string>
<!-- -->
<string name="mOpen_name"><![CDATA[Aç & Paylaş]]></string>
<string name="mOpen_desc">"Aşağıdaki düğmeleri içerir (soldan sağa):
- Özel Sekmeler düğmesi: özel sekme özelliğini etkinleştirmek/devre dışı bırakmak için geçiş. Etkinleştirildiğinde tarayıcı 'hafif' modda açılmalıdır.
- Aç düğmesi: Bağlantıyı o uygulamada açmak için uygulama adına basın. Bir bağlantı birden fazla uygulama ile açılabiliyorsa, seçim yapmanızı sağlamak için bir ok gösterilecektir.
- Paylaş düğmesi: Bağlantıyı paylaşmak için düğmeye basın. Panoya hızlıca kopyalamak için uzun basın."</string>
<string name="mOpen_ctabs">Özel sekmeler:</string>
<string name="defaultOn">Varsayılan olarak etkin</string>
<string name="defaultOff">Varsayılan olarak devre dışı bırakıldı</string>
<string name="alwaysOn">Her zaman açık</string>
<string name="alwaysOff">Her zaman kapalı</string>
<string name="mOpen_closeOpen">Açtıktan sonra iletişim kutusunu kapat</string>
<string name="mOpen_closeShare">Paylaştıktan sonra iletişim kutusunu kapat</string>
<string name="mOpen_perDomain">Farklı domainleri bağımsız olarak sıralama</string>
<string name="mOpen_noReferrer">Kaynak uygulamayı gizle (yönlendiren)</string>
<string name="mOpen_with">%s ile aç</string>
<string name="mOpen_open"></string>
<string name="mOpen_share">Paylaş</string>
<string name="mOpen_clipboard">Url panoya kopyalandı</string>
<string name="mOpen_clipboard">Url kopyalandı</string>
<string name="mOpen_noapps">Uygulama yok</string>
<string name="mOpen_tabsDesc">Özel Sekmeler özelliğini değiştir</string>
<!-- -->
<string name="mStatus_name">Durum kodu</string>
<string name="mStatus_desc">Kontrol düğmesine basarak, site durum kodunu almak ve görüntülemek için bir istekte bulunulacaktır.\nSonuç bir yeniden yönlendirme ise, hedef URL\'yi görüntüleyebileceksiniz. URL alınır, ancak değerlendirilmez, bu nedenle JavaScript\'e dayalı yönlendirmeler algılanmaz.</string>
@ -68,7 +158,7 @@ Translations: %s."</string>
<string name="mStatus_error">URL\'yi kontrol etmeye çalışırken dahili hata: %s</string>
<string name="mStatus_check">Kontrol et</string>
<string name="mStatus_recheck">Kontrol et</string>
<string name="mStatus_checking">Kontrol ediliyor...</string>
<string name="mStatus_checking">Kontrol ediliyor</string>
<string-array name="mStatus_codes">
<item>200: Tamam</item>
<item>301: Kalıcı olarak taşınmış</item>
@ -88,13 +178,15 @@ Translations: %s."</string>
</string-array>
<string name="mStatus_unknownCode">%d: Bilinmeyen durum kodu</string>
<string name="mStatus_redir">Yönlendirme: %s</string>
<string name="mStatus_autoRedirect">Yönlendirme URL\'lerini otomatik olarak değiştir</string>
<string name="mStatus_autoCheck">Aşağıdaki normal ifade kalıbıyla eşleşen URL\'leri otomatik olarak kontrol edin. Dikkat! Kısıtlayıcı bir model belirtmeniz önerilir (tümü için *. değil), aksi takdirde kötü niyetli sunucular IP\'nizi günlüğe kaydedebilir.</string>
<!-- -->
<string name="mInput_name">Giriş metni</string>
<string name="mInput_desc">Manuel olarak düzenlenebilen geçerli URL\'yi görüntüler.</string>
<!-- -->
<string name="mVT_name">URL\'yi tara</string>
<string name="mVT_desc">Bu bileşen etkinleştirildiğinde, VirusTotal kullanarak URL\'yi tarayabilir ve raporu inceleyebilirsiniz.\nBunun çalışması için kişisel bir VirusTotal API anahtarı gereklidir, buradan ücretsiz bir hesap için kayıt olduktan sonra bir tane alabilirsiniz: https://www.virustotal.com/gui/join-us.</string>
<string name="mVT_apiKey">api anahtarı</string>
<string name="mVT_desc">Bu bileşen etkinleştirildiğinde, VirusTotal kullanarak URL\'yi tarayabilir ve raporu inceleyebilirsiniz. Bunun çalışması için kişisel bir VirusTotal API anahtarı gereklidir, buradan ücretsiz bir hesap için kayıt olduktan sonra bir tane alabilirsiniz: https://www.virustotal.com/gui/join-us .</string>
<string name="mVT_apiKey">API anahtarı</string>
<string name="mVT_tm">VirusTotal™ Google, Inc. şirketinin ticari markasıdır.</string>
<string name="mVT_scan">Tara</string>
<string name="mVT_cancel">İptal et</string>
@ -106,7 +198,11 @@ Translations: %s."</string>
<string name="mVT_jsonError">VirusTotal\'a bağlanılamıyor. API anahtarının geçerli olduğundan emin olun veya daha sonra tekrar deneyin.</string>
<!-- -->
<string name="mD_name">Hata Ayıklama/İşaretleyici modülü</string>
<string name="mD_desc">Bileşenleri yeniden sıralarsanız, gelecekteki güncellemelerde eklenen yenileri bundan önce yerleştirilecektir.\n\nBunu etkinleştirirseniz, alınan amacı uri olarak görüntüler, geliştiriciler için yararlıdır.</string>
<string name="mD_desc">"Modülleri yeniden sıralarsanız, ilerideki güncellemelerde eklenen yeni modüller bunun üzerine yerleştirilecektir.
Bunu etkinleştirirseniz, 'recieved intent' geliştiriciler için yararlı olan uri olarak görüntüler.
Panoya kopyalamak için 'Intent' veya UrlData üzerine dokunun. Her şeyi kopyalamak için basılı tutun."</string>
<string name="mD_ctabs">Özelleştirilmiş sekmeler hizmetinden gelen hata ayıklama mesajlarını göster</string>
<!-- -->
<string name="mHist_name">Geçmiş</string>
@ -137,19 +233,74 @@ Translations: %s."</string>
<string name="mClear_hashHint">Sağlama kontrolü yok</string>
<string name="mClear_updateNow">Şimdi güncelle</string>
<string name="mClear_autoUpdate">Periyodik olarak güncelle</string>
<string name="mClear_lastCheck">Son kontrol:</string>
<string name="mClear_lastUpdate">Son güncelleme:</string>
<string name="mClear_updated">Katalog güncellendi</string>
<string name="mClear_upToDate">Güncel katalog</string>
<string name="mClear_urlError">Kurallar alınamıyor, URL\'nin geçerli olduğundan ve aktif bir bağlantınız olduğundan emin olun</string>
<string name="mClear_hashError">Sağlama öğesi alınamıyor, URL\'nin geçerli olduğundan ve etkin bir bağlantınız olduğundan emin olun</string>
<string name="mClear_hashMismatch">Sağlamalar eşleşmiyor, kontrolü atlamak istiyorsanız sağlama URL\'sini kaldırın</string>
<string name="mClear_restore">ClearUrl dosyalarını geri yükle</string>
<string name="mClear_editor">Bu gelişmiş bir özelliktir. Burada katalog kurallarını doğrudan düzenleyebilirsiniz. Bunlar https://docs.clearurls.xyz/latest/specs/rules/ adresindeki formata uygun olmalıdır.\nBurada yapılan herhangi bir değişikliğin, katalog manuel olarak veya güncelleyici iletişim kutusundan otomatik olarak güncellendiğinde üzerine yazılacağını unutmayın.</string>
<string name="mClear_editor">"Katalog kuralları: Şu formatı takip etmelidirler: https://docs.clearurls.xyz/latest/specs/rules/.
Katalog, güncelleyici iletişim kutusundan otomatik veya manuel olarak güncellenirse, 'sağlayıcılar' üst nesnesinde yapılan tüm değişikliklerin üzerine yazılacağını unutmayın. Kişisel kurallara sahip olmak için onları farklı bir üst nesneye (herhangi bir ad) ayarlayın."</string>
<!-- -->
<string name="mRemove_name">Sorguları Kaldır</string>
<string name="mRemove_desc">Bu bileşen ile URL\'den sorguları kaldırabilirsiniz.\nTüm sorguları kaldırmak için düğmeye basın veya sorguları birer birer kaldırmak için oka tıklayın.\nFikir ve orijinal uygulama için PabloOQ\'ya teşekkürler!</string>
<string name="mRemove_desc">"Bu modül ile URL'den sorguları kaldırabilirsiniz.
Hepsini kaldırmak için butona basın veya birer birer kaldırmak için oka basın.
Fikir ve orijinal uygulama için PabloOQ'a teşekkürler!"</string>
<string name="mRemove_found1">1 sorgu bulundu</string>
<string name="mRemove_found">%d sorgu bulundu</string>
<string name="mRemove_noQueries">Sorgu yok</string>
<string name="mRemove_all">Tümünü kaldır</string>
<string name="mRemove_one">Kaldır %s</string>
<string name="mRemove_empty">Boşluğu kaldır</string>
<!-- -->
<string name="mLog_name">Kayıt</string>
<string name="mLog_desc">Bu modül, kontrol edilen tüm URL\'leri günlüğe kaydeder. Tüm günlüğü burada görüntüleyebilir, temizleyebilir veya düzenleyebilirsiniz, ana iletişim kutusunda hiçbir görsel gösterge görünmez. Günlüğe kaydetmeyi devre dışı bırakmak için modülü devre dışı bırakmanız yeterlidir.</string>
<string name="mLog_view">Kayda bak</string>
<string name="mLog_edit">Kaydı değiştir</string>
<string name="mLog_empty">Veri yok</string>
<!-- -->
<string name="mHosts_name">Hosts etiketleyici</string>
<string name="mHosts_desc">"Bu modül, host'ları manuel olarak belirterek veya uzak hosts benzeri bir dosya kullanarak yapılandırarak etiketler. Tehlikeli veya özel siteler hakkında uyarmak için kullanabilirsiniz. Yerleşik yapılandırma, https://github.com/StevenBlack/hosts adresinden StevenBlack'in barındırıcılarını (reklam yazılımı/kötü amaçlı yazılım, sahte haberler, kumar ve yetişkinlere uygun içerik) belirtir."</string>
<string name="mHosts_malware">reklam yazılımı/kötü amaçlı yazılım</string>
<string name="mHosts_info">Host:</string>
<string name="mHosts_noLabel">etiket yok</string>
<string name="mHosts_fakenews">yalan haber</string>
<string name="mHosts_gambling">kumar</string>
<string name="mHosts_adult">yetişkin içerik</string>
<string name="mHosts_build">Yapı</string>
<string name="mHosts_uninitialized">Hosts veritabanı başlatılmamış. oluşturmak için basın</string>
<string name="mHosts_parseError">URL host ayrıştırılamıyor</string>
<string name="mHosts_editor">"Host yapılandırması. Format: Anahtarın hosts etiketi olduğu ve içeriğin aşağıdaki isteğe bağlı değerleri içerdiği nesnelerin listesi:
- dosya: İndirilecek bir hosts dosyasının url'si. Mevcut tüm geçerli hosts dosyası eklenecektir.
- hosts: Eklenecek ham hosts (dizeler) listesi.
- renk: Etiketin rengi. Bir Android renk dizisi (#AARRGGBB, #RRGGBB veya geçerli bir renk adı). Varsayılan olarak 'tehlike' kırmızısına döner.
- değiştir: yanlışsa mevcut hosts değiştirilmez. Nesnelerin yukarıdan aşağıya değerlendirildiğini unutmayın. Varsayılan olarak açıktır.
- etkin: kapalı ise, bu nesnenin tamamı atlanacaktır. Varsayılan olarak açıktır."</string>
<string name="mHosts_buildTitle">Hosts veritabanı oluşturun</string>
<string name="mHosts_buildDesc">Bu, mevcut hosts veritabanını temizleyecek ve mevcut yapılandırmayla oluşturacak ve gerekirse hosts dosyalarını internetten indirecektir. Bu işlem birkaç saniye sürebilir. Devam?</string>
<string name="mHosts_buildProgress">Katalog oluşturuluyor</string>
<string name="mHosts_buildInit">Başlatılıyor</string>
<string name="mHosts_buildClear">Temizleniyor…</string>
<string name="mHosts_buildDownload">"'%s' hosts dosyası şuradan indiriliyor: %s…"</string>
<string name="mHosts_buildSave">Saving…</string>
<string name="mHosts_built">Veritabanı oluşturuldu: %d hosts</string>
<!-- -->
<string name="mUnshort_name">Kısaltma giderici</string>
<string name="mUnshort_unshort">Kısaltmayı gider</string>
<string name="mUnshort_desc">"Bu modül, bağlantıları kendi sunucularında değerlendiren https://unshorten.me/ adresine göndererek kısaltmayı kaldırır ve yönlendirmeyi gelecekteki istekler için kaydeder. Özel veya hassas veriler içeren bağlantıların kısaltmasını kaldırmaktan kaçının.
API'leri, yeni kontroller için saatte 10 istek ile sınırlıdır. Modül yanıtı, bekleyen kaç tane isteğiniz olduğunu gösterecektir."</string>
<string name="mUnshort_tm">Unshorten.me tarafından unshorten.me ücretsiz API</string>
<string name="mUnshort_checking">Kontrol ediliyor…</string>
<string name="mUnshort_error">Sunucu hatası: %s</string>
<string name="mUnshort_internal">Internal error (%s)</string>
<string name="mUnshort_notFound">Yönlendirme bulunamadı</string>
<string name="mUnshort_pending">beklemede: %d/%d</string>
<string name="mUnshort_ok">Kısaltma giderildi</string>
<!-- -->
<string name="mFlags_name">İşaretler düzenleyici</string>
<string name="mFlag_desc">"[Beta özelliği] Bu gelişmiş bir modüldür, başka bir uygulamayı açarken 'intent' işaretlerini düzenlemenize olanak tanır.
Aşağıdaki alana, varsayılanların üzerine yazacak işaretler koyabilirsiniz; bunlar, bu uygulamayı açmak için kullanılan 'intent'ten alınmıştır.
Modülü kullanırken, işaretleri varsayılana ayarlamak için düzenleme butonuna basılı tutabilirsiniz. İşaretler alanına isimlerini yazarak bayrak ekleyebilirsiniz."</string>
</resources>

View File

@ -12,31 +12,30 @@
<!--
main
-->
<string name="txt_info">Ця програма виконує роль проміжного кроку відкриття посилань. Коли ви натискаєте на посилання та вибираєте цю програму для її відкриття, вона показує вам діалогове вікно з певною інформацією про посилання. Натисніть на кнопку модулі нижче, щоб побачити доступні модул і та те, що вони.</string>
<string name="txt_sample">:Натисніть на посилання нижче, щоб перевірити:</string>
<string name="txt_info">Ця програма діє як посередник під час відкриття посилань. Коли ви натискаєте на посилання та вибираєте її, з\'являється діалогове вікно з певною інформацією про посилання. Натисніть на кнопку Модулі нижче, щоб побачити доступні модулі та налаштувати їх.</string>
<string name="txt_sample">Натисніть на посилання нижче, щоб перевірити його:</string>
<string name="a_modules">Модулі</string>
<string name="a_about">Більше</string>
<string name="a_about">Про програму</string>
<!--
about
-->
<string name="txt_about">"Програма зроблена TrianguloY'ом
Contributions: %s.
Translations: %s."</string>
<string name="link_blog">Блог, який веде TrianguloY</string>
<string name="txt_about">Програму розробив TrianguloY.
\n
\nContributions: %s. Translations: %s.</string>
<string name="link_blog">Блог TrianguloY</string>
<!--
configuration
-->
<string name="txt_conf">Список модулів: ви можете включити, або відключити їх, також перевірте опис та налаштування модулів.</string>
<string name="toast_cantEnable">Неможливо активувати модуль, немає конфігураціЇ.</string>
<string name="txt_conf">Ось усі доступні модулі, де ви можете глянути їх опис і налаштування. Ви також можете змінити порядок відображення, видимість та увімкнути/вимкнути кожен.</string>
<string name="toast_cantEnable">Неможливо активувати модуль, відсутня конфігурація\?</string>
<string name="menu_resetOrder">Відновити початковий порядок</string>
<!--
generic
-->
<string name="toast_noApp">Не можу відкрити діяльність</string>
<string name="toast_noBrowser">Не можу відкрити браузер</string>
<string name="title_choose">Виберіть додаток</string>
<string name="toast_invalid">Не підходить</string>
<string name="toast_noApp">Неможливо відкрити програму</string>
<string name="toast_noBrowser">Неможливо відкрити переглядач</string>
<string name="title_choose">Виберіть програму</string>
<string name="toast_invalid">Невірний</string>
<string name="share">Поділитись додатком</string>
<!--
modules
@ -60,7 +59,7 @@ Translations: %s."</string>
<string name="mOpen_noapps">Немає відповідних програм</string>
<!-- -->
<string name="mStatus_name">Код статусу</string>
<string name="mStatus_desc">Натискаючи на кнопку перевірки, буде створено запит, щоб отримати та відобразити вам статус сайту(код статусу).\nЯкщо результатом буде перенаправлення, то ви зможете переглянути та змінити нове посилання. Посилання отримуються, але не оцінюється їх зміст, тому перенаправлення за допомогою JavaScript не можуть бути поміченими.</string>
<string name="mStatus_desc">Натискаючи на кнопку перевірки, буде створено запит, щоб отримати та відобразити вам статус сайту(код статусу). Якщо результатом буде перенаправлення, то ви зможете переглянути та змінити нове посилання. Посилання отримуються, але не оцінюється їх зміст, тому перенаправлення за допомогою JavaScript не можуть бути поміченими.</string>
<string name="mStatus_ioerror">Відбулась проблема з підключенням під час перевірки посилання: %s</string>
<string name="mStatus_error">Внутрішня проблема під час перевірки посилання: %s</string>
<string name="mStatus_check">Перевірити</string>
@ -137,4 +136,26 @@ Translations: %s."</string>
<string name="mRemove_all">Прибрати всі</string>
<string name="mRemove_one">Прибрати %s</string>
<string name="mRemove_empty">Прибрати пусте</string>
<string name="txt_openLinks">Відкриття посилань у цій програмі: Протягом багатьох років Android змінював способи налаштування відкриття посилань, тому вони різняться між версіями. Нижче ви можете знайти всі доступні налаштування для свого пристрою. Якщо посилання не відкриваються в цій програмі, перепробуйте всі ці налаштування.</string>
<string name="a_settings">Налаштування</string>
<string name="link_changelog">Список змін</string>
<string name="link_source">Вихідний код</string>
<string name="link_privacy">Політика конфіденційності</string>
<string name="desc_up">Вгору</string>
<string name="close">Закрити</string>
<string name="save">Зберегти</string>
<string name="reset">Скинути</string>
<string name="desc_down">Вниз</string>
<string name="desc_decorations">Показати/приховати заголовок</string>
<string name="desc_enable">Увімкнути/вимкнути модуль</string>
<string name="btn_setBrowser">Встановити як переглядач за умовчанням</string>
<string name="toast_defaultSet">Тепер програма є переглядачем за умовчанням</string>
<string name="btn_configureBrowser">Переглядач за умовчанням</string>
<string name="btn_linksSettings">Відкривати підтримувані посилання</string>
<string name="txt_theme">Тема:</string>
<string name="spin_darkTheme">Темна</string>
<string name="spin_lightTheme">Світла</string>
<string name="txt_locale">Мова:</string>
<string name="clear">Очистити</string>
<string name="mOpen_tabsDesc">Перемкнути функцію Custom Tabs</string>
</resources>

View File

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Translator(s) name:
If you create or update a translation, add how you want to be credited here.
@ -8,14 +9,12 @@
Locale name:
Write the locale name in the locale language, for users that doesn't know english. For example 'Español' instead of 'Spanish'-->
<string name="locale">简体中文</string>
<!-- main -->
<string name="txt_info">这个应用程序可以作为打开网址链接的中间步骤。当您单击链接并选择以此应用程序打开时,它将显示一个带有链接相关信息的对话框。按下面的模块按钮可检查和配置所有可用模块。</string>
<string name="txt_info">该应用程序在打开点击的URL链接时充当中间步骤。当选择此应用程序打开它时会显示一个带有链接相关一些信息的对话框。按下面的模块按钮来检查和配置所有可用的模块。</string>
<string name="txt_sample">请点击下方链接进行测试:</string>
<string name="a_modules">模块</string>
<string name="a_settings">设置</string>
<string name="a_about">关于</string>
<!-- about -->
<string name="txt_about">"此应用由 TrianguloY 创造
@ -25,7 +24,6 @@
<string name="link_changelog">更新日志</string>
<string name="link_source">源码</string>
<string name="link_privacy">隐私政策</string>
<!-- modules -->
<string name="txt_conf">这里是所有可用的模块,您可以在这里检查它们的相关描述和设置。您还可以重新排序、切换标题可见性以及启用或禁用它们。</string>
<string name="toast_cantEnable">"无法启用模块,是否缺少相关配置?"</string>
@ -35,12 +33,11 @@
<string name="desc_down">下移</string>
<string name="desc_decorations">显示/隐藏标题</string>
<string name="desc_enable">启用/禁用模块</string>
<!-- settings -->
<string name="txt_openLinks">在此应用上打开链接多年来Android 配置方式已发生许多变化不同版本之间也存在差异。如果链接无法在URLCheck上打开请尝试在您的设备中检查以下可用设置。</string>
<string name="btn_setBrowser">设置URLCheck为默认浏览器</string>
<string name="toast_defaultSet">已设为默认浏览器</string>
<string name="btn_configureBrowser">查看默认浏览器</string>
<string name="toast_defaultSet">已设为默认浏览器</string>
<string name="btn_configureBrowser">默认浏览器</string>
<string name="btn_linksSettings">打开受支持的链接</string>
<string name="btn_androidSettings">打开安卓应用设置</string>
<string name="txt_theme">主题:</string>
@ -48,19 +45,20 @@
<string name="spin_lightTheme">亮色</string>
<string name="txt_locale">语言:</string>
<string name="btn_tutorialSettings">重看教程</string>
<!-- tutorial -->
<string name="tutorial">教程</string>
<string name="txt_tutorial1">"感谢下载URLCheck
这是教程,如果您想跳过它,可以点击下方的按钮。另外,您可以随时从设置菜单重看此教程。"</string>
<string name="txt_tutorial2">URLCheck 在打开或共享网址链接时充当中介。当链接发送到 URLCheck时您可以通过模块对该链接进行相关操作。随之您可以选择所需的应用程序打开该链接、共享链接或将其复制到剪贴板中。</string>
<string name="txt_tutorial3">为了让 URLCheck 在打开网址链接前拦截它们,我们首先需要将其设置为默认浏览器。如果您打算使用共享功能传递链接,则不需要这样做。</string>
<string name="txt_tutorial4">"模块是 URLCheck 与网址链接进行交互的方式。内置有多个模块,每个模块都具有特定功能,通常它们会为您提供关于链接的信息,或者允许您修改 URL。它们是可配置的因此建议您检查它们并根据需要进行调整。每个模块的下面都有相应的描述。
重要提示:所有操作默认都是手动的,除非您特别允许,否则 URLCheck 不会修改任何东西或连接到互联网,但如果您需要的话,可以将某些操作配置为自动。
您可以从主屏幕或者下方按钮打开模块列表。"</string>
<string name="txt_tutorial3">将URLCheck设置为默认网络浏览器以便在打开URL时拦截它们。如果使用“共享”意图传递URL则不需要。</string>
<string name="txt_tutorial4">模块是 URLCheck 与网址链接进行交互的方式。
\n多个模块都具有特定功能通常它们会为您提供关于链接的信息或者允许您修改 URL。
\n您可以阅读并根据需要设置它们。
\n
\n重要信息默认情况下所有操作都是手动操作。除非您特别允许否则该应用程序不修改任何内容也不连接到互联网但如果操作需要一些操作可以自动应用。
\n
\n从主屏幕打开模块列表或点击下面的按钮。</string>
<string name="txt_tutorial5">"以上就是全部内容。以下是一些可能有用的提示:
当某个应用程序没有提供打开或共享网址链接的方法,但是提供了执行其他操作的方法时,您可以使用 URLCheck 解决该问题。您还可以通过长按共享按钮将链接复制到剪贴板中。
@ -70,10 +68,9 @@
希望您觉得该应用有用!如果您有功能建议、错误报告甚至提出修改,请不要犹豫。您可以在“关于”页面中找到所有相关链接。"</string>
<string name="btn_tutorialSkip">跳过教程</string>
<string name="btn_tutorialEnd">完成教程</string>
<!-- generic -->
<string name="toast_noApp">"无法打开应用"</string>
<string name="toast_noBrowser">"无法打开该浏览器"</string>
<string name="toast_noApp">无法打开应用</string>
<string name="toast_noBrowser">无法打开该浏览器</string>
<string name="title_choose">选择应用</string>
<string name="toast_invalid">无效</string>
<string name="save">保存</string>
@ -87,48 +84,41 @@
<string name="deviceDefault">系统默认</string>
<string name="next">下一步</string>
<string name="back">返回</string>
<!-- json -->
<string name="json_desc">[测试功能] 这是一个进阶编辑器,内容必须为有效的 JSON 格式。您可以点击右上角的按钮进行格式化和验证。</string>
<string name="json_edit">进阶编辑器</string>
<!-- shortcuts -->
<string name="shortcut_checkClipboard">检查剪贴板中的链接</string>
<!-- modules -->
<string name="mPttrn_name">模式检查器</string>
<string name="mPttrn_desc">"这个模块使用正则表达式模式检查网址链接,可以发出警告、建议或者进行替换操作。您可以修改或创建自己的模式,甚至使用用户创建的模式。
内置模式包括:
- 包含希腊字母等非 ASCII 字符时会发出警告。这可以用于监测网络钓鱼googĺe.com vs google.com
- 建议将 'http' 替换为 'https'
- 建议将 YouTube、Reddit 或 Twitter 替换为更隐私友好的替代品[默认情况下禁用]"</string>
<string name="mPttrn_desc">这个模块使用正则表达式模式检查网址链接,可以发出警告、建议或者进行替换操作。您可以修改或创建自己的模式,甚至使用用户自主创建的模式。
\n
\n内置模式包括 - 包含希腊字母等非 ASCII 字符时会发出警告。这可以用于监测网络钓鱼googĺe.com vs google.com - 建议将 \'http\' 替换为 \'https\' - 建议将 YouTube、Reddit 或 Twitter 替换为更隐私友好的替代品[默认情况下禁用]</string>
<string name="mPttrn_userContent">一些其他用户创建的有效模式: %s</string>
<string name="mPttrn_fix">应用</string>
<string name="mPttrn_fixed">已应用 - %s</string>
<string name="mPttrn_ascii">警告!发现非 ASCII 字符</string>
<string name="mPttrn_http">http 链接,建议使用 https</string>
<string name="mPttrn_noSchemeHttp">缺少 http 协议</string>
<string name="mPttrn_noSchemeHttps">缺少 https 协议</string>
<string name="mPttrn_http">HTTP 链接,建议使用 HTTPS</string>
<string name="mPttrn_noSchemeHttp">缺少 HTTP 协议</string>
<string name="mPttrn_noSchemeHttps">缺少 HTTPS 协议</string>
<string name="mPttrn_ok">无匹配的模式</string>
<string name="mPttrn_editor">"您可以在这里编辑或添加新的模式。格式:
- 'regex': string有效的 Java 正则表达式,将与 URL 进行匹配。
- 'replacement': string|list如果提供则“修复”按钮将运行'url=url.replaceAll(regex,replacement)。如果是 list replacement 将从中随机选择一个元素。
- 'automatic'boolean将其设置为 true以自动应用该模式。
- 'enabled'boolean将其设置为 false以禁用该模式。
注意:如果你编辑了这些模式,新的内置模式将不会自动添加到应用程序更新中(你可以使用重置选项恢复它们)。"</string>
<string name="mOpen_name"><![CDATA[Open & Share]]></string>
<string name="mPttrn_editor">您可以在这里编辑或添加新的模式。格式:
\n- \'regex\': string有效的 Java 正则表达式,将与 URL 进行匹配。
\n- \'replacement\': string|list如果提供则“修复”按钮将运行\'url=url.replaceAll(regex,replacement)。如果是 list replacement 将从中随机选择一个元素。
\n- \'automatic\'boolean将其设置为 true以自动应用该模式。
\n- \'enabled\'boolean将其设置为 false以禁用该模式。
\n注意如果你编辑了这些模式新的内置模式将不会自动添加到应用程序更新中你可以使用重置选项恢复它们</string>
<string name="mOpen_name">打开并分享</string>
<string name="mOpen_desc">"包含以下按钮(从左到右):
- 自定义标签页:切换以启用/禁用自定义标签页功能。启用后浏览器以App内置浏览器的模式Lite 模式)打开链接。
- 打开按钮:按应用程序名称打开该应用程序中的链接。如果链接可以使用多个应用程序打开,则会显示箭头以供选择。
- 分享按钮:按按钮以共享链接。长按可快速复制到剪贴板。"</string>
<string name="mOpen_ctabs">自定义标签页:</string>
<string name="mOpen_ctabsOn">默认开启</string>
<string name="mOpen_ctabsOff">默认关闭</string>
<string name="mOpen_ctabsEn">始终开启</string>
<string name="mOpen_ctabsDis">始终关闭</string>
<string name="defaultOn">默认开启</string>
<string name="defaultOff">默认关闭</string>
<string name="alwaysOn">始终开启</string>
<string name="alwaysOff">始终关闭</string>
<string name="mOpen_closeOpen">在打开之后关闭对话框</string>
<string name="mOpen_closeShare">分享后关闭对话框</string>
<string name="mOpen_perDomain">分别处理不同的域名</string>
@ -139,9 +129,8 @@
<string name="mOpen_clipboard">复制链接到剪贴板</string>
<string name="mOpen_noapps">无应用</string>
<string name="mOpen_tabsDesc">切换自定义标签页启用状态</string>
<string name="mStatus_name">状态码</string>
<string name="mStatus_desc">"当您按下检查按钮时,将发起一个请求以检索并显示站点状态代码。如果结果是重定向,则可以查看目标URL链接。获取链接的内容HEAD但不会对其进行评估因此基于JavaScript的重定向不会被检测到。"</string>
<string name="mStatus_desc">当您按下检查按钮时,将发起一个请求以检索并显示站点状态代码。如果结果是重定向,则可以查看目标链接。获取链接的内容GET但不会对其进行评估因此基于JavaScript的重定向不会被检测到。</string>
<string name="mStatus_ioerror">尝试检查链接时发生网络错误: %s</string>
<string name="mStatus_error">尝试检查链接时发生内部错误:%s</string>
<string name="mStatus_check">检查状态</string>
@ -166,25 +155,22 @@
</string-array>
<string name="mStatus_unknownCode">%d: 未知状态码</string>
<string name="mStatus_redir">重定向到 %s</string>
<string name="mStatus_autoRedirect">自动替换重定向网址</string>
<string name="mStatus_autoCheck">自动检查与以下正则表达式模式匹配的网址。警告!建议指定一个限制性模式(而不是使用 "." 匹配全部),否则恶意服务器可能会记录您的 IP。</string>
<string name="mStatus_autoRedirect">自动替换重定向链接</string>
<string name="mStatus_autoCheck">自动检查与以下正则表达式模式匹配的链接。警告!建议指定一个限制性模式(而不是使用 . 匹配全部),否则恶意服务器可能会记录您的 IP。</string>
<string name="mInput_name">输入文本</string>
<string name="mInput_desc">"显示当前的网址,可以用于手动编辑。"</string>
<string name="mInput_desc">显示当前链接,可以用于手动编辑。</string>
<string name="mVT_name">链接扫描器</string>
<string name="mVT_desc">"当启用此模块时您可以使用VirusTotal扫描网址链接并查阅扫描报告。它需要一个个人的VirusTotal api key 才能正常工作,您可以在此处注册免费帐户后获取: https://www.virustotal.com/gui/join-us."</string>
<string name="mVT_apiKey">api key</string>
<string name="mVT_desc">"当启用此模块时您可以使用VirusTotal扫描网址链接并查阅扫描报告。它需要一个个人的VirusTotal api key 才能正常工作,您可以在此处注册免费帐户后获取: https://www.virustotal.com/gui/join-us ."</string>
<string name="mVT_apiKey">API key</string>
<string name="mVT_tm">VirusTotal™ 是 Google, Inc. 的商标。</string>
<string name="mVT_scan">扫描</string>
<string name="mVT_cancel">取消</string>
<string name="mVT_scanning">扫描中…</string>
<string name="mVT_goodUrl">%d 个引擎均未在此链接中发现(截至 %s</string>
<string name="mVT_warningUrl">警告, %d/%d 引擎已在该链接中发现(截至 %s</string>
<string name="mVT_badUrl"> 注意!%d/%d 个引擎已在该链接中发现(截至 %s</string>
<string name="mVT_connectError">"无法链接到 VirusTotal请检查您的网络连接状况或稍后重试"</string>
<string name="mVT_jsonError">"无法链接到 VirusTotal请检查您的api key是有效的或稍后重试"</string>
<string name="mVT_badUrl">注意!%d/%d 个引擎已在该链接中发现(截至 %s</string>
<string name="mVT_connectError">无法连接到 VirusTotal请确保您已连接互联网或稍后重试</string>
<string name="mVT_jsonError">无法连接到 VirusTotal请确保您的API key有效或稍后重试。</string>
<string name="mD_name">调试/标记模块</string>
<string name="mD_desc">"如果您重新排序模块,则未来更新中添加的新模块将放置在此模块之上。
@ -192,12 +178,10 @@
点击Intent或UrlData以复制到剪贴板。长按以复制所有内容"</string>
<string name="mD_ctabs"> 显示来自自定义标签页服务的调试消息</string>
<string name="mHist_name">历史记录</string>
<string name="mHist_desc">当链接被手动编辑过或者被其他模块修改时,此模块允许您查看和恢复更改。</string>
<string name="mClear_name">链接清洁器</string>
<string name="mClear_desc">此模块从网址链接中删除跟踪、引用来源和其他无用参数。它还允许常见的离线网址重定向。</string>
<string name="mClear_desc">此模块从链接中删除跟踪、引用来源和其他无用参数。它还允许常见的离线网址重定向。</string>
<string name="mClear_tm">从 ClearURLs 复制的内置规则目录: https://docs.clearurls.xyz/latest/specs/rules/</string>
<string name="mClear_clear">应用</string>
<string name="mClear_matches">匹配 %s</string>
@ -213,10 +197,10 @@
<string name="mClear_auto">自动应用</string>
<string name="mClear_toggleReferral">"允许引用来源推广(来源参数不会被清除"</string>
<string name="mClear_toggleVerbose">启用匹配过程的粗略信息</string>
<string name="mClear_error">在检查规则时发生了一个错误</string>
<string name="mClear_error">无法检查规则</string>
<string name="mClear_updater">更新器</string>
<string name="mClear_sourceDesc">具有规则的JSON文件目录的网址链接:</string>
<string name="mClear_urlHint">规则目录网址</string>
<string name="mClear_urlHint">规则目录链接</string>
<string name="mClear_hashDesc">目录哈希值的网址链接。如果省略,将不检查下载是否被篡改/修改(不建议)。</string>
<string name="mClear_hashHint">没有哈希值检查</string>
<string name="mClear_updateNow">立即更新</string>
@ -227,30 +211,25 @@
<string name="mClear_upToDate">目录已更新</string>
<string name="mClear_urlError">无法获取规则,请确保链接是有效的,并且您的网络连接正常</string>
<string name="mClear_hashError">无法获取哈希值,请确保链接是有效的,并且您的网络连接正常</string>
<string name="mClear_hashMismatch">哈希值不匹配,文件可能被篡改了。如果你想跳过检查,删除哈希值网址链接</string>
<string name="mClear_hashMismatch">哈希值不匹配,文件可能被篡改了。如果你想跳过检查,删除哈希值链接</string>
<string name="mClear_restore">重置ClearURLs路径</string>
<string name="mClear_editor">"目录规则。他们必须遵循以下的格式 https://docs.clearurls.xyz/latest/specs/rules/.
请注意,如果目录被自动或手动从更新器对话框中更新,对家长对象 "提供者 "的任何修改将被覆盖。要想拥有个人自定义规则,可以在不同的家长对象(任何名称)中设置它们。"</string>
<string name="mRemove_name">查询删除器</string>
<string name="mRemove_desc">"通过这个模块,你可以删除网址链接中的查询参数。
按下按钮可将它们全部删除,或按下箭头一次删除一个。
感谢PabloOQ的想法和原始实现!"</string>
<string name="mRemove_desc">[已弃用]通过这个模块,你可以删除网址链接中的查询参数。 按下按钮可将它们全部删除,或按下箭头一次删除一个。 感谢PabloOQ的想法和原始实现!
\n
\n该模块已被弃用请使用“URI 部件”模块</string>
<string name="mRemove_found1">发现 1 个查询参数</string>
<string name="mRemove_found">发现 %d 个查询参数</string>
<string name="mRemove_noQueries">无查询参数</string>
<string name="mRemove_all">全部移除</string>
<string name="mRemove_one">移除 %s</string>
<string name="mRemove_empty">Remove empty</string>
<string name="mLog_name">日志</string>
<string name="mLog_desc">"这个模块记录了所有被检查的网址链接。
你可以在这里查看、清除或编辑完整的日志,该模块在主对话框中不会显示。
要禁用日志记录,只需禁用该模块。"</string>
<string name="mLog_desc">这个模块记录了所有被检查的链接。 你可以在这里查看、清除或编辑完整的日志,该模块在主对话框中不会显示。 要禁用日志记录,只需禁用该模块。</string>
<string name="mLog_view">查看日志</string>
<string name="mLog_edit">修改日志</string>
<string name="mLog_empty">无数据</string>
<string name="mHosts_name">主机标识符</string>
<string name="mHosts_desc">"此模块可以标记主机通过手动指定或使用类似远程主机的文件进行配置。您可以使用它来警告危险或特殊的网站。内置的配置使用StevenBlack的hosts广告软件/恶意软件、假新闻、赌博和成人内容来自https://github.com/StevenBlack/hosts。"</string>
<string name="mHosts_malware">广告软件/恶意软件</string>
@ -261,7 +240,7 @@
<string name="mHosts_adult">成年内容</string>
<string name="mHosts_build">构建</string>
<string name="mHosts_uninitialized">主机数据库未初始化,点击以构建</string>
<string name="mHosts_parseError">"无法解析网址主机"</string>
<string name="mHosts_parseError">无法解析链接主机</string>
<string name="mHosts_editor">"主机配置。格式:键是主机标签的对象列表(List of Objects),内容包括以下可选的值:
- 文件要下载的远程主机文件的URL。将添加所有有效的主机。
- 主机:要添加的原始主机(字符串)的列表。
@ -276,14 +255,22 @@
<string name="mHosts_buildDownload">"下载了 '%s' 个主机,从%s…</string>
<string name="mHosts_buildSave">保存中…</string>
<string name="mHosts_built">数据库构建: %d 主机</string>
<string name="mUnshort_name">短链接解析器</string>
<string name="mUnshort_unshort">解析短链接</string>
<string name="mUnshort_desc">"此模块将通过将网址链接发送到https://unshorten.me/ 来解析短链接它们将在其服务器上对该链接进行检查并为将来的请求保存重定向。避免那些含有私人或敏感数据的短链接。此API的限制为每小时10个新检查的请求。该模块响应将显示还您有多少请求待处理。"</string>
<string name="mUnshort_checking">检查中</string>
<string name="mUnshort_error">服务器错误: %s</string>
<string name="mUnshort_internal">内部错误 (%s)</string>
<string name="mUnshort_notFound">未发现重定向 (待处理: %d/%d)</string>
<string name="mUnshort_ok">已解析短链接 (待处理: %d/%d)</string>
</resources>
<string name="mUnshort_notFound">未发现重定向</string>
<string name="mUnshort_pending">待处理: %d/%d</string>
<string name="mUnshort_ok">已解析短链接</string>
<string name="mFlag_editFlags">修改标识符值</string>
<string name="mParts_name">URI 部件</string>
<string name="mFlag_desc">[测试版功能]这是个高级模块,它允许您在打开另一个应用程序时编辑意图标识符。
\n此模块将显示一个标识符列表您可以通过点击图标来更改标志符启用状态。这还有一个溢出菜单来隐藏标识符只是可视化标识符仍将使用分配的状态。
\n标识符在复选框旁边将有两个颜色指示器。左边显示从意图收到的值右边显示模块本身设置的状态。红色表示标识符未设置绿色表示标识符已设置。此外首选项指示器也可能是灰色的意味着状态已设为自动。
\n使用下面的按钮您可以编辑默认状态和标识符的可见性。</string>
<string name="mParts_desc">本模块显示解码的URL的所有部分计划、权限、路径、参数和片段。通过单击一个部分它将被设置为新的URL例如如果其中一个查询或路径是编码的重定向URL则非常有用。您也可点击“X”按钮来删除其中一些。这是“参数移除器”模块的高级版本。</string>
<string name="mUnshort_tm">Unshorten.me 免费API</string>
<string name="mFlags_name">标识符编辑器</string>
</resources>

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="locale">Traditional Chinese</string>
<string name="link_privacy">隱私政策</string>
<string name="txt_conf">以下為所有可用的模組,你可以個別確認敘述和設定。你也可以個別重新排序、切換是否顯示標題和是否啟用。</string>
<string name="txt_openLinks">用這個 APP 開啟連結:從古至今以來 Android 多次改變了設定開啟鏈結的方式,因版本而異。下面列出您裝置上可用的所有可能的方式,若其中有不能用的,請試試其他的。</string>
<string name="txt_info">這個 APP 會在點開 URL 連結時介入,跳出關於連結的一些資訊。點選下面的「模組」按鈕以了解和設定所有可用的模組。</string>
<string name="txt_sample">點擊下面的連結來測試功能:</string>
<string name="a_modules">模組</string>
<string name="a_settings">設定</string>
<string name="a_about">關於</string>
<string name="txt_about">本 APP 由 TrianguloY 建立
\n
\n貢獻者%s
\n翻譯者%s</string>
<string name="link_blog">TrianguloY 的部落格</string>
<string name="link_changelog">更新記錄</string>
<string name="link_source">原始碼</string>
<string name="toast_cantEnable">無法啟用模組,缺少設定?</string>
<string name="menu_resetOrder">重置順序</string>
<string name="menu_toggleDecorations">切換所有標題顯示</string>
<string name="desc_up">上移</string>
<string name="desc_down">下移</string>
<string name="desc_decorations">開/關 標題</string>
<string name="desc_enable">開/關 模組</string>
<string name="btn_setBrowser">設為預設瀏覽器</string>
<string name="toast_defaultSet">此 APP 現在是預設瀏覽器了</string>
<string name="btn_configureBrowser">預設瀏覽器</string>
<string name="btn_linksSettings">開啟支援的鏈結</string>
<string name="btn_androidSettings">Android APP 設定</string>
<string name="txt_theme">主題:</string>
<string name="spin_darkTheme"></string>
<string name="spin_lightTheme"></string>
<string name="txt_locale">語言:</string>
<string name="tutorial">導覽</string>
<string name="btn_tutorialSettings">重啟導覽</string>
<string name="txt_tutorial1">謝謝您下載此 APP
\n
\n您現在看到的是教學導覽若您想要跳過可以點擊下面的按鈕。您可以隨時從設定選單回到這個導覽。</string>
<string name="txt_tutorial2">這個 APP 可以作為點擊或分享鏈結時的中介,當 URL 被送到 APP 時您可以透過各模組進行處理,最後再用對應 APP 開啟、分享處理後的鏈結或將其複製到剪貼簿上。</string>
<string name="txt_tutorial3">設定本 APP 為預設瀏覽器可在點擊鏈結時直接啟動攔截處理。
\n若僅想使用分享功能來傳送鏈結可以略過此設定</string>
<string name="txt_tutorial4">模組就是此 APP 如何處理鏈結的關鍵。
\n每個模組都有其對應的功能有些可能提供資訊有的可能對鏈結進行調整。
\n依照需求閱讀並設定他們。
\n
\n重要所有動作預設均為手動。除非您有特別指定否則此 APP 不會自動更動或傳送任何資訊。然而若您有需要,部分模組的部分動作是可以設為自動的。
\n
\n
\n從主畫面開啟模組清單或是點擊下面的按鈕。</string>
</resources>

View File

@ -2,4 +2,5 @@
<resources>
<dimen name="padding">25dp</dimen>
<dimen name="smallPadding">10dp</dimen>
<dimen name="square_button">35dp</dimen>
</resources>

View File

@ -4,7 +4,7 @@
If you create or update a translation, add how you want to be credited here.
For multiple translators, separate them by semicolon.
Example: <string name="translators">John Doe; Jane Doe</string> -->
<string name="translators"></string>
<string name="translators">TrianguloY</string>
<!--
Locale name:
Write the locale name in the locale language, for users that doesn't know english. For example 'Español' instead of 'Spanish'-->
@ -94,14 +94,15 @@ Hope you find the app useful! And don't hesitate to suggest features, report bug
<string name="clear">Clear</string>
<string name="none">None</string>
<string name="auto">Automatic</string>
<string name="defaultOn">Enabled by default</string>
<string name="defaultOff">Disabled by default</string>
<string name="alwaysOn">Always on</string>
<string name="alwaysOff">Always off</string>
<string name="share">Share</string>
<string name="canceled">Canceled</string>
<string name="deviceDefault">Device default</string>
<string name="next">Next</string>
<string name="back">Back</string>
<string name="remove">Remove</string>
<string name="edit">Edit</string>
<string name="add">Add</string>
<!--
json
-->
@ -138,14 +139,12 @@ Note: if you edit the patterns, new built-in patterns from app updates will not
<!-- -->
<string name="mOpen_name">Open and share</string>
<string name="mOpen_desc">"Contains the following buttons (left to right):
- Custom Tabs button: toggle to enable/disable the custom tab feature. When enabled the browser should be opened in a 'lite' mode.
- Custom Tabs button: toggle to enable/disable the custom tab feature. When enabled, the browser should be opened in a 'lite' mode.
- Incognito button: For Firefox only. Toggle to enable/disable the incognito mode. When enabled, the browser should be opened in incognito.
- Open button: Press the app name to open the link on that app. If a link can be opened with multiple apps, an arrow will be shown to let you choose.
- Share button: Press the button to share the link. Long press to quickly copy to clipboard."</string>
<string name="mOpen_ctabs">Custom tabs:</string>
<string name="mOpen_ctabsOn">Enabled by default</string>
<string name="mOpen_ctabsOff">Disabled by default</string>
<string name="mOpen_ctabsEn">Always on</string>
<string name="mOpen_ctabsDis">Always off</string>
<string name="mOpen_incognito">Incognito mode:</string>
<string name="mOpen_closeOpen">Close dialog after opening</string>
<string name="mOpen_closeShare">Close dialog after sharing</string>
<string name="mOpen_perDomain">Sort different domains independently</string>
@ -157,9 +156,10 @@ Note: if you edit the patterns, new built-in patterns from app updates will not
<string name="mOpen_clipboard">URL copied to clipboard</string>
<string name="mOpen_noapps">No apps</string>
<string name="mOpen_tabsDesc">Toggle Custom Tabs feature</string>
<string name="mOpen_incognitoDesc">Toggle incognito mode (for Firefox only)</string>
<!-- -->
<string name="mStatus_name">Status code</string>
<string name="mStatus_desc">By pressing the check button, a petition will be made to retrieve and display the site status code. If the result is a redirection, you will be able to view the destination URL. The URL content is obtained (HEAD), but not evaluated, so redirections based on JavaScript won\'t be detected.</string>
<string name="mStatus_desc">By pressing the check button, a petition will be made to retrieve and display the site status code. If the result is a redirection, you will be able to view the destination URL. The URL content is obtained (GET), but not evaluated, so redirections based on JavaScript won\'t be detected.</string>
<string name="mStatus_ioerror">Network error while trying to check the URL: %s</string>
<string name="mStatus_error">Internal error while trying to check the URL: %s</string>
<string name="mStatus_check">Check status</string>
@ -190,7 +190,7 @@ Note: if you edit the patterns, new built-in patterns from app updates will not
<string name="mInput_name">Input text</string>
<string name="mInput_desc">Displays the current URL, which can be edited manually.</string>
<string name="mVT_name">URL Scanner</string>
<string name="mVT_desc">When this module is enabled you can scan the URL using VirusTotal and check the report. A personal VirusTotal API key is needed for it to work, you can get one after registering for a free account here: https://www.virustotal.com/gui/join-us.</string>
<string name="mVT_desc">When this module is enabled you can scan the URL using VirusTotal and check the report. A personal VirusTotal API key is needed for it to work, you can get one after registering for a free account here: https://www.virustotal.com/gui/join-us .</string>
<string name="mVT_apiKey">API key</string>
<string name="mVT_tm">VirusTotal™ is a trademark of Google, Inc.</string>
<string name="mVT_scan">Scan</string>
@ -250,9 +250,11 @@ Tap on Intent or UrlData to copy to the clipboard. Hold to copy everything."</st
Note that any modification to the parent object 'providers' will be overwritten if the catalog is updated automatically or manually from the updater dialog. To have personal rules set them in a different parent object (any name)."</string>
<!-- -->
<string name="mRemove_name">Queries Remover</string>
<string name="mRemove_desc">"With this module you can remove queries from the URL.
<string name="mRemove_desc">"[DEPRECATED] With this module you can remove queries from the URL.
Press the button to remove them all or press the arrow to remove one at a time.
Thanks to PabloOQ for the idea and original implementation!"</string>
Thanks to PabloOQ for the idea and original implementation!
This module has been deprecated in favor of the 'Uri parts' module"</string>
<string name="mRemove_found1">1 query found</string>
<string name="mRemove_found">%d queries found</string>
<string name="mRemove_noQueries">No queries</string>
@ -300,14 +302,20 @@ Their api is rate limited to 10 requests per hour for new checks. The module res
<string name="mUnshort_checking">Checking…</string>
<string name="mUnshort_error">Server error: %s</string>
<string name="mUnshort_internal">Internal error (%s)</string>
<string name="mUnshort_notFound">No redirection found (pending: %d/%d)</string>
<string name="mUnshort_ok">Unshorted (pending: %d/%d)</string>
<string name="mUnshort_notFound">No redirection found</string>
<string name="mUnshort_pending">pending: %d/%d</string>
<string name="mUnshort_ok">Unshorted</string>
<!-- -->
<string name="mFlags_name">Flags editor</string>
<string name="mFlags_invalid">Invalid flag</string>
<string name="mFlag_desc">"[Beta feature] This is an advanced module, it allows you to edit the intent flags when opening another app.
In the field below you can put flags that will overwrite the default ones, those are taken from the intent that was used to open this app.
While using the module you can hold the edit button to set the flags to the default flags. You can add flags by writing their name in the flags field"</string>
<string name="mFlag_flagHint">Flag name</string>
</resources>
\nThis module will show a list of flags, you can change if the flag is set or not by taping the icon. There is also an overflow menu to hide flags in there, it is just visual, flags will still use the assigned state.
\nThe flags will have two color indicators next to the checkbox. The left one shows the value received from the intent, the right one indicates the state set by the module itself. Red means the flag is not set and green means the flag is set. Additionally the preference indicator can be grey, this means that the state was set to auto.
\nWith the button below you can edit the default state and the visibility of the flags."</string>
<string name="mFlag_editFlags">Edit default flag values</string>
<!-- -->
<string name="mParts_name">Uri parts</string>
<string name="mParts_desc">"This module shows all parts of the url decoded: scheme, authority, paths, queries and fragment.
By clicking a part it will be set as the new url, useful for example if one of the queries or paths was an encoded redirection url.
You can also click the 'X' button to remove some of them.
This is an advanced version of the 'Queries Remover' module."</string>
</resources>

View File

@ -7,7 +7,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.1'
classpath 'com.android.tools.build:gradle:7.4.2'
// NOTE: Do not place your application dependencies here; they belong

View File

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