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

json editor as activity

This commit is contained in:
TrianguloY 2024-06-23 11:23:36 +02:00
parent baaf2e7431
commit aaa689f904
38 changed files with 429 additions and 242 deletions

View File

@ -26,6 +26,7 @@
<activity android:name=".activities.ModulesActivity" />
<activity android:name=".activities.SettingsActivity" />
<activity android:name=".activities.TutorialActivity" />
<activity android:name=".activities.JsonEditorActivity" />
<activity
android:name=".dialogs.MainDialog"
android:excludeFromRecents="true"

View File

@ -0,0 +1,210 @@
package com.trianguloy.urlchecker.activities;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.AndroidSettings;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
import com.trianguloy.urlchecker.utilities.methods.LocaleUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Objects;
/** Activity for editing a json */
public class JsonEditorActivity extends Activity {
public static final String EXTRA_CLASS = "data";
private static final int INDENT_SPACES = 2;
private JsonEditorInterface provider;
private TextView editor;
private View info;
// ------------------- listeners -------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidSettings.setTheme(this, false);
LocaleUtils.setLocale(this);
setContentView(R.layout.activity_json_editor);
setTitle(R.string.json_editor);
AndroidUtils.configureUp(this);
try {
// this is a bit dangerous
provider = ((Class<JsonEditorInterface>) getIntent().getSerializableExtra(EXTRA_CLASS)).getConstructor(Context.class).newInstance(this);
} catch (Exception e) {
AndroidUtils.assertError("Unable to instantiate the JsonEditorInterface", e);
Toast.makeText(this, R.string.toast_invalid, Toast.LENGTH_SHORT).show();
finish();
return;
}
info = findViewById(R.id.info);
this.<TextView>findViewById(R.id.description).setText(provider.getEditorDescription());
editor = findViewById(R.id.data);
editor.setText(noFailToString(provider.getJson()));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_json_editor, menu);
AndroidUtils.fixMenuIconColor(menu.findItem(R.id.menu_format), this);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// press the 'back' button in the action bar to go back
case android.R.id.home -> onBackPressed();
// format content
case R.id.menu_format -> format();
// save
case R.id.menu_save -> save();
// discard
case R.id.menu_discard -> discard();
// reset
case R.id.menu_reset -> reset();
// toggle info visibility
case R.id.menu_show_info -> {
item.setChecked(!item.isChecked());
info.setVisibility(item.isChecked() ? View.VISIBLE : View.GONE);
}
default -> {
return super.onOptionsItemSelected(item);
}
}
return true;
}
@Override
public void onBackPressed() {
// validate
JSONObject currentData;
try {
currentData = new JSONObject(editor.getText().toString());
} catch (JSONException e) {
new AlertDialog.Builder(this)
.setTitle(R.string.toast_invalid)
.setMessage(R.string.json_ignore)
.setPositiveButton(R.string.json_discard_close, (dialog, which) -> finish())
.setNegativeButton(android.R.string.cancel, null)
.show();
return;
}
// check changes, exit if there are none
if (Objects.equals(noFailToString(currentData), noFailToString(provider.getJson()))) {
finish();
return;
}
// ask to save or discard
new AlertDialog.Builder(this)
.setTitle(R.string.save)
.setMessage(R.string.json_save)
.setPositiveButton(R.string.save, (dialog, which) -> {
var result = provider.saveJson(currentData);
if (result == null) {
// all ok, exit
finish();
} else {
// error while saving
new AlertDialog.Builder(this)
.setTitle(R.string.toast_invalid)
.setMessage(getString(R.string.json_save_error, result))
.setPositiveButton(android.R.string.ok, null)
.show();
}
})
.setNeutralButton(R.string.discard, (dialog, which) -> finish())
.setNegativeButton(android.R.string.cancel, null)
.show();
}
/* ------------------- actions ------------------- */
/** Formats the editor content, shows a dialog if invalid */
private void format() {
try {
editor.setText(new JSONObject(editor.getText().toString()).toString(INDENT_SPACES));
} catch (JSONException e) {
// invalid json
new AlertDialog.Builder(this)
.setTitle(R.string.toast_invalid)
.setMessage(R.string.json_format_error)
.setPositiveButton(android.R.string.ok, null)
.show();
}
}
/** Discard the editor changes and restore the saved contents */
private void discard() {
new AlertDialog.Builder(this)
.setTitle(R.string.discard)
.setMessage(R.string.json_discard)
.setPositiveButton(android.R.string.yes, (dialog, which) -> editor.setText(noFailToString(provider.getJson())))
.setNegativeButton(android.R.string.cancel, null)
.show();
}
/** Discard the editor changes and restore the built-in contents */
private void reset() {
new AlertDialog.Builder(this)
.setTitle(R.string.reset)
.setMessage(R.string.json_reset)
.setPositiveButton(android.R.string.yes, (dialog, which) -> editor.setText(noFailToString(provider.getBuiltInJson())))
.setNegativeButton(android.R.string.cancel, null)
.show();
}
/** Saved current content. Display a dialog if it's not valid json or the saving failed */
private void save() {
String result;
try {
result = provider.saveJson(new JSONObject(editor.getText().toString()));
} catch (JSONException e) {
// invalid json
result = getString(R.string.json_format_error);
}
if (result != null) {
// error while saving
new AlertDialog.Builder(this)
.setTitle(R.string.toast_invalid)
.setMessage(getString(R.string.json_save_error, result))
.setPositiveButton(android.R.string.ok, null)
.show();
}
}
/* ------------------- utils ------------------- */
/** Formats a json into a valid string that doesn't throws a JSON exception */
private static String noFailToString(JSONObject content) {
try {
return content.toString(INDENT_SPACES);
} catch (JSONException e) {
// panic, don't format then
return content.toString();
}
}
}

View File

@ -0,0 +1,37 @@
package com.trianguloy.urlchecker.activities;
import static com.trianguloy.urlchecker.activities.JsonEditorActivity.EXTRA_CLASS;
import android.content.Context;
import android.content.Intent;
import org.json.JSONObject;
/**
* If a class implements this, it will be able to show a JSON editor.
* IMPORTANT! The class must also have a constructor with a single Context parameter.
*/
public interface JsonEditorInterface {
/* ------------------------- implementation ------------------------- */
/** Should return the currently saved json */
JSONObject getJson();
/** Should return the built-in json */
JSONObject getBuiltInJson();
/** Should saves a json. Return null if all ok, a message string to display if not */
String saveJson(JSONObject data);
/** The string id of the description to show in the editor */
int getEditorDescription();
/* ------------------------- usage ------------------------- */
/** Displays a generic editor for json content. */
default void showEditor(Context cntx) {
cntx.startActivity(new Intent(cntx, JsonEditorActivity.class)
.putExtra(EXTRA_CLASS, this.getClass()));
}
}

View File

@ -1,94 +0,0 @@
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;
import com.trianguloy.urlchecker.R;
import org.json.JSONException;
import org.json.JSONObject;
/**
* @see this#show
*/
public class JsonEditor {
public interface Listener {
/**
* Current data that the user wants to save.
* Return true if it is ok and the dialog should be dismissed, false otherwise.
*/
boolean onSave(JSONObject content);
}
/**
* Displays a generic editor for json content.
*/
public static void show(JSONObject content, JSONObject reset, int description, Activity cntx, Listener onSave) {
// prepare dialog content
View views = cntx.getLayoutInflater().inflate(R.layout.json_editor, null);
views.<TextView>findViewById(R.id.description).setText(description);
// init rules
EditText data = views.findViewById(R.id.data);
data.setText(noFailToString(content));
// formatter
views.findViewById(R.id.format).setOnClickListener(v -> {
try {
data.setText(new JSONObject(data.getText().toString()).toString(2));
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(cntx, R.string.toast_invalid, Toast.LENGTH_SHORT).show();
}
});
// prepare dialog
AlertDialog dialog = new AlertDialog.Builder(cntx)
.setView(views)
.setPositiveButton(R.string.save, null) // set below
.setNegativeButton(android.R.string.cancel, null)
.setNeutralButton(R.string.reset, null) // set below
.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 -> {
try {
if (onSave.onSave(new JSONObject(data.getText().toString()))) {
dialog.dismiss();
}
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(cntx, R.string.toast_invalid, Toast.LENGTH_SHORT).show();
}
});
dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v -> {
// clear catalog and reload internal
data.setText(noFailToString(reset));
});
}
/**
* Formats a json into a valid string that doesn't throws a JSON exception
* (as a function because I needed a final string)
*/
private static String noFailToString(JSONObject content) {
try {
return content.toString(2);
} catch (JSONException e) {
// panic, don't format then
return content.toString();
}
}
}

View File

@ -11,7 +11,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.dialogs.JsonEditor;
import com.trianguloy.urlchecker.activities.JsonEditorInterface;
import com.trianguloy.urlchecker.utilities.generics.GenericPref;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
import com.trianguloy.urlchecker.utilities.methods.HttpUtils;
@ -31,7 +31,7 @@ import java.util.List;
/**
* Manages the local catalog with the rules
*/
public class ClearUrlCatalog {
public class ClearUrlCatalog implements JsonEditorInterface {
/* ------------------- constants ------------------- */
@ -182,16 +182,34 @@ public class ClearUrlCatalog {
* Show the rules editor dialog
*/
public void showEditor() {
JsonEditor.show(getCatalog(), getBuiltIn(), R.string.mClear_editor, cntx, content -> {
if (setRules(content, false) != Result.ERROR) {
// saved data, close dialog
return true;
} else {
// invalid data, keep dialog and show why
Toast.makeText(cntx, R.string.toast_invalid, Toast.LENGTH_LONG).show();
return false;
}
});
showEditor(cntx);
}
@Override
public JSONObject getJson() {
return getCatalog();
}
@Override
public JSONObject getBuiltInJson() {
return getBuiltIn();
}
@Override
public String saveJson(JSONObject data) {
if (setRules(data, false) != Result.ERROR) {
// saved data, close dialog
return null;
} else {
// invalid data, keep dialog and show why
Toast.makeText(cntx, R.string.toast_invalid, Toast.LENGTH_LONG).show();
return "Invalid";
}
}
@Override
public int getEditorDescription() {
return R.string.mClear_editor;
}
/**

View File

@ -9,7 +9,6 @@ import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.generics.JsonCatalog;
import com.trianguloy.urlchecker.utilities.methods.HttpUtils;
import com.trianguloy.urlchecker.utilities.methods.JavaUtils;
import com.trianguloy.urlchecker.utilities.methods.StreamUtils;
import com.trianguloy.urlchecker.utilities.wrappers.InternalFile;
import com.trianguloy.urlchecker.utilities.wrappers.ProgressDialog;
@ -55,7 +54,7 @@ public class Hosts {
);
if (showEditor) builder
.setNeutralButton(R.string.json_edit, (dialog, which) -> data.showEditor());
.setNeutralButton(R.string.json_editor, (dialog, which) -> data.showEditor());
builder.show();
}

View File

@ -1,6 +1,5 @@
package com.trianguloy.urlchecker.modules.companions;
import android.app.Activity;
import android.content.Context;
import com.trianguloy.urlchecker.R;
@ -15,7 +14,7 @@ import org.json.JSONObject;
*/
public class PatternCatalog extends JsonCatalog {
public PatternCatalog(Activity cntx) {
public PatternCatalog(Context cntx) {
super(cntx, "patterns", R.string.mPttrn_editor);
}

View File

@ -1,9 +1,8 @@
package com.trianguloy.urlchecker.utilities.generics;
import android.app.Activity;
import android.content.Context;
import com.trianguloy.urlchecker.dialogs.JsonEditor;
import com.trianguloy.urlchecker.activities.JsonEditorInterface;
import com.trianguloy.urlchecker.utilities.wrappers.InternalFile;
import org.json.JSONException;
@ -12,13 +11,13 @@ import org.json.JSONObject;
/**
* Represents a generic catalog
*/
public abstract class JsonCatalog {
public abstract class JsonCatalog implements JsonEditorInterface {
private final Activity cntx;
private final Context cntx;
private final InternalFile custom;
private final int editorDescription;
public JsonCatalog(Activity cntx, String fileName, int editorDescription) {
public JsonCatalog(Context cntx, String fileName, int editorDescription) {
this.cntx = cntx;
this.editorDescription = editorDescription;
custom = new InternalFile(fileName, cntx);
@ -71,11 +70,30 @@ public abstract class JsonCatalog {
return custom.set(content.toString());
}
/**
* Shows a dialog to manually edit the catalog
*/
@Override
public JSONObject getJson() {
return getCatalog();
}
@Override
public JSONObject getBuiltInJson() {
return getBuiltIn();
}
@Override
public String saveJson(JSONObject data) {
return save(data) ? null : "Unable to save";
}
@Override
public int getEditorDescription() {
return editorDescription;
}
public void showEditor() {
JsonEditor.show(getCatalog(), getBuiltIn(), editorDescription, cntx, this::save);
showEditor(cntx);
}
}

View File

@ -14,9 +14,7 @@ import java.util.List;
*/
public interface JavaUtils {
/**
* Converts an iterator to a list
*/
/** Converts an iterator to a list */
static <T> List<T> toList(Iterator<T> iterator) {
List<T> list = new ArrayList<>();
while (iterator.hasNext()) {
@ -25,9 +23,7 @@ public interface JavaUtils {
return list;
}
/**
* Converts a string into a json object, returns empty on failure
*/
/** Converts a string into a json object, returns empty on failure */
static JSONObject toJson(String content) {
try {
return new JSONObject(content);
@ -37,9 +33,7 @@ public interface JavaUtils {
}
}
/**
* Clamps a value between two other values.
*/
/** Clamps a value between two other values. */
static int clamp(int min, int value, int max) {
return min <= max ? Math.max(min, Math.min(value, max))
// just in case
@ -108,17 +102,13 @@ public interface JavaUtils {
else list.add(element);
}
/**
* java.util.function.Consumer requires api 24
*/
/** java.util.function.Consumer requires api 24 */
@FunctionalInterface
interface Consumer<T> {
void accept(T t);
}
/**
* java.util.function.Function requires api 24
*/
/** java.util.function.Function requires api 24 */
@FunctionalInterface
interface Function<T, R> {
R apply(T t);
@ -129,9 +119,7 @@ public interface JavaUtils {
return t -> !function.apply(t);
}
/**
* java.util.function.UnaryOperator requires api 24
*/
/** java.util.function.UnaryOperator requires api 24 */
@FunctionalInterface
interface UnaryOperator<T> extends Function<T, T> {
}

View File

@ -5,6 +5,6 @@
android:width="24dp"
xmlns:android="http://schemas.android.com/apk/res/android">
<path
android:fillColor="@color/app"
android:fillColor="@android:color/white"
android:pathData="M9.4,16.6L4.8,12l4.6,-4.6L8,6l-6,6 6,6 1.4,-1.4zM14.6,16.6l4.6,-4.6 -4.6,-4.6L16,6l6,6 -6,6 -1.4,-1.4z" />
</vector>

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="match_parent"
android:orientation="vertical">
<ScrollView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/json_info" />
</ScrollView>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"
android:fillViewport="true">
<EditText
android:id="@+id/data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:hint="{...}"
android:inputType="textMultiLine" />
</ScrollView>
</LinearLayout>

View File

@ -53,7 +53,7 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/json_edit" />
android:text="@string/json_editor" />
</LinearLayout>
</LinearLayout>

View File

@ -14,13 +14,15 @@
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="match_parent"
android:layout_weight="1"
android:text="@string/json_edit" />
<Button
android:id="@+id/edit"
style="?android:attr/buttonBarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/json_editor" />
<Button
android:id="@+id/rebuild"
style="?android:attr/buttonBarButtonStyle"
@ -30,4 +32,4 @@
android:text="@string/mHosts_build" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@ -14,7 +14,7 @@
style="?android:attr/buttonBarButtonStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/json_edit" />
android:text="@string/json_editor" />
<Switch
android:id="@+id/regex_fix"

View File

@ -1,51 +0,0 @@
<?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"
android:orientation="vertical"
android:padding="@dimen/smallPadding">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:text="@string/json_desc" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:background="?android:attr/listDivider" />
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<EditText
android:id="@+id/data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="start|top"
android:inputType="textMultiLine" />
<ImageButton
android:id="@+id/format"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|top|end"
android:src="@drawable/format" />
</FrameLayout>
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_format"
android:icon="@drawable/format"
android:showAsAction="ifRoom"
android:title="@string/format" />
<item
android:id="@+id/menu_save"
android:icon="@android:drawable/ic_menu_save"
android:showAsAction="ifRoom"
android:title="@string/save" />
<item
android:id="@+id/menu_discard"
android:showAsAction="ifRoom"
android:title="@string/discard" />
<item
android:id="@+id/menu_reset"
android:showAsAction="ifRoom"
android:title="@string/reset" />
<item
android:id="@+id/menu_show_info"
android:showAsAction="ifRoom"
android:checkable="true"
android:checked="true"
android:title="@string/json_info" />
</menu>

View File

@ -91,7 +91,7 @@
<string name="next">التالي</string>
<string name="back">السابق</string>
<string name="dismiss">تجاهل</string>
<string name="json_edit">محرر متقدم</string>
<string name="json_editor">محرر متقدم</string>
<string name="shortcut_checkClipboard">التحقق من عناوين الويب URLs الموجودة في الحافظة</string>
<string name="mPttrn_name">فحص النمط</string>
<string name="mPttrn_regexfix">إصلاح مجموعات الفحص النمطية الاختيارية (تعطيلها إذا كان الفحص النمطي لا يعمل بشكل صحيح)</string>
@ -163,7 +163,6 @@
<string name="btn_tutorialEnd">إنهاء الدليل التعليمي</string>
<string name="reset">إعادة الضبط</string>
<string name="noLinks">لم يتم اكتشاف أي روابط</string>
<string name="json_desc">[ميزة تجريبية] هذا محرر متقدم، يجب تنسيق المحتوى إلى JSON صالح. يمكنك الضغط على الزر في الزاوية العلوية اليمنى لتنسيقه والتحقق من صحته.</string>
<string name="mPttrn_desc">هذه الوحدة تقوم بفحص عنوان الويب باستخدام أنماط الفحص النمطية التي تحذر، تقترح أو تطبق الاستبدالات. يمكنك تعديل أو إنشاء أنماط خاصة بك، أو حتى استخدام أنماط تم إنشاؤها من قبل المستخدمين.
\nالأنماط المضمنة تشمل:
\n- تحذير عندما يحتوي على أحرف غير ascii مثل الحروف اليونانية. يمكن استخدام هذا للصيد الاحتيالي: googĺe.com بدلاً من google.com

View File

@ -122,7 +122,7 @@
\n- \'enabled\': boolean: nastavte na false, abyste vzor deaktivovali.
\nPoznámka: Pokud si vzory upravíte, nové výchozí vzory z aktualizací aplikace se automaticky nepřidají (můžete je obnovit pomocí možnosti reset).</string>
<string name="mOpen_with">Otevřít v %s</string>
<string name="json_edit">Pokročilý editor</string>
<string name="json_editor">Pokročilý editor</string>
<string name="link_changelog">Seznam změn</string>
<string name="txt_conf">Zde jsou uvedeny všechny dostupné moduly, u kterých si můžete zkontrolovat jejich popis a nastavení. Můžete také změnit jejich pořadí, přepnout viditelnost názvu či je povolit/zakázat.</string>
<string name="txt_openLinks">Otevírání odkazů v této aplikaci: V průběhu let Android změnil způsob nastavení otevírání odkazů a značně se tak liší mezi jednotlivými verzemi. Níže najdete výběr možných kroků nastavení pro vaše zařízení. Pokud se odkazy v této aplikaci neotevírají, vyzkoušejte je všechny.</string>
@ -145,7 +145,6 @@
\n
\nSeznam modulů otevřete na hlavní obrazovce nebo klepnutím na tlačítko níže.</string>
<string name="back">Zpět</string>
<string name="json_desc">[Funkce v betě] Toto je pokročilý editor, obsah musí být naformátován do platného JSON. Stisknutím pravého horního tlačítka jej naformátujete a potvrdíte.</string>
<string name="shortcut_checkClipboard">Najít URL odkaz(y) ve schránce</string>
<string name="mPttrn_desc">Tento modul kontroluje adresu URL pomocí vzorů regulárních výrazů (regex), které varují, navrhují či nahrazují. Můžete upravovat nebo vytvářet své vlastní vzory, nebo dokonce používat ty vytvořené uživatelem.
\nMezi vestavěné vzory patří:

View File

@ -34,7 +34,7 @@
<string name="deviceDefault">Geräte-Standard</string>
<string name="next">Weiter</string>
<string name="back">Zurück</string>
<string name="json_edit">Erweiterter Editor</string>
<string name="json_editor">Erweiterter Editor</string>
<string name="shortcut_checkClipboard">URLs aus der Zwischenablage prüfen</string>
<string name="txt_sample">Tippen Sie zum Testen auf folgenden Link:</string>
<string name="a_modules">Module</string>
@ -56,7 +56,6 @@
<string name="translators">T</string>
<string name="txt_info">Diese App fungiert als Zwischenschritt beim Öffnen angeklickter Links. Wenn diese App zum Öffnen ausgewählt wurde, wird ein Dialog mit einigen Informationen über den Link angezeigt. Über den Module-Button unten können Sie alle verfügbaren Module prüfen und konfigurieren.</string>
<string name="menu_toggleDecorations">Alle Titel umschalten</string>
<string name="json_desc">[Beta-Funktion] Dies ist ein erweiterter Editor, der Inhalt muss gültiges JSON sein. Sie können die Schaltfläche oben rechts drücken, um das JSON zu formatieren und zu validieren.</string>
<string name="mPttrn_name">Muster (RegEx)</string>
<string name="mOpen_name">Öffnen und Teilen</string>
<string name="mOpen_ctabs">Benutzerdefinierte Tabs:</string>

View File

@ -99,8 +99,15 @@ Hay algunos enlaces cuyo único propósito es redirigirte a otro enlace. Si el e
<!--
json
-->
<string name="json_desc">[Funcionalidad beta] Este es un editor avanzado, el contenido debe ser JSON válido. Puedes pulsar el botón de arriba a la derecha para formatearlo y validarlo.</string>
<string name="json_edit">Editor avanzado</string>
<string name="json_editor">Editor JSON</string>
<string name="json_info">Mostrar información</string>
<string name="json_ignore">El contenido no es JSON válido. Quieres descartarlo y cerrar el editor?</string>
<string name="json_discard_close">Descartar y cerrar</string>
<string name="json_save">Hay cambios sin guardar, quieres guardarlos o descartarlos?</string>
<string name="json_save_error">No se ha podido guardar: %s</string>
<string name="json_format_error">El contenido no es JSON válido, no se puede validar.</string>
<string name="json_discard">Cuidado, esto reemplazará el contenido del editor con el json guardado. Todos los cambios realizados se perderán. Quieres continuar?</string>
<string name="json_reset">Cuidado, esto reemplazará el contenido del editor con el json por defecto. Todos los cambios realizados se perderán, aunque el contenido guardado no se modificará a no ser que se guarde manualmente. Quieres continuar?</string>
<!--
shortcuts
-->

View File

@ -95,8 +95,7 @@ Ceci est le didacticiel, si vous souhaitez l'ignorer vous pouvez le faire en uti
<!--
json
-->
<string name="json_desc">[Fonctionnalité bêta] Il s\'agit d\'un éditeur avancé, le contenu doit être formaté en JSON valide. Vous pouvez appuyer sur le bouton en haut à droite pour le formater et le valider.</string>
<string name="json_edit">Éditeur avancé</string>
<string name="json_editor">Éditeur avancé</string>
<!--
shortcuts
-->

View File

@ -50,7 +50,6 @@
<string name="mPttrn_wrongSchemaHttp">अमान्य http scheme बड़ा किया।</string>
<string name="mChg_current">वर्तमान संस्करण: %s</string>
<string name="mPttrn_regexfix">वैकल्पिक regex समूहों को ठीक करें (यदि regex सही ढंग से काम नहीं कर रहा है तो अक्षम करें)</string>
<string name="json_desc">[बीटा सुविधा] यह एक उन्नत संपादक है, सामग्री को वैध JSON में स्वरूपित किया जाना चाहिए। आप इसे प्रारूपित करने और सत्यापित करने के लिए शीर्ष-दाएं बटन दबा सकते हैं।</string>
<string name="mPttrn_http">HTTP लिंक। HTTPS का उपयोग विचारें।</string>
<string name="next">अगला</string>
<string name="mPttrn_userContent">उपयोगकर्ता द्वारा बनाए गए अन्य उपयोगी पैटर्न की सूची: %s</string>
@ -85,7 +84,7 @@
<string name="mPttrn_fix">लागू</string>
<string name="mPttrn_noSchemeHttp">HTTP scheme अनुपलब्ध।</string>
<string name="mPttrn_wrongSchemaHttps">अमान्य https scheme बड़ा किया।</string>
<string name="json_edit">उन्नत संपादक</string>
<string name="json_editor">उन्नत संपादक</string>
<string name="mPttrn_fixed">लागू किया - %s</string>
<string name="mOpen_clipboard">यूआरएल क्लिपबोर्ड पर कॉपी किया गया</string>
<string name="share">साझा</string>

View File

@ -58,7 +58,6 @@
<string name="mClear_desc">Modul ini menghilangkan pelacakan, perujuk, dan parameter lain yang tidak bermanfaat di URL. Ia juga bisa melacak pengalihan URL luring yang umum digunakan.</string>
<string name="mVT_connectError">Tidak dapat melakukan koneksi ke VirusTotal. Pastikan Anda terhubung ke internet, atau coba lagi nanti.</string>
<string name="mPttrn_regexfix">Perbaiki grup regex yang opsional (nonaktifkan jika regex tidak bekerja dengan baik)</string>
<string name="json_desc">[Fitur beta] Berikut ini adalah editor tingkat lanjut, konten terkait harus berupa JSON yang valid. Anda bisa menekan tombol di sebelah kanan atas untuk memformat dan memvalidasinya.</string>
<string name="mPttrn_http">Link HTTP. Pertimbangkan untuk beralih ke HTTPS.</string>
<string name="mStatus_check">Cek status</string>
<string name="mD_desc">Jika Anda mengubah urutan modul, modul baru yang ditambahkan pada pembaruan selanjutnya akan diletakkan di atas modul ini.
@ -152,7 +151,7 @@
<string name="mPttrn_fix">Terapkan</string>
<string name="mPttrn_noSchemeHttp">Skema HTTP tidak ditemukan.</string>
<string name="mPttrn_wrongSchemaHttps">Skema https tidak valid.</string>
<string name="json_edit">Editor tingkat lanjut</string>
<string name="json_editor">Editor tingkat lanjut</string>
<string name="mPttrn_fixed">%s - telah diterapkan</string>
<string name="mD_name">Modul Awakutu/Penanda</string>
<string name="mOpen_clipboard">URL telah disalin ke papan klip</string>

View File

@ -57,8 +57,7 @@ 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>
<string name="json_editor">Editor avanzato</string>
<!-- modules -->
<string name="mPttrn_name">Controllo dei pattern</string>
<string name="mPttrn_desc">"Controlla cose comuni nell'url. Patterns inclusi:

View File

@ -31,8 +31,7 @@
<string name="save">להציל</string>
<string name="reset">איפוס</string>
<string name="share">שתף אפליקציה</string>
<string name="json_desc">[תכונת בטא] זהו עורך מתקדם, התוכן חייב להיות בפורמט ל-JSON חוקי. אתה יכול ללחוץ על הכפתור הימני העליון כדי לעצב ולאמת אותו.</string>
<string name="json_edit">עורך מתקדם</string>
<string name="json_editor">עורך מתקדם</string>
<!-- modules -->
<string name="mPttrn_name">בודק דפוסים</string>
<string name="mPttrn_desc">"בודק בעיות נפוצות בכתובת האתר. דפוסים מובנים:

View File

@ -57,8 +57,7 @@
<string name="share">このアプリを友達に自慢する</string>
<string name="canceled">キャンセルされました</string>
<string name="deviceDefault">デバイスの設定に従う</string>
<string name="json_desc">[ベータ機能] これは上級者向けのエディタです。内容は有効な JSON にフォーマットされている必要があります。右上のボタンをタップすると、フォーマット・検証ができます。</string>
<string name="json_edit">上級者向けエディタ</string>
<string name="json_editor">上級者向けエディタ</string>
<!-- modules -->
<string name="mPttrn_name">パターンチェッカー</string>
<string name="mPttrn_desc">"正規表現パターンで URL をチェックし、警告・提案・置換をします。パターンは変更したり、独自に作成したり、あるいは他のユーザーが作成したものを使用することもできます。

View File

@ -85,12 +85,11 @@
<string name="mClear_editor">카탈로그 규칙: https://docs.clearurls.xyz/latest/specs/rules/ 의 형식을 따라야 합니다.
\n부모 객체인 \'providers\'는 업데이트되었을 때 덮어씌어진다는 점을 주의하세요. 만약 개인적으로 규칙을 만들고 싶다면 아무 이름이나로 다른 부모 객체를 만들어서 규칙을 설정하세요.</string>
<string name="toast_invalid">유효하지 않음</string>
<string name="json_desc">[베타 기능] 이 고급 편집에서는 유효한 JSON 파일이 반드시 포함되어야 합니다. 오른쪽 위 버튼을 눌러서 유효한지 확인하세요.</string>
<string name="clear">지우기</string>
<string name="shortcut_checkClipboard">클립보드에서 URL 확인하기</string>
<string name="mVT_warningUrl">주의: %d/%d 엔진이 URL을 감지했습니다. (%s 기준)</string>
<string name="mVT_scan">스캔하기</string>
<string name="json_edit">고급 편집</string>
<string name="json_editor">고급 편집</string>
<string name="mVT_tm">VirusTotal™은 Google, Inc.의 트레이드마크입니다.</string>
<string name="mVT_scanning">스캔 중…</string>
<string name="mVT_desc">이 모듈이 활성화되어 있을 때 VirusTotal을 이용해 URL을 검사할 수 있습니다. 개인 VirusTotal API 키가 필요하며, 키는 https://www.virustotal.com/gui/join-us 에서 무료로 회원가입 후 받을 수 있습니다.</string>

View File

@ -26,7 +26,7 @@
<string name="deviceDefault">Enhetsforvalg</string>
<string name="next">Neste</string>
<string name="back">Tilbake</string>
<string name="json_edit">Avansert tekstbehandler</string>
<string name="json_editor">Avansert tekstbehandler</string>
<string name="mPttrn_fix">Bruk</string>
<string name="shortcut_checkClipboard">Sjekk nettadresser fra utklippstavlen</string>
<string name="mPttrn_http">HTTP-lenke. Overvei å bruke HTTPS.</string>

View File

@ -20,7 +20,6 @@
<string name="btn_tutorialSettings">Herhaal tutorial</string>
<string name="mVT_connectError">Kan geen verbinding maken met VirusTotal. Zorg ervoor dat u verbonden bent met internet of probeer het later opnieuw.</string>
<string name="mPttrn_regexfix">Optionele regex-groepen repareren (uitschakelen als regex niet correct werkt)</string>
<string name="json_desc">[Bètafunctie] Dit is een geavanceerde editor, de inhoud moet worden opgemaakt in geldige JSON. U kunt op de knop rechtsboven drukken om deze te formatteren en te valideren.</string>
<string name="tutorial">Tutorial</string>
<string name="toast_defaultSet">De app is nu de standaardwebbrowser</string>
<string name="mPttrn_http">HTTP-link. Overweeg het gebruik van HTTPS.</string>
@ -155,7 +154,7 @@
\n
\nOpen de lijst met modules vanuit het hoofdscherm of door op de onderstaande knop te tikken.</string>
<string name="mPttrn_wrongSchemaHttps">Ongeldig hoofdlettergebruik van https-schema.</string>
<string name="json_edit">Geavanceerde editor</string>
<string name="json_editor">Geavanceerde editor</string>
<string name="mPttrn_fixed">Toegepast - %s</string>
<string name="mD_name">Debug/Marker-module</string>
<string name="mOpen_clipboard">URL gekopieerd naar klembord</string>

View File

@ -7,7 +7,7 @@
<string name="tutorial">Tutorial</string>
<string name="canceled">Cancelado</string>
<string name="next">Próximo</string>
<string name="json_edit">Editor avançado</string>
<string name="json_editor">Editor avançado</string>
<string name="defaultOff">Desabilitado por padrão</string>
<string name="mClear_clear">Aplicar</string>
<string name="mLog_empty">Sem dados</string>
@ -129,7 +129,6 @@
<string name="mClear_tm">Catálogo embutido copiado do ClearURLs: https://docs.clearurls.xyz/latest/specs/rules/</string>
<string name="mClear_blocked">- BLOQUEADO!</string>
<string name="mClear_exception">- ignorado devido a exceção %s</string>
<string name="json_desc">[Função Beta] Este é um editor avançado, o conteúdo deve ser formatado em JSON válido. Você pode pressionar o botão no canto superior direito para formatá-lo e validá-lo.</string>
<string name="mPttrn_noSchemeHttps">Esquema HTTPS ausente.</string>
<string name="mPttrn_ok">Não há padrões correspondentes.</string>
<string name="mStatus_autoCheck">Verifique automaticamente as URLs que correspondem ao seguinte padrão de expressão regular. Aviso! É aconselhável especificar um padrão restritivo (e não .* para todos) caso contrário, servidores mal-intencionados podem registrar seu endereço IP.</string>

View File

@ -68,8 +68,7 @@ Translations: %s."</string>
<!--
json
-->
<string name="json_desc">[Função Beta] Isto é um editor avançado, o conteudo tem que estar formatado em JSON válido. Podes pressionar o botão no canto superior direito para formatar e validar.</string>
<string name="json_edit">Editor Avançado</string>
<string name="json_editor">Editor Avançado</string>
<!--
modules
-->

View File

@ -98,8 +98,7 @@
<string name="deviceDefault">Dispozitiv implicit</string>
<string name="next">Următor</string>
<string name="back">Înapoi</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="json_editor">Editor avansat</string>
<string name="mPttrn_desc">Acest modul verifică adresa URL cu modele regex care avertizează, sugerează sau aplică înlocuiri. Puteți modifica sau crea propriile modele sau chiar să le utilizați pe cele create de utilizator.
\nModelele încorporate includ:
\n- 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

View File

@ -76,7 +76,7 @@
\nВажно: Все действия выполняются вручную. Приложение не будет ничего модифицировать, а также не будет подключаться к интернету, если вы отдельно не разрешите этого, но некоторые действия при вашем желании могут применяться автоматически.
\n
\nОткройте список модулей на главном экране или нажав на кнопку ниже.</string>
<string name="json_edit">Продвинутый редактор</string>
<string name="json_editor">Продвинутый редактор</string>
<string name="share">Поделиться</string>
<string name="defaultOff">Выключено по умолчанию</string>
<string name="title_choose">Выберите приложение</string>
@ -89,7 +89,6 @@
<string name="mClear_lastUpdate">Последнее обновление:</string>
<string name="mVT_connectError">Невозможно подключиться к VirusTotal. Удостоверьтесь, что вы подключены к интернету, или попробуйте позже.</string>
<string name="mPttrn_regexfix">Исправить необязательные группы регулярных выражений (отключите, если регулярные выражения работают неправильно)</string>
<string name="json_desc">[Бета-функция] Это продвинутый редактор, содержимое обязано быть форматировано в допустимый JSON. Вы можете нажать кнопку в правом верхнем углу для форматирования и проверки.</string>
<string name="mPttrn_http">HTTP ссылка. Лучше использовать HTTPS.</string>
<string name="mStatus_check">Проверить состояние</string>
<string name="mD_desc">Если вы переставите модули, то те, добавленные в будущих обновлениях, будут размещены выше этого.

View File

@ -100,8 +100,7 @@ Umarım uygulamayı yararlı bulursunuz! Ve özellikler önermekten, hataları b
<!--
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>
<string name="json_editor">Gelişmiş düzenleyici</string>
<!--
shortcuts
-->

View File

@ -179,8 +179,7 @@
<string name="mOpen_closeCopy">Đóng hộp thoại sau khi sao chép</string>
<string name="dismiss">Bỏ qua</string>
<string name="back">Quay lại</string>
<string name="json_desc">[Tính năng Beta] Đây là trình chỉnh sửa nâng cao, nội dung phải được định dạng thành JSON hợp lệ. Bạn có thể nhấn nút trên cùng bên phải để định dạng và xác nhận nó.</string>
<string name="json_edit">Trình chỉnh sửa nâng cao</string>
<string name="json_editor">Trình chỉnh sửa nâng cao</string>
<string name="shortcut_checkClipboard">Kiểm tra URL từ clipboard</string>
<string name="mPttrn_name">Trình kiểm tra mẫu</string>
<string name="mPttrn_regexfix">Sửa các nhóm biểu thức chính quy tùy chọn (vô hiệu hóa nếu biểu thức chính quy không hoạt động chính xác)</string>

View File

@ -86,8 +86,7 @@
<string name="next">下一步</string>
<string name="back">返回</string>
<!-- json -->
<string name="json_desc">[测试功能] 这是一个进阶编辑器,内容必须为有效的 JSON 格式。您可以点击右上角的按钮进行格式化和验证。</string>
<string name="json_edit">进阶编辑器</string>
<string name="json_editor">进阶编辑器</string>
<!-- shortcuts -->
<string name="shortcut_checkClipboard">检查剪贴板中的链接</string>
<!-- modules -->

View File

@ -86,7 +86,7 @@
<string name="mUnshort_checking">檢查中…</string>
<string name="mClear_updateNow">立即更新</string>
<string name="mPttrn_fix">套用</string>
<string name="json_edit">進階編輯器</string>
<string name="json_editor">進階編輯器</string>
<string name="mOpen_clipboard">已將網址複製到剪貼簿</string>
<string name="share">分享</string>
<string name="mLog_edit">編輯記錄檔</string>
@ -138,7 +138,6 @@
<string name="mUnshort_name">縮址還原器</string>
<string name="mHosts_malware">廣告/惡意軟體</string>
<string name="mPttrn_ok">未與任何型樣相符</string>
<string name="json_desc">[測試版功能] 此為進階編輯器,輸入的內容必須符合 JSON 的格式規範。點選右上角的按鈕即可自動排版並驗證之。</string>
<string name="mUnshort_error">伺服器錯誤:%s</string>
<string name="mClear_noRules">未與任何規則相符</string>
<string name="mPttrn_name">型樣檢查器</string>

View File

@ -142,11 +142,20 @@ Hope you find the app useful! And don't hesitate to suggest features, report bug
<string name="small">Small</string>
<string name="normal">Normal</string>
<string name="big">Big</string>
<string name="format">Format</string>
<string name="discard">Discard</string>
<!--
json
-->
<string name="json_desc">[Beta feature] This is an advanced editor, the content must be formatted into valid JSON. You can press the top-right button to format and validate it.</string>
<string name="json_edit">Advanced editor</string>
<string name="json_editor">JSON editor</string>
<string name="json_info">Show info</string>
<string name="json_ignore">The content is not valid JSON. Do you want to discard it and close the editor?</string>
<string name="json_discard_close">Discard and close</string>
<string name="json_save">There are unsaved changes, do you want to save or discard them?</string>
<string name="json_save_error">Unable to save: %s</string>
<string name="json_format_error">The content is not valid JSON, can\'t be parsed.</string>
<string name="json_discard">Warning, this will replace the editor content with the saved json. All changes made will be lost. Do you want to continue?</string>
<string name="json_reset">Warning, this will replace the editor content with the built-in json. All editor changes made will be lost, but saved content will not be modified unless manually saved. Do you want to continue?</string>
<!--
shortcuts
-->