mirror of
https://github.com/CatimaLoyalty/Android.git
synced 2025-12-24 15:47:53 -05:00
Compare commits
1 Commits
v2.31.0
...
importExpo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd5ef267e8 |
4
.github/workflows/android.yml
vendored
4
.github/workflows/android.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
- uses: actions/checkout@v4.1.6
|
||||
- name: Fail on bad translations
|
||||
run: if grep -ri "<xliff" app/src/main/res/values*/strings.xml; then echo "Invalidly escaped translations found"; exit 1; fi
|
||||
- uses: gradle/actions/wrapper-validation@v3
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
run: ./gradlew spotbugsRelease
|
||||
- name: Archive test results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
uses: actions/upload-artifact@v4.3.3
|
||||
with:
|
||||
name: test-results
|
||||
path: app/build/reports
|
||||
|
||||
6
.github/workflows/changelog-to-fastlane.yml
vendored
6
.github/workflows/changelog-to-fastlane.yml
vendored
@@ -27,15 +27,15 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
id: checkout
|
||||
uses: actions/checkout@v4.1.7
|
||||
uses: actions/checkout@v4.1.6
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5.1.1
|
||||
uses: actions/setup-python@v5.1.0
|
||||
with:
|
||||
python-version: '3.x'
|
||||
- name: Run converter script
|
||||
run: python .scripts/changelog_to_fastlane.py
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6.1.0
|
||||
uses: peter-evans/create-pull-request@v6.0.5
|
||||
with:
|
||||
title: "Update Fastlane changelogs"
|
||||
commit-message: "Update Fastlane changelogs"
|
||||
|
||||
4
.github/workflows/contributors-to-file.yml
vendored
4
.github/workflows/contributors-to-file.yml
vendored
@@ -25,7 +25,7 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
id: checkout
|
||||
uses: actions/checkout@v4.1.7
|
||||
uses: actions/checkout@v4.1.6
|
||||
- name: Update contributors
|
||||
id: update_contributors
|
||||
uses: TheLastProject/contributors-to-file-action@v3.2.0
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
file_in_repo: app/src/main/res/raw/contributors.txt
|
||||
min_commit_count: 5
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6.1.0
|
||||
uses: peter-evans/create-pull-request@v6.0.5
|
||||
with:
|
||||
title: "Update contributors"
|
||||
commit-message: "Update contributors"
|
||||
|
||||
@@ -6,7 +6,6 @@ on:
|
||||
- main
|
||||
paths:
|
||||
- 'fastlane/**/title.txt'
|
||||
- '.scripts/generate_feature_graphic/**'
|
||||
permissions:
|
||||
actions: none
|
||||
checks: none
|
||||
@@ -25,7 +24,7 @@ jobs:
|
||||
generate-feature-graphic:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
- uses: actions/checkout@v4.1.6
|
||||
- name: Install requirements
|
||||
run: |
|
||||
sudo apt-get update
|
||||
@@ -39,7 +38,7 @@ jobs:
|
||||
- name: Generate featureGraphic.png for each language
|
||||
run: .scripts/generate_feature_graphic/generate_feature_graphic.sh
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6.1.0
|
||||
uses: peter-evans/create-pull-request@v6.0.5
|
||||
with:
|
||||
title: "Update feature graphic"
|
||||
commit-message: "Update feature graphic"
|
||||
|
||||
4
.github/workflows/gradle-update.yml
vendored
4
.github/workflows/gradle-update.yml
vendored
@@ -21,12 +21,12 @@ jobs:
|
||||
gradle-update:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
- uses: actions/checkout@v4.1.6
|
||||
- uses: obfusk/gradle-update-action@v2.0.0
|
||||
id: gradle-update
|
||||
- uses: gradle/actions/wrapper-validation@v3
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6.1.0
|
||||
uses: peter-evans/create-pull-request@v6.0.5
|
||||
with:
|
||||
title: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
|
||||
commit-message: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
|
||||
|
||||
4
.github/workflows/update-locales.yml
vendored
4
.github/workflows/update-locales.yml
vendored
@@ -25,13 +25,13 @@ jobs:
|
||||
update-locales:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.7
|
||||
- uses: actions/checkout@v4.1.6
|
||||
- name: Add new locales
|
||||
run: .scripts/new-locales.py
|
||||
- name: Update locales
|
||||
run: .scripts/locales.py
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6.1.0
|
||||
uses: peter-evans/create-pull-request@v6.0.5
|
||||
with:
|
||||
title: "Update locales"
|
||||
commit-message: "Update locales"
|
||||
|
||||
@@ -34,8 +34,8 @@ for lang in "$script_location/../../fastlane/metadata/android/"*; do
|
||||
bg|el-GR|ru-RU|uk) sed -i "s/Lexend Deca/Noto Serif/" featureGraphic.svg ;;
|
||||
hi-IN) sed -i -e "s/Yesteryear/Noto Serif Devanagari/" -e "s/Lexend Deca/Noto Serif Devanagari/" featureGraphic.svg ;;
|
||||
ja-JP) sed -i "s/Lexend Deca/Noto Serif CJK JP/" featureGraphic.svg ;;
|
||||
kn-IN) sed -i -e 's/font-size="150"/font-size="100"/' -e "s/Yesteryear/Noto Serif Kannada/" featureGraphic.svg ;;
|
||||
ko) sed -i "s/Lexend Deca/Noto Serif CJK KR/" featureGraphic.svg ;;
|
||||
kn-IN) sed -i -e 's/font-size="150"/font-size="100"/' -e 's/y="285.511"/y="235.511"/' featureGraphic.svg ;;
|
||||
zh-CN) sed -i "s/Lexend Deca/Noto Serif CJK SC/" featureGraphic.svg ;;
|
||||
zh-TW) sed -i "s/Lexend Deca/Noto Serif CJK TC/" featureGraphic.svg ;;
|
||||
*) ;;
|
||||
|
||||
@@ -24,7 +24,7 @@ sed = [
|
||||
]
|
||||
subprocess.run(sed, check=True)
|
||||
|
||||
with open("app/src/main/res/xml/locales_config.xml", "w", encoding="utf-8") as fh:
|
||||
with open("app/src/main/res/xml/locales_config.xml", "w") as fh:
|
||||
fh.write('<?xml version="1.0" encoding="utf-8"?>\n')
|
||||
fh.write('<locale-config xmlns:android="http://schemas.android.com/apk/res/android">\n')
|
||||
fh.write(' <locale android:name="en-US" />\n')
|
||||
|
||||
@@ -19,27 +19,15 @@ REPLACE_CODES = {
|
||||
STATS_URL = "https://hosted.weblate.org/api/components/catima/catima/statistics/"
|
||||
|
||||
|
||||
class Error(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def get_weblate_langs() -> List[Tuple[str, int]]:
|
||||
url = STATS_URL
|
||||
r = requests.get(STATS_URL, timeout=5)
|
||||
r.raise_for_status()
|
||||
results = []
|
||||
for _ in range(16): # avoid endless loops just in case
|
||||
r = requests.get(url, timeout=5)
|
||||
r.raise_for_status()
|
||||
data = r.json()
|
||||
for lang in data["results"]:
|
||||
if lang["code"] != "en":
|
||||
code = REPLACE_CODES.get(lang["code"], lang["code"]).replace("_", "-r")
|
||||
results.append((code, round(lang["translated_percent"])))
|
||||
url = data["next"]
|
||||
if not url:
|
||||
return sorted(results)
|
||||
if not url.split("?")[0] == STATS_URL:
|
||||
raise Error(f"Unexpected next URL: {url}")
|
||||
raise Error("Too many pages")
|
||||
for lang in r.json()["results"]:
|
||||
if lang["code"] != "en":
|
||||
code = REPLACE_CODES.get(lang["code"], lang["code"]).replace("_", "-r")
|
||||
results.append((code, round(lang["translated_percent"])))
|
||||
return sorted(results)
|
||||
|
||||
|
||||
def get_dir_langs() -> List[str]:
|
||||
@@ -54,7 +42,7 @@ def get_dir_langs() -> List[str]:
|
||||
def get_xml_langs() -> List[Tuple[str, bool]]:
|
||||
results = []
|
||||
in_section = False
|
||||
with open("app/src/main/res/values/settings.xml", encoding="utf-8") as fh:
|
||||
with open("app/src/main/res/values/settings.xml") as fh:
|
||||
for line in fh:
|
||||
if not in_section and 'name="locale_values"' in line:
|
||||
in_section = True
|
||||
@@ -71,7 +59,7 @@ def get_xml_langs() -> List[Tuple[str, bool]]:
|
||||
def update_xml_langs(langs: List[Tuple[str, bool]]) -> None:
|
||||
lines: List[str] = []
|
||||
in_section = False
|
||||
with open("app/src/main/res/values/settings.xml", encoding="utf-8") as fh:
|
||||
with open("app/src/main/res/values/settings.xml") as fh:
|
||||
for line in fh:
|
||||
if not in_section and 'name="locale_values"' in line:
|
||||
in_section = True
|
||||
@@ -82,7 +70,7 @@ def update_xml_langs(langs: List[Tuple[str, bool]]) -> None:
|
||||
else:
|
||||
continue
|
||||
lines.append(line)
|
||||
with open("app/src/main/res/values/settings.xml", "w", encoding="utf-8") as fh:
|
||||
with open("app/src/main/res/values/settings.xml", "w") as fh:
|
||||
for line in lines:
|
||||
fh.write(line)
|
||||
|
||||
|
||||
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,18 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
## v2.31.0 - 137 (2024-07-26)
|
||||
|
||||
- Allow long store names in preview to split over multiple lines
|
||||
- Option to use front of back image in thumbnail menu
|
||||
- Minor import/export fixes
|
||||
- Minor UI fixes
|
||||
|
||||
## v2.30.0 - 136 (2024-06-18)
|
||||
## Unreleased - 136
|
||||
|
||||
- Support for creating a card when sharing plain text
|
||||
- Display image type instead of barcode below images
|
||||
- Fix possible crash when trying to import a backup from the Nextcloud app
|
||||
- Improved support for devices without camera
|
||||
|
||||
## v2.29.1 - 135 (2024-05-19)
|
||||
|
||||
|
||||
26
Gemfile.lock
26
Gemfile.lock
@@ -10,17 +10,17 @@ GEM
|
||||
artifactory (3.0.17)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.3.0)
|
||||
aws-partitions (1.945.0)
|
||||
aws-sdk-core (3.197.1)
|
||||
aws-partitions (1.931.0)
|
||||
aws-sdk-core (3.196.1)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.651.0)
|
||||
aws-sigv4 (~> 1.8)
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
aws-sdk-kms (1.85.0)
|
||||
aws-sdk-core (~> 3, >= 3.197.0)
|
||||
aws-sdk-kms (1.81.0)
|
||||
aws-sdk-core (~> 3, >= 3.193.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.152.3)
|
||||
aws-sdk-core (~> 3, >= 3.197.0)
|
||||
aws-sdk-s3 (1.151.0)
|
||||
aws-sdk-core (~> 3, >= 3.194.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.8)
|
||||
aws-sigv4 (1.8.0)
|
||||
@@ -68,7 +68,7 @@ GEM
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.3.1)
|
||||
fastlane (2.221.1)
|
||||
fastlane (2.220.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
@@ -147,14 +147,14 @@ GEM
|
||||
os (>= 0.9, < 2.0)
|
||||
signet (>= 0.16, < 2.a)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.0.6)
|
||||
http-cookie (1.0.5)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.6.2)
|
||||
json (2.7.2)
|
||||
jwt (2.8.2)
|
||||
jwt (2.8.1)
|
||||
base64
|
||||
mini_magick (4.13.1)
|
||||
mini_magick (4.12.0)
|
||||
mini_mime (1.1.5)
|
||||
multi_json (1.15.0)
|
||||
multipart-post (2.4.1)
|
||||
@@ -164,15 +164,15 @@ GEM
|
||||
optparse (0.5.0)
|
||||
os (1.1.4)
|
||||
plist (3.7.1)
|
||||
public_suffix (5.1.1)
|
||||
public_suffix (5.0.5)
|
||||
rake (13.2.1)
|
||||
representable (3.2.0)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
uber (< 0.2.0)
|
||||
retriable (3.1.2)
|
||||
rexml (3.2.9)
|
||||
strscan
|
||||
rexml (3.2.8)
|
||||
strscan (>= 3.0.9)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
|
||||
@@ -21,13 +21,13 @@ android {
|
||||
applicationId = "me.hackerchick.catima"
|
||||
minSdk = 21
|
||||
targetSdk = 34
|
||||
versionCode = 137
|
||||
versionName = "2.31.0"
|
||||
versionCode = 135
|
||||
versionName = "2.29.1"
|
||||
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
multiDexEnabled = true
|
||||
|
||||
resourceConfigurations += listOf("ar", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "fi", "fr", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt-rBR", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sr", "sv", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
|
||||
resourceConfigurations += listOf("ar", "bg", "bn", "bn-rIN", "bs", "cs", "da", "de", "el-rGR", "en", "eo", "es", "es-rAR", "fi", "fr", "he-rIL", "hi", "hr", "hu", "in-rID", "is", "it", "ja", "ko", "lt", "lv", "nb-rNO", "nl", "oc", "pl", "pt-rPT", "ro-rRO", "ru", "sk", "sl", "sv", "tr", "uk", "vi", "zh-rCN", "zh-rTW")
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@@ -87,13 +87,14 @@ android {
|
||||
dependencies {
|
||||
|
||||
// AndroidX
|
||||
implementation("androidx.appcompat:appcompat:1.7.0")
|
||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
|
||||
implementation("androidx.exifinterface:exifinterface:1.3.7")
|
||||
implementation("androidx.palette:palette:1.0.0")
|
||||
implementation("androidx.preference:preference:1.2.1")
|
||||
implementation("com.google.android.material:material:1.12.0")
|
||||
implementation("com.github.yalantis:ucrop:2.2.9")
|
||||
implementation("androidx.work:work-runtime:2.9.0")
|
||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4")
|
||||
|
||||
// Splash Screen
|
||||
@@ -110,9 +111,9 @@ dependencies {
|
||||
implementation("io.wcm.tooling.spotbugs:io.wcm.tooling.spotbugs.annotations:1.0.0")
|
||||
|
||||
// Testing
|
||||
testImplementation("androidx.test:core:1.6.1")
|
||||
testImplementation("androidx.test:core:1.5.0")
|
||||
testImplementation("junit:junit:4.13.2")
|
||||
testImplementation("org.robolectric:robolectric:4.13")
|
||||
testImplementation("org.robolectric:robolectric:4.12.2")
|
||||
}
|
||||
|
||||
tasks.withType<SpotBugsTask>().configureEach {
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Depuração do Catima</string>
|
||||
</resources>
|
||||
@@ -1,4 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Catima 除錯版</string>
|
||||
</resources>
|
||||
<resources></resources>
|
||||
@@ -12,11 +12,13 @@
|
||||
<uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />
|
||||
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="23" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.camera"
|
||||
android:required="false" />
|
||||
android:required="true" />
|
||||
<uses-feature
|
||||
android:name="android.hardware.camera.autofocus"
|
||||
android:required="false" />
|
||||
@@ -188,5 +190,6 @@
|
||||
<action android:name="android.service.controls.ControlsProviderService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
<service android:name=".importexport.ImportExportWorker"/>
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@@ -4,24 +4,22 @@ import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.core.util.Consumer;
|
||||
|
||||
import com.journeyapps.barcodescanner.CaptureManager;
|
||||
import com.journeyapps.barcodescanner.DecoratedBarcodeView;
|
||||
|
||||
public class CatimaCaptureManager extends CaptureManager {
|
||||
private final Consumer<String> mErrorCallback;
|
||||
private final Context mContext;
|
||||
|
||||
public CatimaCaptureManager(Activity activity, DecoratedBarcodeView barcodeView, Consumer<String> errorCallback) {
|
||||
public CatimaCaptureManager(Activity activity, DecoratedBarcodeView barcodeView) {
|
||||
super(activity, barcodeView);
|
||||
|
||||
mErrorCallback = errorCallback;
|
||||
mContext = activity.getApplicationContext();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void displayFrameworkBugMessageAndExit(String message) {
|
||||
// We don't want to exit, as we also have a enter from card image and add manually button here
|
||||
// So, instead, we call our error callback
|
||||
mErrorCallback.accept(message);
|
||||
// So we show a toast instead
|
||||
Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.view.MenuItem;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
@@ -18,31 +18,31 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.ExistingWorkPolicy;
|
||||
import androidx.work.OneTimeWorkRequest;
|
||||
import androidx.work.OutOfQuotaPolicy;
|
||||
import androidx.work.WorkManager;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import protect.card_locker.async.TaskHandler;
|
||||
import protect.card_locker.databinding.ImportExportActivityBinding;
|
||||
import protect.card_locker.importexport.DataFormat;
|
||||
import protect.card_locker.importexport.ImportExportResult;
|
||||
import protect.card_locker.importexport.ImportExportResultType;
|
||||
import protect.card_locker.importexport.ImportExportWorker;
|
||||
|
||||
public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
private ImportExportActivityBinding binding;
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private ImportExportTask importExporter;
|
||||
|
||||
private String importAlertTitle;
|
||||
private String importAlertMessage;
|
||||
private DataFormat importDataFormat;
|
||||
@@ -52,7 +52,10 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
private ActivityResultLauncher<String> fileOpenLauncher;
|
||||
private ActivityResultLauncher<Intent> filePickerLauncher;
|
||||
|
||||
final private TaskHandler mTasks = new TaskHandler();
|
||||
private static final int PERMISSION_REQUEST_EXPORT = 100;
|
||||
private static final int PERMISSION_REQUEST_IMPORT = 101;
|
||||
|
||||
private OneTimeWorkRequest mRequestedWorkRequest;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -81,21 +84,20 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
Log.e(TAG, "Activity returned NULL uri");
|
||||
return;
|
||||
}
|
||||
// Running this in a thread prevents Android from throwing a NetworkOnMainThreadException for large files
|
||||
// FIXME: This is still suboptimal, because showing that the export started is delayed until the network request finishes
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
OutputStream writer = getContentResolver().openOutputStream(uri);
|
||||
Log.d(TAG, "Starting file export with: " + result);
|
||||
startExport(writer, uri, exportPassword.toCharArray(), true);
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Failed to export file: " + result, e);
|
||||
onExportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, result.toString()), uri);
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
|
||||
Data exportRequestData = new Data.Builder()
|
||||
.putString(ImportExportWorker.INPUT_URI, uri.toString())
|
||||
.putString(ImportExportWorker.INPUT_ACTION, ImportExportWorker.ACTION_EXPORT)
|
||||
.putString(ImportExportWorker.INPUT_FORMAT, DataFormat.Catima.name())
|
||||
.putString(ImportExportWorker.INPUT_PASSWORD, exportPassword)
|
||||
.build();
|
||||
|
||||
mRequestedWorkRequest = new OneTimeWorkRequest.Builder(ImportExportWorker.class)
|
||||
.setInputData(exportRequestData)
|
||||
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
|
||||
.build();
|
||||
|
||||
PermissionUtils.requestPostNotificationsPermission(this, PERMISSION_REQUEST_EXPORT);
|
||||
});
|
||||
fileOpenLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(), result -> {
|
||||
if (result == null) {
|
||||
@@ -164,28 +166,26 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
// Check that there is an app that data can be imported from
|
||||
Button importApplication = binding.importOptionApplicationButton;
|
||||
importApplication.setOnClickListener(v -> chooseImportType(true, null));
|
||||
}
|
||||
|
||||
// FIXME: The importer/exporter is currently quite broken
|
||||
// To prevent the screen from turning off during import/export and some devices killing Catima as it's no longer foregrounded, force the screen to stay on here
|
||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
public static OneTimeWorkRequest buildImportRequest(DataFormat dataFormat, Uri uri, char[] password) {
|
||||
Data importRequestData = new Data.Builder()
|
||||
.putString(ImportExportWorker.INPUT_URI, uri.toString())
|
||||
.putString(ImportExportWorker.INPUT_ACTION, ImportExportWorker.ACTION_IMPORT)
|
||||
.putString(ImportExportWorker.INPUT_FORMAT, dataFormat.name())
|
||||
.putString(ImportExportWorker.INPUT_PASSWORD, Arrays.toString(password))
|
||||
.build();
|
||||
|
||||
return new OneTimeWorkRequest.Builder(ImportExportWorker.class)
|
||||
.setInputData(importRequestData)
|
||||
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
|
||||
.build();
|
||||
}
|
||||
|
||||
private void openFileForImport(Uri uri, char[] password) {
|
||||
// Running this in a thread prevents Android from throwing a NetworkOnMainThreadException for large files
|
||||
// FIXME: This is still suboptimal, because showing that the import started is delayed until the network request finishes
|
||||
new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
InputStream reader = getContentResolver().openInputStream(uri);
|
||||
Log.d(TAG, "Starting file import with: " + uri);
|
||||
startImport(reader, uri, importDataFormat, password, true);
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Failed to import file: " + uri, e);
|
||||
onImportComplete(new ImportExportResult(ImportExportResultType.GenericFailure, e.toString()), uri, importDataFormat);
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
mRequestedWorkRequest = buildImportRequest(importDataFormat, uri, password);
|
||||
|
||||
PermissionUtils.requestPostNotificationsPermission(this, PERMISSION_REQUEST_IMPORT);
|
||||
}
|
||||
|
||||
private void chooseImportType(boolean choosePicker,
|
||||
@@ -250,20 +250,17 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
new MaterialAlertDialogBuilder(this)
|
||||
.setTitle(importAlertTitle)
|
||||
.setMessage(importAlertMessage)
|
||||
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
try {
|
||||
if (choosePicker) {
|
||||
final Intent intentPickAction = new Intent(Intent.ACTION_PICK);
|
||||
filePickerLauncher.launch(intentPickAction);
|
||||
} else {
|
||||
fileOpenLauncher.launch("*/*");
|
||||
}
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
.setPositiveButton(R.string.ok, (dialog1, which1) -> {
|
||||
try {
|
||||
if (choosePicker) {
|
||||
final Intent intentPickAction = new Intent(Intent.ACTION_PICK);
|
||||
filePickerLauncher.launch(intentPickAction);
|
||||
} else {
|
||||
fileOpenLauncher.launch("*/*");
|
||||
}
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(getApplicationContext(), R.string.failedOpeningFileManager, Toast.LENGTH_LONG).show();
|
||||
Log.e(TAG, "No activity found to handle intent", e);
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
@@ -272,60 +269,12 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone) {
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
|
||||
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
|
||||
@Override
|
||||
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
|
||||
onImportComplete(result, targetUri, dataFormat);
|
||||
if (closeWhenDone) {
|
||||
try {
|
||||
target.close();
|
||||
} catch (IOException ioException) {
|
||||
ioException.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
importExporter = new ImportExportTask(ImportExportActivity.this,
|
||||
dataFormat, target, password, listener);
|
||||
mTasks.executeTask(TaskHandler.TYPE.IMPORT, importExporter);
|
||||
}
|
||||
|
||||
private void startExport(final OutputStream target, final Uri targetUri, char[] password, final boolean closeWhenDone) {
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
|
||||
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener() {
|
||||
@Override
|
||||
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
|
||||
onExportComplete(result, targetUri);
|
||||
if (closeWhenDone) {
|
||||
try {
|
||||
target.close();
|
||||
} catch (IOException ioException) {
|
||||
ioException.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
importExporter = new ImportExportTask(ImportExportActivity.this,
|
||||
DataFormat.Catima, target, password, listener);
|
||||
mTasks.executeTask(TaskHandler.TYPE.EXPORT, importExporter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, true, false, false);
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, true, false, false);
|
||||
super.onDestroy();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
|
||||
if (id == android.R.id.home) {
|
||||
setResult(RESULT_CANCELED);
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
@@ -333,19 +282,19 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void retryWithPassword(DataFormat dataFormat, Uri uri) {
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
public static void retryWithPassword(Context context, DataFormat dataFormat, Uri uri) {
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context);
|
||||
builder.setTitle(R.string.passwordRequired);
|
||||
|
||||
FrameLayout container = new FrameLayout(ImportExportActivity.this);
|
||||
FrameLayout container = new FrameLayout(context);
|
||||
|
||||
final TextInputLayout textInputLayout = new TextInputLayout(ImportExportActivity.this);
|
||||
final TextInputLayout textInputLayout = new TextInputLayout(context);
|
||||
textInputLayout.setEndIconMode(TextInputLayout.END_ICON_PASSWORD_TOGGLE);
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.setMargins(50, 10, 50, 0);
|
||||
textInputLayout.setLayoutParams(params);
|
||||
|
||||
final EditText input = new EditText(ImportExportActivity.this);
|
||||
final EditText input = new EditText(context);
|
||||
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
||||
input.setHint(R.string.exportPasswordHint);
|
||||
|
||||
@@ -354,75 +303,55 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
|
||||
builder.setView(container);
|
||||
|
||||
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
|
||||
openFileForImport(uri, input.getText().toString().toCharArray());
|
||||
OneTimeWorkRequest importRequest = ImportExportActivity.buildImportRequest(dataFormat, uri, input.getText().toString().toCharArray());
|
||||
WorkManager.getInstance(context).enqueueUniqueWork(ImportExportWorker.ACTION_IMPORT, ExistingWorkPolicy.REPLACE, importRequest);
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
|
||||
|
||||
builder.show();
|
||||
}
|
||||
|
||||
private String buildResultDialogMessage(ImportExportResult result, boolean isImport) {
|
||||
int messageId;
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
if (result.resultType() == ImportExportResultType.Success) {
|
||||
messageId = isImport ? R.string.importSuccessful : R.string.exportSuccessful;
|
||||
} else {
|
||||
messageId = isImport ? R.string.importFailed : R.string.exportFailed;
|
||||
}
|
||||
|
||||
StringBuilder messageBuilder = new StringBuilder(getResources().getString(messageId));
|
||||
if (result.developerDetails() != null) {
|
||||
messageBuilder.append("\n\n");
|
||||
messageBuilder.append(getResources().getString(R.string.include_if_asking_support));
|
||||
messageBuilder.append("\n\n");
|
||||
messageBuilder.append(result.developerDetails());
|
||||
}
|
||||
|
||||
return messageBuilder.toString();
|
||||
onMockedRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
private void onImportComplete(ImportExportResult result, Uri path, DataFormat dataFormat) {
|
||||
ImportExportResultType resultType = result.resultType();
|
||||
public void onMockedRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
||||
Integer failureReason = null;
|
||||
|
||||
if (resultType == ImportExportResultType.BadPassword) {
|
||||
retryWithPassword(dataFormat, path);
|
||||
return;
|
||||
if (requestCode == PERMISSION_REQUEST_EXPORT) {
|
||||
if (granted) {
|
||||
WorkManager.getInstance(this).enqueueUniqueWork(ImportExportWorker.ACTION_EXPORT, ExistingWorkPolicy.REPLACE, mRequestedWorkRequest);
|
||||
|
||||
Toast.makeText(this, R.string.exportStartedCheckNotifications, Toast.LENGTH_LONG).show();
|
||||
|
||||
// Import/export started
|
||||
setResult(RESULT_OK);
|
||||
finish();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.postNotificationsPermissionRequired;
|
||||
} else if (requestCode == PERMISSION_REQUEST_IMPORT) {
|
||||
if (granted) {
|
||||
WorkManager.getInstance(this).enqueueUniqueWork(ImportExportWorker.ACTION_IMPORT, ExistingWorkPolicy.REPLACE, mRequestedWorkRequest);
|
||||
|
||||
// Import/export started
|
||||
setResult(RESULT_OK);
|
||||
finish();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
failureReason = R.string.postNotificationsPermissionRequired;
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.importSuccessfulTitle : R.string.importFailedTitle);
|
||||
builder.setMessage(buildResultDialogMessage(result, true));
|
||||
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
|
||||
|
||||
builder.create().show();
|
||||
}
|
||||
|
||||
private void onExportComplete(ImportExportResult result, final Uri path) {
|
||||
ImportExportResultType resultType = result.resultType();
|
||||
|
||||
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
|
||||
builder.setTitle(resultType == ImportExportResultType.Success ? R.string.exportSuccessfulTitle : R.string.exportFailedTitle);
|
||||
builder.setMessage(buildResultDialogMessage(result, false));
|
||||
builder.setNeutralButton(R.string.ok, (dialog, which) -> dialog.dismiss());
|
||||
|
||||
if (resultType == ImportExportResultType.Success) {
|
||||
final CharSequence sendLabel = ImportExportActivity.this.getResources().getText(R.string.sendLabel);
|
||||
|
||||
builder.setPositiveButton(sendLabel, (dialog, which) -> {
|
||||
Intent sendIntent = new Intent(Intent.ACTION_SEND);
|
||||
sendIntent.putExtra(Intent.EXTRA_STREAM, path);
|
||||
sendIntent.setType("text/csv");
|
||||
|
||||
// set flag to give temporary permission to external app to use the FileProvider
|
||||
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
|
||||
ImportExportActivity.this.startActivity(Intent.createChooser(sendIntent,
|
||||
sendLabel));
|
||||
|
||||
dialog.dismiss();
|
||||
});
|
||||
if (failureReason != null) {
|
||||
Toast.makeText(this, failureReason, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
builder.create().show();
|
||||
}
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import protect.card_locker.async.CompatCallable;
|
||||
import protect.card_locker.importexport.DataFormat;
|
||||
import protect.card_locker.importexport.ImportExportResult;
|
||||
import protect.card_locker.importexport.ImportExportResultType;
|
||||
import protect.card_locker.importexport.MultiFormatExporter;
|
||||
import protect.card_locker.importexport.MultiFormatImporter;
|
||||
|
||||
public class ImportExportTask implements CompatCallable<ImportExportResult> {
|
||||
private static final String TAG = "Catima";
|
||||
|
||||
private Activity activity;
|
||||
private boolean doImport;
|
||||
private DataFormat format;
|
||||
private OutputStream outputStream;
|
||||
private InputStream inputStream;
|
||||
private char[] password;
|
||||
private TaskCompleteListener listener;
|
||||
|
||||
private ProgressDialog progress;
|
||||
|
||||
/**
|
||||
* Constructor which will setup a task for exporting to the given file
|
||||
*/
|
||||
ImportExportTask(Activity activity, DataFormat format, OutputStream output, char[] password,
|
||||
TaskCompleteListener listener) {
|
||||
super();
|
||||
this.activity = activity;
|
||||
this.doImport = false;
|
||||
this.format = format;
|
||||
this.outputStream = output;
|
||||
this.password = password;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor which will setup a task for importing from the given InputStream.
|
||||
*/
|
||||
ImportExportTask(Activity activity, DataFormat format, InputStream input, char[] password,
|
||||
TaskCompleteListener listener) {
|
||||
super();
|
||||
this.activity = activity;
|
||||
this.doImport = true;
|
||||
this.format = format;
|
||||
this.inputStream = input;
|
||||
this.password = password;
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
private ImportExportResult performImport(Context context, InputStream stream, SQLiteDatabase database, char[] password) {
|
||||
ImportExportResult importResult = MultiFormatImporter.importData(context, database, stream, format, password);
|
||||
|
||||
Log.i(TAG, "Import result: " + importResult);
|
||||
|
||||
return importResult;
|
||||
}
|
||||
|
||||
private ImportExportResult performExport(Context context, OutputStream stream, SQLiteDatabase database, char[] password) {
|
||||
ImportExportResult result;
|
||||
|
||||
try {
|
||||
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
|
||||
result = MultiFormatExporter.exportData(context, database, stream, format, password);
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
result = new ImportExportResult(ImportExportResultType.GenericFailure, e.toString());
|
||||
Log.e(TAG, "Unable to export file", e);
|
||||
}
|
||||
|
||||
Log.i(TAG, "Export result: " + result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void onPreExecute() {
|
||||
progress = new ProgressDialog(activity);
|
||||
progress.setTitle(doImport ? R.string.importing : R.string.exporting);
|
||||
|
||||
progress.setOnCancelListener(dialog -> cancel(doImport, true));
|
||||
progress.setOnDismissListener(dialog -> cancel(doImport, true));
|
||||
|
||||
progress.show();
|
||||
}
|
||||
|
||||
private void cancel(boolean isImport, boolean showToast) {
|
||||
ImportExportTask.this.stop();
|
||||
|
||||
if (showToast) {
|
||||
Toast.makeText(activity, isImport ? R.string.importCancelled : R.string.exportCancelled, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
protected ImportExportResult doInBackground(Void... nothing) {
|
||||
final SQLiteDatabase database = new DBHelper(activity).getWritableDatabase();
|
||||
ImportExportResult result;
|
||||
|
||||
if (doImport) {
|
||||
result = performImport(activity.getApplicationContext(), inputStream, database, password);
|
||||
} else {
|
||||
result = performExport(activity.getApplicationContext(), outputStream, database, password);
|
||||
}
|
||||
|
||||
database.close();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void onPostExecute(Object castResult) {
|
||||
listener.onTaskComplete((ImportExportResult) castResult, format);
|
||||
|
||||
progress.dismiss();
|
||||
Log.i(TAG, (doImport ? "Import" : "Export") + " Complete");
|
||||
}
|
||||
|
||||
protected void onCancelled() {
|
||||
progress.dismiss();
|
||||
Log.i(TAG, (doImport ? "Import" : "Export") + " Cancelled");
|
||||
}
|
||||
|
||||
protected void stop() {
|
||||
// Whelp
|
||||
}
|
||||
|
||||
@Override
|
||||
public ImportExportResult call() {
|
||||
return doInBackground();
|
||||
}
|
||||
|
||||
interface TaskCompleteListener {
|
||||
void onTaskComplete(ImportExportResult result, DataFormat format);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -681,17 +681,16 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
|
||||
if (bitmap != null) {
|
||||
if (requestedFrontImage()) {
|
||||
mFrontImageRemoved = false;
|
||||
mFrontImageUnsaved = true;
|
||||
setCardImage(cardImageFront, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_BIG), true);
|
||||
} else if (requestedBackImage()) {
|
||||
mBackImageRemoved = false;
|
||||
mBackImageUnsaved = true;
|
||||
setCardImage(cardImageBack, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_BIG), true);
|
||||
} else {
|
||||
mIconRemoved = false;
|
||||
mIconUnsaved = true;
|
||||
setThumbnailImage(Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_SMALL));
|
||||
setCardImage(thumbnail, Utils.resizeBitmap(bitmap, Utils.BITMAP_SIZE_SMALL), false);
|
||||
thumbnail.setBackgroundColor(Color.TRANSPARENT);
|
||||
setColorFromIcon();
|
||||
}
|
||||
Log.d("cropper", "mRequestedImage: " + mRequestedImage);
|
||||
mCropperFinishedType = mRequestedImage;
|
||||
@@ -835,7 +834,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
setCardImage(cardImageBack, Utils.retrieveCardImage(this, tempLoyaltyCard.id, ImageLocationType.back), true);
|
||||
}
|
||||
if (!mIconUnsaved && !croppedIcon() && !mIconRemoved) {
|
||||
setThumbnailImage(Utils.retrieveCardImage(this, tempLoyaltyCard.id, ImageLocationType.icon));
|
||||
setCardImage(thumbnail, Utils.retrieveCardImage(this, tempLoyaltyCard.id, ImageLocationType.icon), false);
|
||||
}
|
||||
} else {
|
||||
setTitle(R.string.addCardTitle);
|
||||
@@ -848,7 +847,7 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
setCardImage(cardImageBack, Utils.loadTempImage(this, TEMP_UNSAVED_BACK_IMAGE_NAME), true);
|
||||
}
|
||||
if (mIconUnsaved && !croppedIcon()) {
|
||||
setThumbnailImage(Utils.loadTempImage(this, TEMP_UNSAVED_ICON_NAME));
|
||||
setCardImage(thumbnail, Utils.loadTempImage(this, TEMP_UNSAVED_ICON_NAME), false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -999,22 +998,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
}
|
||||
}
|
||||
|
||||
protected void setThumbnailImage(@Nullable Bitmap bitmap) {
|
||||
setCardImage(thumbnail, bitmap, false);
|
||||
|
||||
if (bitmap == null) {
|
||||
generateIcon(storeFieldEdit.getText().toString().trim());
|
||||
} else {
|
||||
thumbnail.setBackgroundColor(Color.TRANSPARENT);
|
||||
setColorFromIcon();
|
||||
}
|
||||
|
||||
if (tempLoyaltyCard.headerColor != null) {
|
||||
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(tempLoyaltyCard.headerColor) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(tempLoyaltyCard.headerColor) ? Color.WHITE : Color.BLACK);
|
||||
}
|
||||
}
|
||||
|
||||
protected void setCardImage(ImageView imageView, Bitmap bitmap, boolean applyFallback) {
|
||||
imageView.setTag(bitmap);
|
||||
|
||||
@@ -1342,28 +1325,6 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
return null;
|
||||
});
|
||||
|
||||
if (v.getId() == R.id.thumbnail) {
|
||||
if (cardImageFront.getTag() instanceof Bitmap) {
|
||||
cardOptions.put(getString(R.string.useFrontImage), () -> {
|
||||
mIconRemoved = false;
|
||||
mIconUnsaved = true;
|
||||
setThumbnailImage(Utils.resizeBitmap((Bitmap) cardImageFront.getTag(), Utils.BITMAP_SIZE_SMALL));
|
||||
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
if (cardImageBack.getTag() instanceof Bitmap) {
|
||||
cardOptions.put(getString(R.string.useBackImage), () -> {
|
||||
mIconRemoved = false;
|
||||
mIconUnsaved = true;
|
||||
setThumbnailImage(Utils.resizeBitmap((Bitmap) cardImageBack.getTag(), Utils.BITMAP_SIZE_SMALL));
|
||||
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
int titleResource;
|
||||
|
||||
if (v.getId() == R.id.frontImageHolder) {
|
||||
@@ -1404,13 +1365,17 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
|
||||
// We don't need to set or check the dialogId since it's only used for that single dialog
|
||||
@Override
|
||||
public void onColorSelected(int dialogId, int color) {
|
||||
// Save new colour
|
||||
updateTempState(LoyaltyCardField.headerColor, color);
|
||||
|
||||
// Unset image if set
|
||||
setCardImage(thumbnail, null, false);
|
||||
mIconRemoved = true;
|
||||
mIconUnsaved = false;
|
||||
setThumbnailImage(null);
|
||||
|
||||
updateTempState(LoyaltyCardField.headerColor, color);
|
||||
|
||||
thumbnailEditIcon.setBackgroundColor(Utils.needsDarkForeground(color) ? Color.BLACK : Color.WHITE);
|
||||
thumbnailEditIcon.setColorFilter(Utils.needsDarkForeground(color) ? Color.WHITE : Color.BLACK);
|
||||
|
||||
generateIcon(storeFieldEdit.getText().toString().trim());
|
||||
}
|
||||
|
||||
// ColorPickerDialogListener callback
|
||||
|
||||
@@ -26,9 +26,13 @@ import androidx.appcompat.view.ActionMode;
|
||||
import androidx.appcompat.widget.SearchView;
|
||||
import androidx.core.splashscreen.SplashScreen;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.WorkInfo;
|
||||
import androidx.work.WorkManager;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.google.android.material.tabs.TabLayout;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
@@ -36,11 +40,15 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import protect.card_locker.databinding.ContentMainBinding;
|
||||
import protect.card_locker.databinding.MainActivityBinding;
|
||||
import protect.card_locker.databinding.SortingOptionBinding;
|
||||
import protect.card_locker.importexport.DataFormat;
|
||||
import protect.card_locker.importexport.ImportExportWorker;
|
||||
import protect.card_locker.preferences.SettingsActivity;
|
||||
|
||||
public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCardCursorAdapter.CardAdapterListener {
|
||||
@@ -71,6 +79,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
|
||||
private ActivityResultLauncher<Intent> mBarcodeScannerLauncher;
|
||||
private ActivityResultLauncher<Intent> mSettingsLauncher;
|
||||
private ActivityResultLauncher<Intent> mImportExportLauncher;
|
||||
|
||||
private ActionMode.Callback mCurrentActionModeCallback = new ActionMode.Callback() {
|
||||
@Override
|
||||
@@ -304,6 +313,69 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
}
|
||||
});
|
||||
|
||||
mImportExportLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
|
||||
// User didn't ask for import or export
|
||||
if (result.getResultCode() != RESULT_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Watch for active imports/exports
|
||||
new Thread(() -> {
|
||||
WorkManager workManager = WorkManager.getInstance(MainActivity.this);
|
||||
|
||||
Snackbar importRunning = Snackbar.make(binding.getRoot(), R.string.importing, Snackbar.LENGTH_INDEFINITE);
|
||||
|
||||
while (true) {
|
||||
try {
|
||||
List<WorkInfo> activeImports = workManager.getWorkInfosForUniqueWork(ImportExportWorker.ACTION_IMPORT).get();
|
||||
|
||||
// We should only have one import running at a time, so it should be safe to always grab the latest
|
||||
WorkInfo activeImport = activeImports.get(activeImports.size() - 1);
|
||||
WorkInfo.State importState = activeImport.getState();
|
||||
|
||||
if (importState == WorkInfo.State.RUNNING || importState == WorkInfo.State.ENQUEUED || importState == WorkInfo.State.BLOCKED) {
|
||||
importRunning.show();
|
||||
} else if (importState == WorkInfo.State.SUCCEEDED) {
|
||||
importRunning.dismiss();
|
||||
runOnUiThread(() -> {
|
||||
Toast.makeText(getApplicationContext(), getString(R.string.importSuccessful), Toast.LENGTH_LONG).show();
|
||||
updateLoyaltyCardList(true);
|
||||
});
|
||||
|
||||
break;
|
||||
} else {
|
||||
importRunning.dismiss();
|
||||
|
||||
Data outputData = activeImport.getOutputData();
|
||||
|
||||
// FIXME: This dialog will asynchronously be accepted or declined and we don't know the status of it so we can't show the import state
|
||||
// We want to get back into this function
|
||||
// A cheap fix would be to keep looping but if the user dismissed the dialog that could mean we're looping forever...
|
||||
if (Objects.equals(outputData.getString(ImportExportWorker.OUTPUT_ERROR_REASON), ImportExportWorker.ERROR_PASSWORD_REQUIRED)) {
|
||||
runOnUiThread(() -> ImportExportActivity.retryWithPassword(
|
||||
MainActivity.this,
|
||||
DataFormat.valueOf(outputData.getString(ImportExportWorker.INPUT_FORMAT)),
|
||||
Uri.parse(outputData.getString(ImportExportWorker.INPUT_URI))
|
||||
));
|
||||
} else {
|
||||
runOnUiThread(() -> {
|
||||
Toast.makeText(getApplicationContext(), getString(R.string.importFailed), Toast.LENGTH_LONG).show();
|
||||
Toast.makeText(getApplicationContext(), activeImport.getOutputData().getString(ImportExportWorker.OUTPUT_ERROR_REASON), Toast.LENGTH_LONG).show();
|
||||
Toast.makeText(getApplicationContext(), activeImport.getOutputData().getString(ImportExportWorker.OUTPUT_ERROR_DETAILS), Toast.LENGTH_LONG).show();
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
} catch (ExecutionException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
});
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
@@ -641,7 +713,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
|
||||
|
||||
if (id == R.id.action_import_export) {
|
||||
Intent i = new Intent(getApplicationContext(), ImportExportActivity.class);
|
||||
startActivity(i);
|
||||
mImportExportLauncher.launch(i);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
package protect.card_locker;
|
||||
|
||||
import static android.content.Context.NOTIFICATION_SERVICE;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationChannel;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public class NotificationHelper {
|
||||
|
||||
// Do not change these IDs!
|
||||
public static final String CHANNEL_IMPORT = "import";
|
||||
|
||||
public static final String CHANNEL_EXPORT = "export";
|
||||
|
||||
public static final int IMPORT_ID = 100;
|
||||
public static final int IMPORT_PROGRESS_ID = 101;
|
||||
public static final int EXPORT_ID = 103;
|
||||
public static final int EXPORT_PROGRESS_ID = 104;
|
||||
|
||||
|
||||
public static Notification.Builder createNotificationBuilder(@NonNull Context context, @NonNull String channel, @NonNull int icon, @NonNull String title, @Nullable String message) {
|
||||
Notification.Builder notificationBuilder = new Notification.Builder(context)
|
||||
.setSmallIcon(icon)
|
||||
.setTicker(title)
|
||||
.setContentTitle(title);
|
||||
|
||||
if (message != null) {
|
||||
notificationBuilder.setContentText(message);
|
||||
}
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
|
||||
NotificationChannel notificationChannel = new NotificationChannel(channel, getChannelName(channel), NotificationManager.IMPORTANCE_DEFAULT);
|
||||
notificationManager.createNotificationChannel(notificationChannel);
|
||||
|
||||
notificationBuilder.setChannelId(channel);
|
||||
}
|
||||
|
||||
return notificationBuilder;
|
||||
}
|
||||
|
||||
public static void sendNotification(@NonNull Context context, @NonNull int notificationId, @NonNull Notification notification) {
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
|
||||
|
||||
notificationManager.notify(notificationId, notification);
|
||||
}
|
||||
|
||||
private static String getChannelName(@NonNull String channel) {
|
||||
switch(channel) {
|
||||
case CHANNEL_IMPORT:
|
||||
return "Import";
|
||||
case CHANNEL_EXPORT:
|
||||
return "Export";
|
||||
default:
|
||||
throw new IllegalArgumentException("Unknown notification channel");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -42,6 +42,16 @@ public class PermissionUtils {
|
||||
return ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if post notifications permission is needed
|
||||
*
|
||||
* @param activity
|
||||
* @return
|
||||
*/
|
||||
public static boolean needsPostNotificationsPermission(Activity activity) {
|
||||
return ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Call onRequestPermissionsResult after storage read permission was granted.
|
||||
* Mocks a successful grant if a grant is not necessary.
|
||||
@@ -91,4 +101,37 @@ public class PermissionUtils {
|
||||
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call onRequestPermissionsResult after notification permission was granted.
|
||||
* Mocks a successful grant if a grant is not necessary.
|
||||
*
|
||||
* @param activity
|
||||
* @param requestCode
|
||||
*/
|
||||
public static void requestPostNotificationsPermission(CatimaAppCompatActivity activity, int requestCode) {
|
||||
int[] mockedResults = new int[]{ PackageManager.PERMISSION_GRANTED };
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.TIRAMISU) {
|
||||
String[] permissions = new String[0];
|
||||
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
|
||||
return;
|
||||
}
|
||||
|
||||
String[] permissions = new String[]{ Manifest.permission.POST_NOTIFICATIONS};
|
||||
|
||||
if (needsPostNotificationsPermission(activity)) {
|
||||
ActivityCompat.requestPermissions(activity, permissions, requestCode);
|
||||
} else {
|
||||
// FIXME: This points to onMockedRequestPermissionResult instead of to
|
||||
// onRequestPermissionResult because onRequestPermissionResult was only introduced in
|
||||
// Android 6.0 (SDK 23) and we and to support Android 5.0 (SDK 21) too.
|
||||
//
|
||||
// When minSdk becomes 23, this should point to onRequestPermissionResult directly and
|
||||
// the activity input variable should be changed from CatimaAppCompatActivity to
|
||||
// Activity.
|
||||
activity.onMockedRequestPermissionsResult(requestCode, permissions, mockedResults);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,7 +78,6 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
|
||||
static final String STATE_SCANNER_ACTIVE = "scannerActive";
|
||||
private boolean mScannerActive = true;
|
||||
private boolean mHasError = false;
|
||||
|
||||
private void extractIntentFields(Intent intent) {
|
||||
final Bundle b = intent.getExtras();
|
||||
@@ -142,7 +141,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
|
||||
// Even though we do the actual decoding with the barcodeScannerView
|
||||
// CaptureManager needs to be running to show the camera and scanning bar
|
||||
capture = new CatimaCaptureManager(this, barcodeScannerView, this::onCaptureManagerError);
|
||||
capture = new CatimaCaptureManager(this, barcodeScannerView);
|
||||
Intent captureIntent = new Intent();
|
||||
Bundle captureIntentBundle = new Bundle();
|
||||
captureIntentBundle.putBoolean(Intents.Scan.BEEP_ENABLED, false);
|
||||
@@ -179,14 +178,9 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
capture.onResume();
|
||||
}
|
||||
|
||||
if (!Utils.deviceHasCamera(this)) {
|
||||
showCameraError(getString(R.string.noCameraFoundGuideText), false);
|
||||
} else if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
|
||||
showCameraPermissionMissingText();
|
||||
} else {
|
||||
hideCameraError();
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
|
||||
showCameraPermissionMissingText(false);
|
||||
}
|
||||
|
||||
scaleScreen();
|
||||
}
|
||||
|
||||
@@ -408,37 +402,12 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
}
|
||||
}
|
||||
|
||||
public void onCaptureManagerError(String errorMessage) {
|
||||
if (mHasError) {
|
||||
// We're already showing an error, ignore this new error
|
||||
return;
|
||||
}
|
||||
|
||||
showCameraError(errorMessage, false);
|
||||
}
|
||||
|
||||
private void showCameraPermissionMissingText() {
|
||||
showCameraError(getString(R.string.noCameraPermissionDirectToSystemSetting), true);
|
||||
}
|
||||
|
||||
private void showCameraError(String message, boolean setOnClick) {
|
||||
customBarcodeScannerBinding.cameraErrorLayout.cameraErrorMessage.setText(message);
|
||||
|
||||
setCameraErrorState(true, setOnClick);
|
||||
}
|
||||
|
||||
private void hideCameraError() {
|
||||
setCameraErrorState(false, false);
|
||||
}
|
||||
|
||||
private void setCameraErrorState(boolean visible, boolean setOnClick) {
|
||||
mHasError = visible;
|
||||
|
||||
customBarcodeScannerBinding.cameraErrorLayout.cameraErrorClickableArea.setOnClickListener(visible && setOnClick ? v -> {
|
||||
private void showCameraPermissionMissingText(boolean show) {
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedClickableArea.setOnClickListener(show ? v -> {
|
||||
navigateToSystemPermissionSetting();
|
||||
} : null);
|
||||
customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(visible ? obtainThemeAttribute(com.google.android.material.R.attr.colorSurface) : Color.TRANSPARENT);
|
||||
customBarcodeScannerBinding.cameraErrorLayout.getRoot().setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
customBarcodeScannerBinding.cardInputContainer.setBackgroundColor(show ? obtainThemeAttribute(com.google.android.material.R.attr.colorSurface) : Color.TRANSPARENT);
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.getRoot().setVisibility(show ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void scaleScreen() {
|
||||
@@ -448,8 +417,8 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
float mediumSizePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,MEDIUM_SCALE_FACTOR_DIP,getResources().getDisplayMetrics());
|
||||
boolean shouldScaleSmaller = screenHeight < mediumSizePx;
|
||||
|
||||
customBarcodeScannerBinding.cameraErrorLayout.cameraErrorIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
customBarcodeScannerBinding.cameraErrorLayout.cameraErrorTitle.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedIcon.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
customBarcodeScannerBinding.cameraPermissionDeniedLayout.cameraPermissionDeniedTitle.setVisibility(shouldScaleSmaller ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
|
||||
private int obtainThemeAttribute(int attribute) {
|
||||
@@ -475,11 +444,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
|
||||
boolean granted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
|
||||
if (granted) {
|
||||
hideCameraError();
|
||||
} else {
|
||||
showCameraPermissionMissingText();
|
||||
}
|
||||
showCameraPermissionMissingText(!granted);
|
||||
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE || requestCode == PERMISSION_SCAN_ADD_FROM_PDF) {
|
||||
if (granted) {
|
||||
if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
|
||||
|
||||
@@ -13,8 +13,6 @@ import android.graphics.Color;
|
||||
import android.graphics.ImageDecoder;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.pdf.PdfRenderer;
|
||||
import android.hardware.camera2.CameraAccessException;
|
||||
import android.hardware.camera2.CameraManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
@@ -39,7 +37,6 @@ import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.core.graphics.ColorUtils;
|
||||
import androidx.core.os.LocaleListCompat;
|
||||
import androidx.core.view.WindowInsetsControllerCompat;
|
||||
import androidx.core.widget.TextViewCompat;
|
||||
import androidx.exifinterface.media.ExifInterface;
|
||||
import androidx.palette.graphics.Palette;
|
||||
|
||||
@@ -942,22 +939,6 @@ public class Utils {
|
||||
if (icon != null) {
|
||||
textWhenNoImage.setVisibility(View.GONE);
|
||||
} else {
|
||||
// Manually calculate how many lines will be needed
|
||||
// This is necessary because Android's auto sizing will split over lines way before reaching the minimum font size and store names split over multiple lines are harder to scan with a quick glance so we should try to prevent it
|
||||
// Because we have to write the text before we can actually know the exact laid out size (trying to delay this causes bugs where the autosize fails) we have to take some... weird shortcuts
|
||||
|
||||
// At this point textWhenNoImage.getWidth() still returns 0, so we cheat by calculating the whole width of the screen and then dividing it by the amount of columns
|
||||
int textviewWidth = Resources.getSystem().getDisplayMetrics().widthPixels / context.getResources().getInteger(R.integer.main_view_card_columns);
|
||||
|
||||
// Calculate how wide a character is and calculate how many characters fit in a line
|
||||
int characterWidth = TextViewCompat.getAutoSizeMinTextSize(textWhenNoImage);
|
||||
int maxWidthPerLine = textviewWidth - textWhenNoImage.getPaddingStart() - textWhenNoImage.getPaddingEnd();
|
||||
|
||||
// Set amount of lines based on what could fit at most
|
||||
int maxLines = ((loyaltyCard.store.length() * characterWidth) / maxWidthPerLine) + 1;
|
||||
textWhenNoImage.setMaxLines(maxLines);
|
||||
|
||||
// Actually set the text and colour
|
||||
textWhenNoImage.setVisibility(View.VISIBLE);
|
||||
textWhenNoImage.setText(loyaltyCard.store);
|
||||
textWhenNoImage.setTextColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
|
||||
@@ -1034,12 +1015,4 @@ public class Utils {
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean deviceHasCamera(Context context) {
|
||||
try {
|
||||
return ((CameraManager) context.getSystemService(Context.CAMERA_SERVICE)).getCameraIdList().length > 0;
|
||||
} catch (CameraAccessException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,212 @@
|
||||
package protect.card_locker.importexport;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.work.Data;
|
||||
import androidx.work.ForegroundInfo;
|
||||
import androidx.work.WorkManager;
|
||||
import androidx.work.Worker;
|
||||
import androidx.work.WorkerParameters;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import protect.card_locker.DBHelper;
|
||||
import protect.card_locker.NotificationHelper;
|
||||
import protect.card_locker.R;
|
||||
|
||||
public class ImportExportWorker extends Worker {
|
||||
private final String TAG = "Catima";
|
||||
|
||||
public static final String INPUT_URI = "uri";
|
||||
public static final String INPUT_ACTION = "action";
|
||||
public static final String INPUT_FORMAT = "format";
|
||||
public static final String INPUT_PASSWORD = "password";
|
||||
|
||||
public static final String ACTION_IMPORT = "import";
|
||||
public static final String ACTION_EXPORT = "export";
|
||||
|
||||
public static final String OUTPUT_ERROR_REASON = "errorReason";
|
||||
public static final String ERROR_GENERIC = "errorTypeGeneric";
|
||||
public static final String ERROR_PASSWORD_REQUIRED = "errorTypePasswordRequired";
|
||||
public static final String OUTPUT_ERROR_DETAILS = "errorDetails";
|
||||
|
||||
public ImportExportWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
|
||||
super(context, workerParams);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Result doWork() {
|
||||
Log.e("CATIMA", "Started import/export worker");
|
||||
|
||||
Context context = getApplicationContext();
|
||||
|
||||
Data inputData = getInputData();
|
||||
|
||||
String uriString = inputData.getString(INPUT_URI);
|
||||
String action = inputData.getString(INPUT_ACTION);
|
||||
String format = inputData.getString(INPUT_FORMAT);
|
||||
String password = inputData.getString(INPUT_PASSWORD);
|
||||
|
||||
if (action.equals(ACTION_IMPORT)) {
|
||||
Log.e("CATIMA", "Import requested");
|
||||
|
||||
setForegroundAsync(createForegroundInfo(NotificationHelper.CHANNEL_IMPORT, NotificationHelper.IMPORT_PROGRESS_ID, R.string.importing));
|
||||
|
||||
ImportExportResult result;
|
||||
|
||||
InputStream stream;
|
||||
try {
|
||||
stream = context.getContentResolver().openInputStream(Uri.parse(uriString));
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
final SQLiteDatabase database = new DBHelper(context).getWritableDatabase();
|
||||
|
||||
try {
|
||||
InputStreamReader writer = new InputStreamReader(stream, StandardCharsets.UTF_8);
|
||||
result = MultiFormatImporter.importData(context, database, stream, DataFormat.valueOf(format), password.toCharArray());
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Unable to import file", e);
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.IMPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_IMPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.importFailedTitle), e.getLocalizedMessage()).build());
|
||||
|
||||
Data failureData = new Data.Builder()
|
||||
.putString(OUTPUT_ERROR_REASON, ERROR_GENERIC)
|
||||
.putString(OUTPUT_ERROR_DETAILS, e.getLocalizedMessage())
|
||||
.putString(INPUT_URI, uriString)
|
||||
.putString(INPUT_ACTION, action)
|
||||
.putString(INPUT_FORMAT, format)
|
||||
.putString(INPUT_PASSWORD, password)
|
||||
.build();
|
||||
|
||||
return Result.failure(failureData);
|
||||
}
|
||||
|
||||
Log.i(TAG, "Import result: " + result);
|
||||
|
||||
if (result.resultType() == ImportExportResultType.Success) {
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.IMPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_IMPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.importSuccessfulTitle), context.getString(R.string.importSuccessful)).build());
|
||||
|
||||
return Result.success();
|
||||
} else if (result.resultType() == ImportExportResultType.BadPassword) {
|
||||
Log.e(TAG, "Needs password, unhandled for now");
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.IMPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_IMPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.importing), context.getString(R.string.passwordRequired)).build());
|
||||
|
||||
Data failureData = new Data.Builder()
|
||||
.putString(OUTPUT_ERROR_REASON, ERROR_PASSWORD_REQUIRED)
|
||||
.putString(OUTPUT_ERROR_DETAILS, result.developerDetails())
|
||||
.putString(INPUT_URI, uriString)
|
||||
.putString(INPUT_ACTION, action)
|
||||
.putString(INPUT_FORMAT, format)
|
||||
.putString(INPUT_PASSWORD, password)
|
||||
.build();
|
||||
|
||||
return Result.failure(failureData);
|
||||
} else {
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.IMPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_IMPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.importFailedTitle), context.getString(R.string.importFailed)).build());
|
||||
|
||||
Data failureData = new Data.Builder()
|
||||
.putString(OUTPUT_ERROR_REASON, ERROR_GENERIC)
|
||||
.putString(OUTPUT_ERROR_DETAILS, result.developerDetails())
|
||||
.putString(INPUT_URI, uriString)
|
||||
.putString(INPUT_ACTION, action)
|
||||
.putString(INPUT_FORMAT, format)
|
||||
.putString(INPUT_PASSWORD, password)
|
||||
.build();
|
||||
|
||||
return Result.failure(failureData);
|
||||
}
|
||||
} else {
|
||||
Log.e("CATIMA", "Export requested");
|
||||
|
||||
setForegroundAsync(createForegroundInfo(NotificationHelper.CHANNEL_EXPORT, NotificationHelper.EXPORT_PROGRESS_ID, R.string.exporting));
|
||||
|
||||
ImportExportResult result;
|
||||
|
||||
OutputStream stream;
|
||||
try {
|
||||
stream = context.getContentResolver().openOutputStream(Uri.parse(uriString));
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
final SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
|
||||
|
||||
try {
|
||||
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
|
||||
result = MultiFormatExporter.exportData(context, database, stream, DataFormat.valueOf(format), password.toCharArray());
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "Unable to export file", e);
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.EXPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_EXPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.exportFailedTitle), e.getLocalizedMessage()).build());
|
||||
|
||||
Data failureData = new Data.Builder()
|
||||
.putString(OUTPUT_ERROR_REASON, ERROR_GENERIC)
|
||||
.putString(OUTPUT_ERROR_DETAILS, e.getLocalizedMessage())
|
||||
.putString(INPUT_URI, uriString)
|
||||
.putString(INPUT_ACTION, action)
|
||||
.putString(INPUT_FORMAT, format)
|
||||
.putString(INPUT_PASSWORD, password)
|
||||
.build();
|
||||
|
||||
return Result.failure(failureData);
|
||||
}
|
||||
|
||||
Log.i(TAG, "Export result: " + result);
|
||||
|
||||
if (result.resultType() == ImportExportResultType.Success) {
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.EXPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_EXPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.exportSuccessfulTitle), context.getString(R.string.exportSuccessful)).build());
|
||||
|
||||
return Result.success();
|
||||
} else {
|
||||
NotificationHelper.sendNotification(context, NotificationHelper.EXPORT_ID, NotificationHelper.createNotificationBuilder(context, NotificationHelper.CHANNEL_EXPORT, R.drawable.ic_import_export_white_24dp, context.getString(R.string.exportFailedTitle), context.getString(R.string.exportFailed)).build());
|
||||
|
||||
Data failureData = new Data.Builder()
|
||||
.putString(OUTPUT_ERROR_REASON, ERROR_GENERIC)
|
||||
.putString(OUTPUT_ERROR_DETAILS, result.developerDetails())
|
||||
.putString(INPUT_URI, uriString)
|
||||
.putString(INPUT_ACTION, action)
|
||||
.putString(INPUT_FORMAT, format)
|
||||
.putString(INPUT_PASSWORD, password)
|
||||
.build();
|
||||
|
||||
return Result.failure(failureData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private ForegroundInfo createForegroundInfo(@NonNull String channel, int notificationId, int title) {
|
||||
Context context = getApplicationContext();
|
||||
|
||||
String cancel = context.getString(R.string.cancel);
|
||||
// This PendingIntent can be used to cancel the worker
|
||||
PendingIntent intent = WorkManager.getInstance(context)
|
||||
.createCancelPendingIntent(getId());
|
||||
|
||||
Notification.Builder notificationBuilder = NotificationHelper.createNotificationBuilder(context, channel, R.drawable.ic_import_export_white_24dp, context.getString(title), null);
|
||||
|
||||
Notification notification = notificationBuilder
|
||||
.setOngoing(true)
|
||||
// Add the cancel action to the notification which can
|
||||
// be used to cancel the worker
|
||||
.addAction(android.R.drawable.ic_delete, cancel, intent)
|
||||
.build();
|
||||
|
||||
return new ForegroundInfo(notificationId, notification);
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,7 @@ public class MultiFormatImporter {
|
||||
break;
|
||||
}
|
||||
|
||||
String error = null;
|
||||
String error;
|
||||
if (importer != null) {
|
||||
File inputFile;
|
||||
try {
|
||||
|
||||
@@ -9,20 +9,20 @@
|
||||
tools:showIn="@layout/custom_barcode_scanner">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/camera_error_clickable_area"
|
||||
android:id="@+id/camera_permission_denied_clickable_area"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/camera_error_icon"
|
||||
android:id="@+id/camera_permission_denied_icon"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="84dp"
|
||||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/camera_error" />
|
||||
android:src="@drawable/camera_permission_denied" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/camera_error_title"
|
||||
android:id="@+id/camera_permission_denied_title"
|
||||
style="@style/TextAppearance.Material3.HeadlineLarge"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -30,12 +30,12 @@
|
||||
android:text="@string/cameraPermissionDeniedTitle" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/camera_error_message"
|
||||
android:id="@+id/camera_permission_denied_message"
|
||||
style="@style/AppTheme.TextView.NoData"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/zxing_msg_camera_framework_bug" />
|
||||
android:text="@string/noCameraPermissionDirectToSystemSetting" />
|
||||
</LinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -34,8 +34,8 @@
|
||||
android:padding="@dimen/activity_scanner_padding">
|
||||
|
||||
<include
|
||||
android:id="@+id/camera_error_layout"
|
||||
layout="@layout/camera_error_layout"
|
||||
android:id="@+id/camera_permission_denied_layout"
|
||||
layout="@layout/camera_permission_failed_layout"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
|
||||
@@ -6,5 +6,4 @@
|
||||
android:paddingRight="8dp"
|
||||
style="@style/Widget.MaterialComponents.Chip.Filter"
|
||||
app:checkedIconVisible="true"
|
||||
android:textAppearance="?android:attr/textAppearance"
|
||||
app:checkedIconTint="?attr/colorOnBackground"/>
|
||||
android:textAppearance="?android:attr/textAppearance" />
|
||||
|
||||
@@ -42,8 +42,12 @@
|
||||
android:layout_height="match_parent"
|
||||
android:textStyle="bold"
|
||||
app:autoSizeTextType="uniform"
|
||||
app:autoSizeMinTextSize="12sp"
|
||||
app:autoSizeMaxTextSize="100sp"
|
||||
app:autoSizeStepGranularity="2sp"
|
||||
android:gravity="center"
|
||||
android:padding="20dp" />
|
||||
android:maxLines="1"
|
||||
android:layout_margin="20dp" />
|
||||
|
||||
<ImageView
|
||||
android:importantForAccessibility="no"
|
||||
|
||||
@@ -6,8 +6,8 @@ Allan Nordhøy
|
||||
Heimen Stoffels
|
||||
Oğuz Ersen
|
||||
FC (Fay) Stegerman
|
||||
StoyanDimitrov
|
||||
Katharine Chui
|
||||
StoyanDimitrov
|
||||
SlavekB
|
||||
mondstern
|
||||
IllusiveMan196
|
||||
@@ -15,43 +15,41 @@ Altonss
|
||||
Michael Moroni
|
||||
GM
|
||||
Eric
|
||||
laralem
|
||||
Petr Novák
|
||||
Joel A
|
||||
laralem
|
||||
Taco
|
||||
大王叫我来巡山
|
||||
pfaffenrodt
|
||||
Aayush Gupta
|
||||
Scrambled777
|
||||
HudobniVolk
|
||||
Nyatsuki
|
||||
Giovanni Donisi
|
||||
Jiri Grönroos
|
||||
大王叫我来巡山
|
||||
Samantaz Fox
|
||||
arno-github
|
||||
Cliff Heraldo
|
||||
Sergio Paredes
|
||||
Ankit Tiwari
|
||||
Jose Delvani
|
||||
Scrambled777
|
||||
Milo Ivir
|
||||
Milan Šalka
|
||||
mdvhimself
|
||||
Balázs Meskó
|
||||
Skrripy
|
||||
huuhaa
|
||||
waffshappen
|
||||
ikanakova
|
||||
Projjal Moitra
|
||||
Quentin PAGÈS
|
||||
ikanakova
|
||||
ngocanhtve
|
||||
Silvério Santos
|
||||
waffshappen
|
||||
Ziad OUALHADJ
|
||||
Robin Liu
|
||||
Denis Shilin
|
||||
しいたけ
|
||||
Robin Liu
|
||||
Ziad OUALHADJ
|
||||
ngocanhtve
|
||||
Alexander Ivanov
|
||||
Miha Frangež
|
||||
Viet Nguyen Hoang
|
||||
Silvério Santos
|
||||
Virginie
|
||||
Michael Gangolf
|
||||
rudy3
|
||||
|
||||
@@ -267,7 +267,7 @@
|
||||
<string name="noCameraPermissionDirectToSystemSetting">لمسح الباركود، ستحتاج Catima إلى الوصول إلى الكاميرا. اضغط هنا لتغيير إعدادات الأذونات.</string>
|
||||
<string name="updateBalance">تحديث الرصيد</string>
|
||||
<string name="updateBalanceHint">أدخل المبلغ</string>
|
||||
<string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء…</string>
|
||||
<string name="storageReadPermissionRequired">الصلاحيه للوصل للتخزين مطلوبة لهذا الاجراء</string>
|
||||
<string name="validFromDate">عربيه</string>
|
||||
<string name="cameraPermissionRequired">إذن للوصول إلى الكاميرا اللازمة لهذا الإجراء…</string>
|
||||
<string name="anyDate">أي تاريخ</string>
|
||||
@@ -310,7 +310,7 @@
|
||||
<string name="enter_card_id">أدخل رقم الهوية أو النص الموجود على بطاقتك</string>
|
||||
<string name="addWithoutBarcode">إضافة بدون باركود</string>
|
||||
<string name="field_must_not_be_empty">يجب ألا يكون الحقل فارغا</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="app_name">كاتيما</string>
|
||||
<string name="settings_follow_sensor_orientation">التدوير دائمًا ( تجاهل إعدادات النظام)</string>
|
||||
<string name="add_manually_warning_title">الفحص موصى به</string>
|
||||
<string name="continue_">استمر</string>
|
||||
@@ -322,10 +322,5 @@
|
||||
<string name="errorReadingFile">لا يمكن قراءة الملف</string>
|
||||
<string name="failedLaunchingFileManager">لم يتم العثور على مدير ملفات مدعوم</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">اي من الـbarcodes تريد استخدامه؟</string>
|
||||
<string name="pageWithNumber">صفحة <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">يبدوا أن جهازك لا يمتلك كاميرا. إذا كان يمتلكها، أطفئ الجهاز وحاول مرة اخرى. اذا لم ينجح ذلك، أضغط على زر \"المزيد من الأختيارات\" في الأسفل لإضافة الباركود بطريقة أخرى.</string>
|
||||
<string name="importCancelled">تم الغاء الاستيراد</string>
|
||||
<string name="exportCancelled">تم الغاء الاستخراج</string>
|
||||
<string name="useFrontImage">استخدام صورة أمامية</string>
|
||||
<string name="useBackImage">استخدم صورة خلفية</string>
|
||||
<string name="pageWithNumber">صفحة<xliff:g>%d</xliff:g></string>
|
||||
</resources>
|
||||
@@ -295,9 +295,4 @@
|
||||
<string name="errorReadingFile">Файлът не може да бъде прочетен</string>
|
||||
<string name="failedLaunchingFileManager">Не е намерено приложение за управление на файлове</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Кой от намерените щрихкодове желаете да бъде използван?</string>
|
||||
<string name="noCameraFoundGuideText">Изглежда, устройството няма камера. Ако има опитайте да рестартирате. В противен случай използвайте бутона „Още“, за да добавите шрихкод по друг начин.</string>
|
||||
<string name="importCancelled">Внасянето е спряно</string>
|
||||
<string name="exportCancelled">Изнасянето е спряно</string>
|
||||
<string name="useFrontImage">Използване на предната страна</string>
|
||||
<string name="useBackImage">Използване на задната страна</string>
|
||||
</resources>
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Přidat</string>
|
||||
<string name="noGiftCards">Klepněte na tlačítko plus (+) pro přidání karty nebo naimportujete karty z nabídky (⋮).</string>
|
||||
<string name="noGiftCards">Klepněte na tlačítko Plus (+) pro přidání karty nebo naimportujete karty z nabídky (⋮).</string>
|
||||
<string name="storeName">Název</string>
|
||||
<string name="note">Poznámka</string>
|
||||
<string name="cardId">ID karty</string>
|
||||
@@ -302,9 +302,4 @@
|
||||
<string name="pageWithNumber">Stránka <xliff:g>%d</xliff:g></string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Který z nalezených čárových kódů chcete použít?</string>
|
||||
<string name="failedLaunchingFileManager">Nelze nalézt podporovaný správce souborů</string>
|
||||
<string name="noCameraFoundGuideText">Zdá se, že vaše zařízení nemá fotoaparát. Pokud ano, zkuste zařízení restartovat. V opačném případě použijte tlačítko Další možnosti a přidejte čárový kód jiným způsobem.</string>
|
||||
<string name="importCancelled">Import zrušen</string>
|
||||
<string name="exportCancelled">Export zrušen</string>
|
||||
<string name="useBackImage">Použijte předchozí obrázek</string>
|
||||
<string name="useFrontImage">Použijte přední obrázek</string>
|
||||
</resources>
|
||||
@@ -12,16 +12,16 @@
|
||||
<string name="edit">Bearbeiten</string>
|
||||
<string name="delete">Löschen</string>
|
||||
<string name="confirm">Bestätigen</string>
|
||||
<string name="star">Zu Favoriten hinzufügen</string>
|
||||
<string name="unstar">Aus Favoriten entfernen</string>
|
||||
<string name="star">Zu den Favoriten hinzufügen</string>
|
||||
<string name="unstar">Aus den Favoriten entfernen</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sendLabel">Senden…</string>
|
||||
<string name="sendLabel">Senden …</string>
|
||||
<string name="editCardTitle">Karte bearbeiten</string>
|
||||
<string name="addCardTitle">Neue Karte</string>
|
||||
<string name="scanCardBarcode">Barcode scannen</string>
|
||||
<string name="cardShortcut">Kartenkürzel</string>
|
||||
<string name="cardShortcut">Shortcut zu einer Karte</string>
|
||||
<string name="noCardsMessage">Füge zuerst eine Karte hinzu</string>
|
||||
<string name="noCardExistsError">Konnte die Karte nicht finden</string>
|
||||
<string name="noCardExistsError">Diese Karte konnte nicht gefunden werden</string>
|
||||
<string name="importExport">Import/Export</string>
|
||||
<string name="exportName">Export</string>
|
||||
<string name="importExportHelp">Wenn du deine Daten sicherst, kannst du sie auf ein anderes Gerät übertragen.</string>
|
||||
@@ -33,12 +33,12 @@
|
||||
<string name="exportFailed">Export konnte nicht durchgeführt werden</string>
|
||||
<string name="importing">Importiere…</string>
|
||||
<string name="exporting">Exportiere…</string>
|
||||
<string name="importOptionFilesystemTitle">Aus Dateisystem importieren</string>
|
||||
<string name="importOptionFilesystemExplanation">Eine bestimmte Datei aus dem Dateisystem auswählen.</string>
|
||||
<string name="importOptionFilesystemButton">vom Dateisystem</string>
|
||||
<string name="importOptionApplicationTitle">Andere App verwenden</string>
|
||||
<string name="importOptionFilesystemTitle">Importiere aus dem Dateisystem</string>
|
||||
<string name="importOptionFilesystemExplanation">Wähle eine Datei vom Dateisystem aus.</string>
|
||||
<string name="importOptionFilesystemButton">Wähle vom Dateisystem</string>
|
||||
<string name="importOptionApplicationTitle">Andere Anwendungen</string>
|
||||
<string name="importOptionApplicationExplanation">Beliebige Anwendung oder deinen bevorzugten Dateimanager zur Dateiauswahl verwenden.</string>
|
||||
<string name="importOptionApplicationButton">Andere App verwenden</string>
|
||||
<string name="importOptionApplicationButton">Aus anderer Anwendung</string>
|
||||
<string name="about">Über</string>
|
||||
<string name="app_license">Freie Software, lizensiert unter der GPLv3+</string>
|
||||
<string name="about_title_fmt">Über <xliff:g id="app_name">%s</xliff:g></string>
|
||||
@@ -66,7 +66,7 @@
|
||||
<string name="noGroups">Klicke auf das Pluszeichen +, um eine Gruppe hinzuzufügen.</string>
|
||||
<string name="noGroupCards">Diese Gruppe ist leer</string>
|
||||
<string name="groups">Gruppen</string>
|
||||
<string name="enter_group_name">Gruppennamen eingeben</string>
|
||||
<string name="enter_group_name">Gib einen Gruppennamen ein</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Beenden ohne zu speichern\?</string>
|
||||
<string name="leaveWithoutSaveTitle">Beenden</string>
|
||||
<string name="failedOpeningFileManager">Installiere zuerst einen Dateimanager.</string>
|
||||
@@ -95,7 +95,7 @@
|
||||
<string name="expiryStateSentence">Läuft ab: <xliff:g>%s</xliff:g></string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Sperrbildschirm verhindern</string>
|
||||
<string name="settings_keep_screen_on">Bildschirm aktiv lassen</string>
|
||||
<string name="privacy_policy_popup_text">Hinweis zum Datenschutz (von einigen App-Stores verlangt):
|
||||
<string name="privacy_policy_popup_text">Hinweis zum Datenschutz (oft gefordert):
|
||||
\n
|
||||
\nKEINE DATEN WERDEN GESAMMELT, was jeder bestätigen kann, da unsere Anwendung eine freie Software ist.</string>
|
||||
<string name="accept">Annehmen</string>
|
||||
@@ -112,10 +112,10 @@
|
||||
<string name="importCatimaMessage">Wähle deinen <i>catima.zip</i>-Export aus Catima zum Importieren aus.
|
||||
\nErstelle ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem du dort zuerst Export drückst.</string>
|
||||
<string name="importCatima">Aus Catima importieren</string>
|
||||
<string name="setBarcodeId">Barcodewert festlegen</string>
|
||||
<string name="setBarcodeId">Manuell eingeben</string>
|
||||
<string name="sameAsCardId">Entspricht Kartennummer</string>
|
||||
<string name="barcodeId">Barcodewert</string>
|
||||
<string name="errorReadingImage">Konnte das Bild nicht lesen</string>
|
||||
<string name="errorReadingImage">Bildverarbeitung fehlgeschlagen</string>
|
||||
<string name="noBarcodeFound">Kein Barcode erkannt</string>
|
||||
<string name="addFromImage">Bild aus der Galerie wählen</string>
|
||||
<string name="unsupportedBarcodeType">Dieser Barcodetyp kann noch nicht angezeigt werden. Wir hoffen das Format in einer zukünftigen Version zu unterstützen.</string>
|
||||
@@ -129,17 +129,17 @@
|
||||
<string name="updateBarcodeQuestionTitle">Barcodewert aktualisieren?</string>
|
||||
<string name="takePhoto">Foto aufnehmen</string>
|
||||
<string name="removeImage">Bild entfernen</string>
|
||||
<string name="setBackImage">Rückseite einstellen</string>
|
||||
<string name="setFrontImage">Vorderseite einstellen</string>
|
||||
<string name="setBackImage">Kartenrückseite</string>
|
||||
<string name="setFrontImage">Kartenvorderseite</string>
|
||||
<string name="photos">Fotos</string>
|
||||
<string name="frontImageDescription">Vorderseite</string>
|
||||
<string name="backImageDescription">Rückseite</string>
|
||||
<string name="frontImageDescription">Bild der Vorseite</string>
|
||||
<string name="backImageDescription">Bild der Rückseite</string>
|
||||
<string name="passwordRequired">Bitte gib das Passwort ein</string>
|
||||
<string name="importStocardMessage">Wähle deinen <i>***.zip</i>-Export aus Stocard zum Importieren aus.
|
||||
\nSie erhalten ihn, indem du eine E-Mail an support@stocardapp.com sendest und um einen Export deiner Daten bitten.</string>
|
||||
<string name="importStocard">Von Stocard importieren</string>
|
||||
<string name="turn_flashlight_off">Blitzlicht ausschalten</string>
|
||||
<string name="turn_flashlight_on">Blitzlicht einschalten</string>
|
||||
<string name="turn_flashlight_off">Licht ausschalten</string>
|
||||
<string name="turn_flashlight_on">Licht einschalten</string>
|
||||
<string name="failedGeneratingShareURL">URL konnte nicht erstellt werden. Bitte melde das an uns.</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> ausgewählt</item>
|
||||
@@ -193,10 +193,10 @@
|
||||
<string name="editGroup">Gruppe wird bearbeitet: <xliff:g>%s</xliff:g></string>
|
||||
<string name="group_edit">Gruppe bearbeiten</string>
|
||||
<string name="noGiftCardsGroup">Erstelle einige Karten und ordne sie dann hier der Gruppe zu.</string>
|
||||
<string name="setIcon">Vorschaubild festlegen</string>
|
||||
<string name="setIcon">Vorschaubild setzen</string>
|
||||
<string name="selectColor">Farbe auswählen</string>
|
||||
<string name="translate_platform">auf Weblate</string>
|
||||
<string name="shortcutSelectCard">Wähle eine Karte</string>
|
||||
<string name="shortcutSelectCard">Wählen Sie eine Karte</string>
|
||||
<string name="options">Optionen</string>
|
||||
<string name="showMoreInfo">Infos anzeigen</string>
|
||||
<string name="starred">als Favorit</string>
|
||||
@@ -233,7 +233,7 @@
|
||||
<string name="failedToRetrieveImageFile">Bilddatei konnte nicht abgerufen werden</string>
|
||||
<string name="updateBalanceTitle">Wie viel hast du ausgegeben oder erhalten?</string>
|
||||
<string name="cameraPermissionDeniedTitle">Kein Zugriff auf die Kamera möglich</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Um Strichcodes zu scannen, benötigt Catima Zugriff auf deine Kamera. Tippe hier, um deine Berechtigungseinstellungen zu ändern.</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Um Strichcodes zu scannen, benötigt Catima Zugriff auf Ihre Kamera. Tippen Sie hier, um Ihre Berechtigungseinstellungen zu ändern.</string>
|
||||
<string name="updateBalanceHint">Betrag eingeben</string>
|
||||
<string name="importCards">Karten importieren</string>
|
||||
<string name="currentBalanceSentence">Aktuelles Guthaben: <xliff:g>%s</xliff:g></string>
|
||||
@@ -245,23 +245,23 @@
|
||||
<string name="validFromSentence">Gültig ab: <xliff:g>%s</xliff:g></string>
|
||||
<string name="chooseValidFromDate">Gültig-ab-Datum wählen</string>
|
||||
<string name="anyDate">Beliebiges Datum</string>
|
||||
<string name="icon_header_click_text">Zum Bearbeiten des Vorschaubildes lang drücken</string>
|
||||
<string name="switchToBarcode">Zum Barcode wechseln</string>
|
||||
<string name="openFrontImageInGalleryApp">Vorderseite in Galerie öffnen</string>
|
||||
<string name="openBackImageInGalleryApp">Rückseite in Galerie öffnen</string>
|
||||
<string name="icon_header_click_text">Langes Drücken zum Bearbeiten der Vorschau</string>
|
||||
<string name="switchToBarcode">Umschalten auf Barcode</string>
|
||||
<string name="openFrontImageInGalleryApp">Vorderes Bild in der Galerie öffnen</string>
|
||||
<string name="openBackImageInGalleryApp">Hinteres Bild in der Galerie öffnen</string>
|
||||
<string name="height">Höhe:</string>
|
||||
<string name="switchToFrontImage">Zur Vorderseite wechseln</string>
|
||||
<string name="switchToBackImage">Zur Rückseite wechseln</string>
|
||||
<string name="switchToFrontImage">Zum vorderen Bild wechseln</string>
|
||||
<string name="switchToBackImage">Zum hinteren Bild wechseln</string>
|
||||
<string name="setBarcodeHeight">Barcode-Höhe einstellen</string>
|
||||
<string name="donate">Spenden</string>
|
||||
<string name="show_note">Notiz anzeigen</string>
|
||||
<string name="show_balance">Betrag anzeigen</string>
|
||||
<string name="show_validity">Gültigkeitsdauer anzeigen</string>
|
||||
<string name="show_name_below_image_thumbnail">Namen unter Vorschaubild anzeigen</string>
|
||||
<string name="settings_allow_content_provider_read_title">Anderen Apps den Zugriff auf meine Daten gestatten</string>
|
||||
<string name="show_name_below_image_thumbnail">Namen unter Bildvorschau anzeigen</string>
|
||||
<string name="settings_allow_content_provider_read_title">Anderen Anwendungen den Zugriff auf meine Daten gestatten</string>
|
||||
<string name="permissionReadCardsLabel">Catima-Karten lesen</string>
|
||||
<string name="permissionReadCardsDescription">Lesen deiner Catima Karten mit allen Details, einschließlich Notizen und Bildern</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Apps müssen weiterhin eine Genehmigung beantragen, um Zugriff zu erhalten</string>
|
||||
<string name="permissionReadCardsDescription">lesen deiner Catima Karten mit allen Details, einschließlich Notizen und Bildern</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Anwendungen müssen weiterhin eine Genehmigung beantragen, um Zugriff zu erhalten</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Erforderlich für das Funktionieren einiger Scanner</string>
|
||||
<string name="settings_keep_screen_on_summary">Deaktiviert die Bildschirmzeitüberschreitung beim Anzeigen einer Karte</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Deaktiviert die Bildschirmsperre während der Anzeige einer Karte</string>
|
||||
@@ -269,9 +269,9 @@
|
||||
<string name="settings_category_title_cards">Karten</string>
|
||||
<string name="settings_category_title_privacy">Datenschutz</string>
|
||||
<string name="settings_category_title_general">Allgemein</string>
|
||||
<string name="view_online">Online anzeigen</string>
|
||||
<string name="view_online">Zeige online</string>
|
||||
<string name="action_display_options">Anzeigeoptionen</string>
|
||||
<string name="show_archived_cards">Archivierte Karten anzeigen</string>
|
||||
<string name="show_archived_cards">Zeige archivierte Karten</string>
|
||||
<string name="app_copyright_short">Copyright © Sylvia van Os und Mitwirkende</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019–<xliff:g>%d</xliff:g> Sylvia van Os und Mitwirkende</string>
|
||||
<string name="card_id_must_not_be_empty">Kartennummer darf nicht leer sein</string>
|
||||
@@ -279,9 +279,9 @@
|
||||
<string name="add_a_card_in_a_different_way">Karte anders hinzufügen</string>
|
||||
<string name="action_more_options">Mehr Optionen</string>
|
||||
<string name="enter_card_id">Gib die Codenummer oder Ziffernfolge deiner Karte an</string>
|
||||
<string name="addWithoutBarcode">Eine Karte ohne Code hinzufügen</string>
|
||||
<string name="addWithoutBarcode">Eine Karde ohne Code hinzufügen</string>
|
||||
<string name="field_must_not_be_empty">Feld darf nicht leer sein</string>
|
||||
<string name="manually_enter_barcode_instructions">Trage die ID Nummer oder Text deiner Karte ein und drücke auf den Barcode, der wie der auf deiner Karte aussieht.</string>
|
||||
<string name="manually_enter_barcode_instructions">Trage die ID Nummer oder Text deiner Karte ein und drücke auf den Barcode, der wie auf deiner Karte aussieht.</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="settings_follow_sensor_orientation">Immer drehen (ignoriert Systemeinstellungen)</string>
|
||||
<string name="continue_">Fortfahren</string>
|
||||
@@ -293,11 +293,6 @@
|
||||
<string name="addFromPdfFile">PDF-Datei auswählen</string>
|
||||
<string name="errorReadingFile">Datei konnte nicht gelesen werden</string>
|
||||
<string name="failedLaunchingFileManager">Konnte keinen unterstützten Dateimanager finden</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Welchen der gefundenen Barcodes möchtest du verwenden?</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Welchen der gefundenen Barcodes möchten Sie verwenden?</string>
|
||||
<string name="pageWithNumber">Seite <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Dein Gerät scheint nicht über eine Kamera zu verfügen. Wenn dies der Fall ist, versuche, das Gerät neu zu starten. Andernfalls verwende die Schaltfläche Weitere Optionen unten, um einen Barcode auf andere Weise hinzuzufügen.</string>
|
||||
<string name="exportCancelled">Export abgebrochen</string>
|
||||
<string name="importCancelled">Import abgebrochen</string>
|
||||
<string name="useFrontImage">Vorderseite verwenden</string>
|
||||
<string name="useBackImage">Rückseite verwenden</string>
|
||||
</resources>
|
||||
@@ -92,7 +92,7 @@
|
||||
\nΔημιουργήστε το από το μενού Εισαγωγής/Εξαγωγής στο Loyalty Card Keychain επιλέγοντας Εξαγωγή.</string>
|
||||
<string name="importFidme">Εισαγωγή από FidMe</string>
|
||||
<string name="importFidmeMessage">Επιλέξτε την <i>fidme-export-request-xxxxxx.zip</i> εξαγωγή από το FidMe για εισαγωγή και επιλέξτε χειροκίνητα τους τύπους γραμμωτού κώδικα μετέπειτα.
|
||||
\nΔημιουργήστε το από το FidMe προφίλ επιλέγοντας Προστασία Δεδομένων και πατώντας Εξαγωγή δεδομένων πρώτα.</string>
|
||||
\nΔημιουργήστε το από το FidMe προφίλ επιλέγοντας Προστασία Δεδομένων και διαλέγοντας εξαγωγή δεδομένων.</string>
|
||||
<string name="setBarcodeId">Επιλέξτε τιμή γραμμωτού κώδικα</string>
|
||||
<string name="wrongValueForBarcodeType">Η τιμή δεν είναι έγκυρη για τον επιλεγμένο γραμμωτό κώδικα</string>
|
||||
<string name="setBackImage">Επιλογή οπίσθιας εικόνας</string>
|
||||
@@ -295,5 +295,4 @@
|
||||
<string name="field_must_not_be_empty">Το πεδίο δεν πρέπει να είναι κενό</string>
|
||||
<string name="manually_enter_barcode_instructions">Εισαγάγετε τον κωδικό αριθμό ή το κείμενο στην κάρτα σας και πατήστε τον γραμμωτό κώδικα που μοιάζει με αυτόν της κάρτας σας.</string>
|
||||
<string name="add_manually_warning_title">Συνιστάται η σάρωση</string>
|
||||
<string name="noCameraFoundGuideText">Η συσκευή σας δεν φαίνεται να διαθέτει κάμερα. Αν έχει, δοκιμάστε να κάνετε επανεκκίνηση της συσκευής. Διαφορετικά, χρησιμοποιήστε το κουμπί Περισσότερες επιλογές παρακάτω για να προσθέσετε έναν γραμμωτό κώδικα με άλλο τρόπο.</string>
|
||||
</resources>
|
||||
@@ -70,7 +70,7 @@
|
||||
<string name="backImageDescription">Imágen dorsal</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barra, Catima necesitará acceso a la cámara. Presione aquí para cambiar la configuración de sus permisos.</string>
|
||||
<string name="settings_lock_on_opening_orientation">Bloquear a la orientación utilizada al abrir la tarjeta</string>
|
||||
<string name="app_loyalty_card_keychain">Cartera para Tarjetas de Fidelización</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="importOptionFilesystemTitle">Importar desde su sistema de archivos</string>
|
||||
<string name="leaveWithoutSaveTitle">Salir</string>
|
||||
<string name="expiryStateSentence">Expira: <xliff:g>%s</xliff:g></string>
|
||||
@@ -184,37 +184,4 @@
|
||||
<string name="settings_keep_screen_on_summary">Deshabilita el tiempo de espera de la pantalla mientras se ve una tarjeta</string>
|
||||
<string name="thumbnailDescription">Miniatura</string>
|
||||
<string name="deleteConfirmationGroup">¿Eliminar grupo\?</string>
|
||||
<string name="updateBarcodeQuestionText">Has cambiado el ID. ¿Quieres actualizar también el código de barras para usar el mismo valor?</string>
|
||||
<string name="settings_locale">Idioma</string>
|
||||
<string name="settings_system_locale">Sistema</string>
|
||||
<string name="settings_catima_theme">Catima</string>
|
||||
<string name="settings_pink_theme">Rosa</string>
|
||||
<string name="exportPassword">Agregar una contraseña para protejer tu exportación (opcional)</string>
|
||||
<string name="settings_sky_blue_theme">Celeste</string>
|
||||
<string name="settings_green_theme">Verde</string>
|
||||
<string name="settings_grey_theme">Gris</string>
|
||||
<string name="exportPasswordHint">Ingresar contraseña</string>
|
||||
<string name="setIcon">Establecer miniatura</string>
|
||||
<string name="showMoreInfo">Mostrar información</string>
|
||||
<string name="turn_flashlight_on">Encender linterna</string>
|
||||
<string name="turn_flashlight_off">Apagar linterna</string>
|
||||
<string name="updateBalance">Actualizar balance</string>
|
||||
<string name="failedToRetrieveImageFile">Error al obtener archivo de imagen</string>
|
||||
<string name="settings_oled_dark_summary">Reduce uso de batería en pantallas OLED</string>
|
||||
<string name="settings_oled_dark">Fondo negro puro para tema oscuro</string>
|
||||
<string name="selectColor">Seleccionar color</string>
|
||||
<string name="settings_theme_color">Color del tema</string>
|
||||
<string name="settings_magenta_theme">Magenta</string>
|
||||
<string name="settings_violet_theme">Violeta</string>
|
||||
<string name="settings_brown_theme">Marrón</string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="settings_blue_theme">Azul</string>
|
||||
<string name="app_contributors">Hecho posible por: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="barcodeLongPressMessage">Solo se puede abrir imágenes en la aplicación de galería</string>
|
||||
<string name="settings_follow_sensor_orientation">Siempre rotar (ignora configuración del sistema)</string>
|
||||
<string name="yes">Si</string>
|
||||
<string name="no">No</string>
|
||||
<string name="passwordRequired">Por favor ingresa la contraseña</string>
|
||||
<string name="failedGeneratingShareURL">No se pudo generar URL compartible. Por favor reporte esto.</string>
|
||||
<string name="sort_by_name">Nombre</string>
|
||||
</resources>
|
||||
@@ -302,9 +302,4 @@
|
||||
<string name="failedLaunchingFileManager">No se ha podido encontrar un gestor de archivos compatible</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">¿Cuál de los códigos de barras encontrados desea utilizar?</string>
|
||||
<string name="pageWithNumber">Página <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Tu dispositivo no parece tener cámara. Si la tiene, intente reiniciar el dispositivo. De lo contrario, utilice el botón Más opciones a continuación para añadir un código de barras de otra manera.</string>
|
||||
<string name="importCancelled">Importación cancelada</string>
|
||||
<string name="exportCancelled">Exportación cancelada</string>
|
||||
<string name="useFrontImage">Utilice la imagen frontal</string>
|
||||
<string name="useBackImage">Utilice la imagen trasera</string>
|
||||
</resources>
|
||||
@@ -1,6 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">کاتیما</string>
|
||||
<string name="action_search">جستجو</string>
|
||||
<string name="action_add">افزودن</string>
|
||||
</resources>
|
||||
<resources></resources>
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="action_search">Hanap</string>
|
||||
<string name="app_name">Catima</string>
|
||||
</resources>
|
||||
@@ -302,9 +302,4 @@
|
||||
<string name="failedLaunchingFileManager">Impossible de trouver un gestionnaire de fichiers supporté</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Quel code-barre, parmi ceux trouvés, voulez-vous utiliser ?</string>
|
||||
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Votre appareil ne semble pas disposer d\'une caméra. Si c\'est le cas, veuillez essayer de redémarrer l\'appareil. Sinon, vous pouvez utiliser le bouton \"Plus d\'options\" ci-dessous pour ajouter un code-barre d\'une autre manière.</string>
|
||||
<string name="exportCancelled">Exportation annulée</string>
|
||||
<string name="importCancelled">Importation annulée</string>
|
||||
<string name="useFrontImage">Utiliser l\'image de face</string>
|
||||
<string name="useBackImage">Utiliser l\'image arrière</string>
|
||||
</resources>
|
||||
@@ -295,9 +295,4 @@
|
||||
<string name="addFromPdfFile">एक PDF फाइल चुनें</string>
|
||||
<string name="errorReadingFile">फाइल को पढ़ा नहीं जा सका</string>
|
||||
<string name="failedLaunchingFileManager">समर्थित फाइल प्रबंधक नहीं मिल सका</string>
|
||||
<string name="noCameraFoundGuideText">ऐसा लगता है कि आपके डिवाइस में कैमरा नहीं है। अगर है, तो डिवाइस को रीबूट करने का प्रयास करें। अन्यथा, किसी अन्य तरीके से बारकोड जोड़ने के लिए नीचे दिए गए अधिक विकल्प बटन का उपयोग करें।</string>
|
||||
<string name="importCancelled">आयात रद्द</string>
|
||||
<string name="exportCancelled">निर्यात रद्द</string>
|
||||
<string name="useFrontImage">सामने की छवि का प्रयोग करें</string>
|
||||
<string name="useBackImage">पीछे की छवि का उपयोग करें</string>
|
||||
</resources>
|
||||
@@ -290,12 +290,4 @@
|
||||
<string name="continue_">Tovább</string>
|
||||
<string name="spend">Költött</string>
|
||||
<string name="receive">Megkapott</string>
|
||||
<string name="addFromPdfFile">PDF fájl kiválasztása</string>
|
||||
<string name="errorReadingFile">A fájl nem olvasható</string>
|
||||
<string name="pageWithNumber"><xliff:g>%d</xliff:g>. oldal</string>
|
||||
<string name="failedLaunchingFileManager">Nem található támogatott fájlkezelő</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">A talált vonalkódok közül melyiket szeretné használni?</string>
|
||||
<string name="noCameraFoundGuideText">Úgy tűnik, az eszközén nincs kamera. Ha van, próbálja meg újraindítani az eszközt. Másképp, használja a További beállítások gombot alul, hogy máshogy hozzáadjon egy vonalkódot.</string>
|
||||
<string name="importCancelled">Importálás megszakítva</string>
|
||||
<string name="exportCancelled">Exportálás megszakítva</string>
|
||||
</resources>
|
||||
@@ -141,17 +141,17 @@
|
||||
\nTIDAK ADA DATA YANG DIKUMPULKAN SAMA SEKALI, yang dapat dikonfirmasi oleh siapa pun karena aplikasi kami adalah libre software.</string>
|
||||
<string name="importCatimaMessage">Pilih ekspor <i>catima.zip</i> Anda dari Catima untuk diimpor.
|
||||
\nBuat dari menu Impor/Ekspor aplikasi Catima lain dengan menekan Ekspor di sana terlebih dahulu.</string>
|
||||
<string name="importFidmeMessage">Pilih ekspor <i>fidme-export-request-xxxxxx.zip</i> Anda dari FidMe untuk diimpor, dan pilih jenis barcode secara manual setelahnya.
|
||||
<string name="importFidmeMessage">Pilih ekspor <i>fidme-export-request-xxxxxx.zip</i> Anda dari FidMe untuk diimpor, dan pilih jenis barcode secara manual setelahnya.
|
||||
\nBuat dari profil FidMe Anda dengan memilih Perlindungan Data lalu tekan Ekstrak data saya terlebih dahulu.</string>
|
||||
<string name="importLoyaltyCardKeychain">Impor dari Loyalty Card Keychain</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Pilih ekspor <i>LoyaltyCardKeychain.csv</i> Anda dari Loyalty Card Keychain untuk diimpor.
|
||||
<string name="importLoyaltyCardKeychainMessage">Pilih ekspor <i>LoyaltyCardKeychain.csv</i> Anda dari Loyalty Card Keychain untuk diimpor.
|
||||
\nBuat dari menu Import/Export di Loyalty Card Keychain dengan menekan Export terlebih dahulu.</string>
|
||||
<string name="importStocard">Impor dari Stocard</string>
|
||||
<string name="importStocardMessage">Pilih ekspor <i>***.zip</i> Anda dari Stocard untuk diimpor.
|
||||
<string name="importStocardMessage">Pilih ekspor <i>***.zip</i> Anda dari Stocard untuk diimpor.
|
||||
\nDapatkan dengan mengirim email ke support@stocardapp.com untuk meminta ekspor data Anda.</string>
|
||||
<string name="importVoucherVault">Impor dari Voucher Vault</string>
|
||||
<string name="importVoucherVaultMessage">Pilih ekspor <i>vouchervault.json</i> Anda dari Voucher Vault untuk diimpor.
|
||||
\nBuat dengan menekan Ekspor di Voucher Vault terlebih dahulu.</string>
|
||||
<string name="importVoucherVaultMessage">Pilih ekspor <i>vouchervault.json</i> Anda dari Vault Voucher untuk diimpor.
|
||||
\nBuat dengan menekan Ekspor di Vault Voucher terlebih dahulu.</string>
|
||||
<string name="unsupportedBarcodeType">Jenis barcode ini belum dapat ditampilkan. Ini mungkin didukung di versi aplikasi yang lebih baru.</string>
|
||||
<string name="wrongValueForBarcodeType">Nilai tidak berlaku untuk jenis barcode yang dipilih</string>
|
||||
<string name="frontImageDescription">Gambar depan</string>
|
||||
@@ -288,5 +288,4 @@
|
||||
<string name="receive">Terima</string>
|
||||
<string name="amountParsingFailed">Jumlah tidak valid</string>
|
||||
<string name="add_manually_warning_message">Untuk beberapa toko, nilai barcode berbeda dengan nomor yang tertulis di kartu. Oleh karena itu, memasukkan barcode secara manual mungkin tidak selalu berhasil. Sangat disarankan untuk memindai barcode dengan kamera anda. Apakah anda masih ingin melanjutkan?</string>
|
||||
<string name="noCameraFoundGuideText">Perangkat Anda sepertinya tidak memiliki kamera. Jika iya, coba mulai ulang perangkat. Jika tidak, gunakan tombol Opsi lainnya di bawah untuk menambahkan barcode dengan cara lain.</string>
|
||||
</resources>
|
||||
@@ -302,9 +302,4 @@
|
||||
<string name="addFromPdfFile">Seleziona un file PDF</string>
|
||||
<string name="failedLaunchingFileManager">Impossibile trovare un file manager supportato</string>
|
||||
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Sembra che il tuo dispositivo non abbia una fotocamera. In tal caso, prova a riavviare il dispositivo. Altrimenti, utilizza il pulsante Altre opzioni di seguito per aggiungere un codice a barre in un altro modo.</string>
|
||||
<string name="importCancelled">Importazione annullata</string>
|
||||
<string name="exportCancelled">Esportazione annullata</string>
|
||||
<string name="useBackImage">Usa l\'immagine posteriore</string>
|
||||
<string name="useFrontImage">Usa l\'immagine anteriore</string>
|
||||
</resources>
|
||||
@@ -52,8 +52,8 @@
|
||||
<string name="exportSuccessful">データがエクスポートされました</string>
|
||||
<string name="importSuccessful">データがインポートされました</string>
|
||||
<string name="intent_import_card_from_url_share_text">カード共有をしましょう</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">バーコード表示中に画面をロックしない</string>
|
||||
<string name="settings_keep_screen_on">バーコード表示中に画面を点けたままにする</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">バーコード表示中は画面をロックしない</string>
|
||||
<string name="settings_keep_screen_on">バーコード表示中は画面を消灯しない</string>
|
||||
<string name="settings_display_barcode_max_brightness">バーコード表示画面を明るくする</string>
|
||||
<string name="settings_dark_theme">ダーク</string>
|
||||
<string name="settings_light_theme">ライト</string>
|
||||
@@ -64,11 +64,11 @@
|
||||
<string name="thumbnailDescription">サムネイル</string>
|
||||
<string name="selectBarcodeTitle">バーコード選択</string>
|
||||
<string name="app_libraries">Libre third-party libraries: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">バージョン: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="about_title_fmt"><xliff:g id="app_name">%s</xliff:g> について</string>
|
||||
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="about_title_fmt">About <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="app_license">Copylefted libre software, licensed GPLv3+</string>
|
||||
<string name="app_resources">Libre third-party resources: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="about">このアプリについて</string>
|
||||
<string name="about">Catimaについて</string>
|
||||
<string name="importOptionApplicationButton">外部のアプリを使う</string>
|
||||
<string name="importOptionApplicationExplanation">任意のアプリやお気に入りのファイルマネージャーからファイルを開く。</string>
|
||||
<string name="importOptionApplicationTitle">外部アプリを使う</string>
|
||||
@@ -130,8 +130,8 @@
|
||||
<string name="takePhoto">写真を撮影する</string>
|
||||
<string name="removeImage">画像を削除</string>
|
||||
<string name="setBackImage">裏面の画像を設定</string>
|
||||
<string name="setFrontImage">表面の画像を設定</string>
|
||||
<string name="photos">画像</string>
|
||||
<string name="setFrontImage">オモテ面の画像を設定</string>
|
||||
<string name="photos">フォト</string>
|
||||
<string name="backImageDescription">裏</string>
|
||||
<string name="frontImageDescription">表</string>
|
||||
<string name="importStocardMessage">Stocardでエクスポートした<i>***.zip</i>ファイルを選択してください。
|
||||
@@ -175,12 +175,12 @@
|
||||
<string name="exportPasswordHint">パスワードを入力してください</string>
|
||||
<string name="version_history">更新履歴</string>
|
||||
<string name="credits">貢献者</string>
|
||||
<string name="help_translate_this_app">翻訳を手伝う</string>
|
||||
<string name="help_translate_this_app">このアプリの翻訳を手伝う</string>
|
||||
<string name="license">ライセンス</string>
|
||||
<string name="on_google_play">Google Play</string>
|
||||
<string name="report_error">問題を報告する</string>
|
||||
<string name="report_error">エラーを報告する</string>
|
||||
<string name="reverse">逆順</string>
|
||||
<string name="and_data_usage">データの扱いなど</string>
|
||||
<string name="and_data_usage">and data usage</string>
|
||||
<string name="group_updated">グループを更新しました</string>
|
||||
<string name="editGroup">グループ編集: <xliff:g>%s</xliff:g></string>
|
||||
<string name="selectColor">色を選択</string>
|
||||
@@ -189,7 +189,7 @@
|
||||
<string name="group_name_already_in_use">このグループ名は既に使用されています</string>
|
||||
<string name="group_name_is_empty">空欄にすることはできません</string>
|
||||
<string name="shortcutSelectCard">カードを選択してください</string>
|
||||
<string name="translate_platform">Weblate</string>
|
||||
<string name="translate_platform">on Weblate</string>
|
||||
<string name="options">オプション</string>
|
||||
<string name="show_note">メモを表示</string>
|
||||
<string name="validFromDate">有効期限</string>
|
||||
@@ -207,31 +207,4 @@
|
||||
<string name="settings_portrait_orientation">縦</string>
|
||||
<string name="noGiftCardsGroup">いくつかのカードを作って、それらをこのグループにアサインします。</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">バーコードをスキャンするためには、Catimaはカメラへのアクセスを必要とします。ここをタップして権限設定の変更をお願いします。</string>
|
||||
<string name="importCards">カードをインポート</string>
|
||||
<string name="show_balance">残高を表示</string>
|
||||
<string name="show_validity">有効期限を表示</string>
|
||||
<string name="donate">寄付する</string>
|
||||
<string name="duplicateCard">複製</string>
|
||||
<string name="unarchived">アーカイブを解除しました</string>
|
||||
<string name="welcome">Catimaへようこそ</string>
|
||||
<string name="show_name_below_image_thumbnail">画像サムネイルの下に名前を表示</string>
|
||||
<string name="settings_keep_screen_on_summary">画面の自動消灯を無効化します</string>
|
||||
<string name="settings_category_title_cards">カード</string>
|
||||
<string name="settings_category_title_general">一般</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">画面のロックを無効化します</string>
|
||||
<string name="action_display_options">表示の設定</string>
|
||||
<string name="unarchive">アーカイブ解除</string>
|
||||
<string name="archive">アーカイブ</string>
|
||||
<string name="archived">アーカイブしました</string>
|
||||
<string name="show_archived_cards">アーカイブしたカードを表示</string>
|
||||
<string name="addFromPdfFile">PDFファイルを選択</string>
|
||||
<string name="addWithoutBarcode">バーコードを登録せずにカードを追加</string>
|
||||
<string name="failedToOpenUrl">ブラウザーをインストールしてください</string>
|
||||
<string name="previousCard">前へ</string>
|
||||
<string name="nextCard">次へ</string>
|
||||
<string name="settings_lock_on_opening_orientation">カードを開いた時の向きに固定</string>
|
||||
<string name="settings_oled_dark">ダークテーマで黒い背景を使用する</string>
|
||||
<string name="settings_oled_dark_summary">有機ELディスプレイでの電池の使用量を削減します</string>
|
||||
<string name="action_more_options">オプション</string>
|
||||
<string name="add_a_card_in_a_different_way">別の方法でカードを追加</string>
|
||||
</resources>
|
||||
@@ -260,7 +260,7 @@
|
||||
<string name="setBarcodeHeight">Sett strekkodehøyde</string>
|
||||
<string name="donate">Doner</string>
|
||||
<string name="permissionReadCardsLabel">Les Catima-kort</string>
|
||||
<string name="permissionReadCardsDescription">Les Catima-kortene dine og detaljene om dem, inkludert notater og bilder</string>
|
||||
<string name="permissionReadCardsDescription">Les kortene dine og detaljene om dem, inkludert notater og bilder</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Programmer vil fremdeles måtte forespørre tilgang for å få det innvilget</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Nødvendig for noen skannere</string>
|
||||
<string name="settings_keep_screen_on_summary">Skrur av skjermtidsavbrudd under visning av et kort</string>
|
||||
@@ -290,10 +290,4 @@
|
||||
<string name="receive">Inntekt</string>
|
||||
<string name="settings_follow_sensor_orientation">Alltid roter (ignorerer systeminnstilling)</string>
|
||||
<string name="add_manually_warning_message">I noen butikker er strekkoden forskjellig fra nummeret på kortet. Som følge av dette kan det hende at å skrive inn strekkoden ikke virker. Det anbefales å skanne strekkoden med kameraet istedenfor. Fortsett?</string>
|
||||
<string name="pageWithNumber">Side <xliff:g>%d</xliff:g></string>
|
||||
<string name="addFromPdfFile">Velg en PDF-fil</string>
|
||||
<string name="errorReadingFile">Kunne ikke lese filen</string>
|
||||
<string name="failedLaunchingFileManager">Fant ikke støttet filbehandler</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Hvilken av de oppdagede strekkodene vil du bruke?</string>
|
||||
<string name="noCameraFoundGuideText">Finner ikke kamera på enheten din. Hvis dette ikke stemmer kan du prøve en omstart av den. Ellers kan du legge til strekkoder med «Mer»-knappen nedenfor.</string>
|
||||
</resources>
|
||||
@@ -295,9 +295,4 @@
|
||||
<string name="failedLaunchingFileManager">Geen ondersteunde bestandsbeheerder aangetroffen</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Welke van de gevonden barcodes wil je gebruiken?</string>
|
||||
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Uw apparaat lijkt niet over een camera te beschikken. Als het dat wel doet, probeer uw apparaat dan opnieuw op te starten. Anders gebruikt u de knop \"Meer opties\" beneden om handmatig een streepjescode in te voeren.</string>
|
||||
<string name="importCancelled">Importeren geannuleerd</string>
|
||||
<string name="exportCancelled">Exporteren geannuleerd</string>
|
||||
<string name="useFrontImage">Gebruik voorzijde van kaart</string>
|
||||
<string name="useBackImage">Gebruik achterzijde van kaart</string>
|
||||
</resources>
|
||||
@@ -309,7 +309,4 @@
|
||||
<string name="failedLaunchingFileManager">Nie można znaleźć obsługiwanego menedżera plików</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Którego ze znalezionych kodów kreskowych chciałbyś użyć?</string>
|
||||
<string name="add_manually_warning_message">W przypadku niektórych sklepów wartość kodu kreskowego różni się od liczby zapisanej na karcie. Z tego powodu ręczne wprowadzanie kodu kreskowego może nie zawsze działać. Zdecydowanie zaleca się zeskanowanie kodu kreskowego za pomocą aparatu. Czy nadal chcesz kontynuować?</string>
|
||||
<string name="noCameraFoundGuideText">Nie wykryto kamery. Jeśli twoje urządzenie posiada kamerę, spróbuj uruchomić je ponownie. W innym wypadku wybierz Więcej opcji i dodaj kartę w inny sposób.</string>
|
||||
<string name="importCancelled">Import anulowany</string>
|
||||
<string name="exportCancelled">Eksport anulowany</string>
|
||||
</resources>
|
||||
@@ -1,310 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="action_search">Pesquisar</string>
|
||||
<string name="action_add">Adicionar</string>
|
||||
<string name="noGiftCards">Clique no botão \"+\" para adicionar um cartão ou importar a partir do menu \"⋮\".</string>
|
||||
<string name="noGiftCardsGroup">Crie alguns cartões e, em seguida, atribua-os ao grupo aqui.</string>
|
||||
<string name="noMatchingGiftCards">Nenhum resultado. Tente alterar sua pesquisa.</string>
|
||||
<string name="storeName">Nome</string>
|
||||
<string name="note">Nota</string>
|
||||
<string name="cardId">ID do cartão</string>
|
||||
<string name="barcodeType">Tipo de código de barras</string>
|
||||
<string name="noBarcode">Nenhum código de barras</string>
|
||||
<string name="star">Adicionar aos favoritos</string>
|
||||
<string name="unstar">Remover dos favoritos</string>
|
||||
<string name="cancel">Cancelar</string>
|
||||
<string name="save">Salvar</string>
|
||||
<string name="edit">Editar</string>
|
||||
<string name="delete">Excluir</string>
|
||||
<string name="confirm">Confirmar</string>
|
||||
<string name="deleteTitle">Excluir cartão</string>
|
||||
<string name="share">Compartilhar</string>
|
||||
<string name="importExport">Importar/Exportar</string>
|
||||
<string name="exportSuccessfulTitle">Exportado</string>
|
||||
<string name="importing">Importando…</string>
|
||||
<string name="exporting">Exportando…</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para ler códigos de barras, Catima precisará de acesso à sua câmera. Toque aqui para alterar suas configurações de permissão.</string>
|
||||
<string name="importOptionFilesystemTitle">Importar dos seus arquivos</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> selecionado</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> selecionados</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> selecionados</item>
|
||||
</plurals>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Excluir <xliff:g>%d</xliff:g> cartão</item>
|
||||
<item quantity="many">Excluir <xliff:g>%d</xliff:g> cartões</item>
|
||||
<item quantity="other">Excluir <xliff:g>%d</xliff:g> cartões</item>
|
||||
</plurals>
|
||||
<string name="deleteConfirmation">Excluir esse cartão permanentemente?</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">Excluir <xliff:g>%d</xliff:g> cartão permanentemente?</item>
|
||||
<item quantity="many">Excluir <xliff:g>%d</xliff:g> cartões permanentemente?</item>
|
||||
<item quantity="other">Excluir <xliff:g>%d</xliff:g> cartões permanentemente?</item>
|
||||
</plurals>
|
||||
<string name="ok">OK</string>
|
||||
<string name="sendLabel">Enviar…</string>
|
||||
<string name="editCardTitle">Editar cartão</string>
|
||||
<string name="addCardTitle">Adicionar cartão</string>
|
||||
<string name="scanCardBarcode">Ler código de barras</string>
|
||||
<string name="cardShortcut">Atalho de cartões</string>
|
||||
<string name="noCardsMessage">Adicione um cartão primeiro</string>
|
||||
<string name="barcodeImageDescriptionWithType">Imagem <xliff:g>%s</xliff:g> do código de barras</string>
|
||||
<string name="noCardExistsError">Não foi possível encontrar esse cartão</string>
|
||||
<string name="failedParsingImportUriError">Não foi possível analisar o URI de importação</string>
|
||||
<string name="exportName">Exportar</string>
|
||||
<string name="importExportHelp">Fazer backup de seus dados permite movê-los para outro dispositivo.</string>
|
||||
<string name="importSuccessfulTitle">Importado</string>
|
||||
<string name="importFailedTitle">Falha na importação</string>
|
||||
<string name="importFailed">Não foi possível importar</string>
|
||||
<string name="exportFailedTitle">Falha na exportação</string>
|
||||
<string name="exportFailed">Não foi possível exportar</string>
|
||||
<string name="storageReadPermissionRequired">Permissão para ler o armazenamento é necessário para esta ação…</string>
|
||||
<string name="cameraPermissionRequired">Permissão para acessar a câmera é necessária para esta ação…</string>
|
||||
<string name="permissionReadCardsLabel">Ler cartões Catima</string>
|
||||
<string name="permissionReadCardsDescription">ler seus cartões Catima e todos os seus detalhes, incluindo notas e imagens</string>
|
||||
<string name="cameraPermissionDeniedTitle">Não foi possível acessar a câmera</string>
|
||||
<string name="exportOptionExplanation">Os dados serão gravados em um local de sua escolha.</string>
|
||||
<string name="importOptionFilesystemExplanation">Escolha um arquivo específico nos seus arquivos.</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> ponto</item>
|
||||
<item quantity="many"><xliff:g>%s</xliff:g> pontos</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> pontos</item>
|
||||
</plurals>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> cartão</item>
|
||||
<item quantity="many"><xliff:g>%d</xliff:g> cartões</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> cartões</item>
|
||||
</plurals>
|
||||
<string name="noCameraFoundGuideText">Seu dispositivo parece não ter uma câmera. Se tiver, tente reiniciar o dispositivo. Caso contrário, tente usar o botão \"Mais opções\" abaixo para adicionar um código de barras manualmente.</string>
|
||||
<string name="settings_follow_system_orientation">Padrão do sistema</string>
|
||||
<string name="settings_lock_on_opening_orientation">Bloquear para orientação usada ao abrir o cartão</string>
|
||||
<string name="importCatimaMessage">Selecionar arquivo <i>catima.zip</i>, exportado do Catima, para importação.
|
||||
\nPrimeiro, crie-o pelo menu Importar/Exportar em outro aplicativo Catima clicando em Exportar.</string>
|
||||
<string name="importLoyaltyCardKeychain">Importar do Loyalty Card Keychain</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Selecionar arquivo <i>LoyaltyCardKeychain.csv</i>, exportado do Loyalty Card Keychain, para importação.
|
||||
\nPrimeiro, crie-o pelo menu Importar/Exportar no Loyalty Card Keychain clicando em Exportar.</string>
|
||||
<string name="setBarcodeId">Definir valor do código de barras</string>
|
||||
<string name="importStocard">Importar de Stocard</string>
|
||||
<string name="importVoucherVault">Importar de Cofre de Vouchers</string>
|
||||
<string name="barcodeId">Valor no código de barras</string>
|
||||
<string name="sameAsCardId">Igual ao ID</string>
|
||||
<string name="photos">Fotos</string>
|
||||
<string name="unsupportedBarcodeType">Este tipo de código de barras não pode ser exibido. É possível que seja trazido em uma versão futura do aplicativo.</string>
|
||||
<string name="wrongValueForBarcodeType">O valor não é válido para o tipo de código de barras selecionado</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Quero compartilhar alguns cartões com você</string>
|
||||
<string name="backImageDescription">Imagem traseira</string>
|
||||
<string name="frontImageDescription">Imagem frontal</string>
|
||||
<string name="setFrontImage">Definir imagem frontal</string>
|
||||
<string name="setBackImage">Definir imagem traseira</string>
|
||||
<string name="removeImage">Remover imagem</string>
|
||||
<string name="takePhoto">Tirar uma foto</string>
|
||||
<string name="updateBarcodeQuestionTitle">Atualizar valor do código de barras?</string>
|
||||
<string name="exportPasswordHint">Insira sua senha</string>
|
||||
<string name="passwordRequired">Por favor, insira a senha</string>
|
||||
<string name="exportPassword">Defina uma senha para proteger o arquivo exportado (opcional)</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="add_manually_warning_message">Em algumas lojas, o valor do código de barras é diferente do número escrito no cartão. Por esse motivo, inserir um código de barras manualmente pode nem sempre funcionar. É altamente recomendável digitalizar o código de barras com a câmera. Você ainda deseja continuar?</string>
|
||||
<string name="importOptionApplicationTitle">Usar outro aplicativo</string>
|
||||
<string name="importOptionApplicationExplanation">Use qualquer aplicativo ou o seu gerenciador de arquivos favorito para abrir um arquivo.</string>
|
||||
<string name="importOptionApplicationButton">Usar outro aplicativo</string>
|
||||
<string name="about">Sobre</string>
|
||||
<string name="about_title_fmt">Sobre <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Versão: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="selectBarcodeTitle">Selecionar código de barras</string>
|
||||
<string name="settings">Configurações</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019–<xliff:g>%d</xliff:g> Sylvia van Os e contribuidores</string>
|
||||
<string name="app_copyright_short">Copyright © Sylvia van Os e contribuidores</string>
|
||||
<string name="app_copyright_old">Baseado no Loyalty Card Keychain
|
||||
\ncopyright © 2016–2020 Branden Archert</string>
|
||||
<string name="importOptionFilesystemButton">A partir do Sistema de Arquivos</string>
|
||||
<string name="thumbnailDescription">Miniatura</string>
|
||||
<string name="starImage">Item favorito</string>
|
||||
<string name="app_libraries">Bibliotecas open source de terceiros : <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Recursos open source de terceiros: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="updateBarcodeQuestionText">Você mudou o ID. Também quer atualizar o código de barras para usar o mesmo valor?</string>
|
||||
<string name="yes">Sim</string>
|
||||
<string name="no">Não</string>
|
||||
<string name="failedGeneratingShareURL">Não foi possível gerar uma URL compartilhável. Por favor, reporte isto.</string>
|
||||
<string name="turn_flashlight_on">Ligar lanterna</string>
|
||||
<string name="turn_flashlight_off">Desligar lanterna</string>
|
||||
<string name="settings_locale">Idioma</string>
|
||||
<string name="settings_oled_dark_summary">Reduz o uso da bateria em telas OLED</string>
|
||||
<string name="settings_system_locale">Sistema</string>
|
||||
<string name="settings_oled_dark">Preto puro como cor de fundo para o tema escuro</string>
|
||||
<string name="settings_pink_theme">Rosa</string>
|
||||
<string name="settings_magenta_theme">Magenta</string>
|
||||
<string name="settings_blue_theme">Azul</string>
|
||||
<string name="settings_sky_blue_theme">Azul celeste</string>
|
||||
<string name="settings_green_theme">Verde</string>
|
||||
<string name="settings_grey_theme">Cinza</string>
|
||||
<string name="settings_brown_theme">Marrom</string>
|
||||
<string name="app_contributors">Só foi possível graças a: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="showMoreInfo">Mostrar informações</string>
|
||||
<string name="updateBalance">Atualizar saldo</string>
|
||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o arquivo de imagem</string>
|
||||
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na galeria</string>
|
||||
<string name="sort_by_most_recently_used">Usado mais recentemente</string>
|
||||
<string name="reverse">...em ordem inversa</string>
|
||||
<string name="sort_by">Ordenar por</string>
|
||||
<string name="version_history">Histórico de Atualização</string>
|
||||
<string name="and_data_usage">e uso de dados</string>
|
||||
<string name="rate_this_app">Avalie este aplicativo</string>
|
||||
<string name="on_google_play">na Google Play</string>
|
||||
<string name="report_error">Informar erro</string>
|
||||
<string name="setIcon">Definir miniatura</string>
|
||||
<string name="options">Opções</string>
|
||||
<string name="starred">Favoritos</string>
|
||||
<string name="duplicateCard">Duplicar</string>
|
||||
<string name="archived">Cartão arquivado</string>
|
||||
<string name="unarchived">Cartão desarquivado</string>
|
||||
<string name="failedLaunchingPhotoPicker">Não foi possível encontrar um aplicativo de galeria compatível</string>
|
||||
<string name="failedToOpenUrl">Instale um navegador primeiro</string>
|
||||
<string name="welcome">Bem-vindo(a) ao Catima</string>
|
||||
<string name="importCards">Importar cartões</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Ver arquivamento (<xliff:g>%1$d</xliff:g> cartão)</item>
|
||||
<item quantity="many">Ver arquivamento (<xliff:g>%1$d</xliff:g> cartões)</item>
|
||||
<item quantity="other">Ver arquivamento (<xliff:g>%1$d</xliff:g> cartões)</item>
|
||||
</plurals>
|
||||
<string name="height">Altura:</string>
|
||||
<string name="switchToBarcode">Mudar para código de barras</string>
|
||||
<string name="switchToFrontImage">Mudar para imagem frontal</string>
|
||||
<string name="switchToBackImage">Mudar para imagem traseira</string>
|
||||
<string name="openFrontImageInGalleryApp">Abrir imagem frontal no aplicativo da galeria</string>
|
||||
<string name="openBackImageInGalleryApp">Abrir imagem traseira no aplicativo da galeria</string>
|
||||
<string name="setBarcodeHeight">Definir altura do código de barras</string>
|
||||
<string name="donate">Doar</string>
|
||||
<string name="icon_header_click_text">Pressione e segure para editar a miniatura</string>
|
||||
<string name="show_name_below_image_thumbnail">Mostrar nome abaixo da miniatura</string>
|
||||
<string name="show_note">Mostrar nota</string>
|
||||
<string name="show_balance">Mostrar saldo</string>
|
||||
<string name="show_validity">Mostrar validade</string>
|
||||
<string name="action_more_options">Mais opções</string>
|
||||
<string name="addWithoutBarcode">Adicionar cartão sem código de barras</string>
|
||||
<string name="card_id_must_not_be_empty">O ID do cartão não pode estar vazio</string>
|
||||
<string name="add_a_card_in_a_different_way">Adicionar cartão de outra forma</string>
|
||||
<string name="field_must_not_be_empty">O campo não pode estar vazio</string>
|
||||
<string name="spend">Gastar</string>
|
||||
<string name="receive">Receber</string>
|
||||
<string name="amountParsingFailed">Quantidade inválida</string>
|
||||
<string name="addFromPdfFile">Selecionar arquivo PDF</string>
|
||||
<string name="settings_theme_color">Cor do tema</string>
|
||||
<string name="settings_catima_theme">Catima</string>
|
||||
<string name="selectColor">Selecionar cor</string>
|
||||
<string name="settings_violet_theme">Violeta</string>
|
||||
<string name="sort_by_name">Nome</string>
|
||||
<string name="sort_by_expiry">Expiração</string>
|
||||
<string name="credits">Créditos</string>
|
||||
<string name="license">Licença</string>
|
||||
<string name="source_repository">Repositório de Origem</string>
|
||||
<string name="on_github">no GitHub</string>
|
||||
<string name="translate_platform">no Weblate</string>
|
||||
<string name="help_translate_this_app">Ajude a traduzir este aplicativo</string>
|
||||
<string name="shortcutSelectCard">Selecione um cartão</string>
|
||||
<string name="include_if_asking_support">Se você gostaria de solicitar suporte, inclua as seguintes informações:</string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> cartão (<xliff:g id="archivedCount">%2$d</xliff:g> arquivado)</item>
|
||||
<item quantity="many"><xliff:g>%1$d</xliff:g> cartões (<xliff:g id="archivedCount">%2$d</xliff:g> arquivados)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> cartões (<xliff:g id="archivedCount">%2$d</xliff:g> arquivados)</item>
|
||||
</plurals>
|
||||
<string name="archive">Arquivar</string>
|
||||
<string name="unarchive">Desarquivar</string>
|
||||
<string name="previousCard">Anterior</string>
|
||||
<string name="nextCard">Próximo</string>
|
||||
<string name="updateBalanceTitle">Quanto você gastou ou recebeu?</string>
|
||||
<string name="currentBalanceSentence">Saldo atual: <xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">Novo saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="settings_category_title_cards">Cartões</string>
|
||||
<string name="updateBalanceHint">Inserir quantidade</string>
|
||||
<string name="anyDate">Qualquer data</string>
|
||||
<string name="settings_category_title_general">Geral</string>
|
||||
<string name="settings_category_title_privacy">Privacidade</string>
|
||||
<string name="action_display_options">Configurações de exibição</string>
|
||||
<string name="show_archived_cards">Mostrar cartões arquivados</string>
|
||||
<string name="add_manually_warning_title">A digitalização é recomendada</string>
|
||||
<string name="continue_">Continuar</string>
|
||||
<string name="errorReadingFile">Não foi possível fazer a leitura do arquivo</string>
|
||||
<string name="failedLaunchingFileManager">Não foi possível encontrar um gerenciador de arquivos compatível</string>
|
||||
<string name="pageWithNumber">Página <xliff:g>%d</xliff:g></string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Qual dos códigos de barras encontrados você quer usar?</string>
|
||||
<string name="settings_display_barcode_max_brightness">Clarear visão do código de barras</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Necessário para alguns scanners funcionarem</string>
|
||||
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="balance">Saldo</string>
|
||||
<string name="settings_follow_sensor_orientation">Sempre girar (ignora as configurações do sistema)</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="settings_light_theme">Claro</string>
|
||||
<string name="settings_system_theme">Sistema</string>
|
||||
<string name="settings_dark_theme">Escuro</string>
|
||||
<string name="moveBarcodeToTopOfScreen">Mover o código de barras para o topo da tela</string>
|
||||
<string name="settings_card_orientation">Orientação do código de barras</string>
|
||||
<string name="settings_portrait_orientation">Retrato</string>
|
||||
<string name="settings_landscape_orientation">Paisagem</string>
|
||||
<string name="settings_keep_screen_on_summary">Desativa o tempo limite de tela enquanto estiver vendo um cartão</string>
|
||||
<string name="importSuccessful">Dados importados</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Desativa bloqueio de tela enquanto estiver vendo um cartão</string>
|
||||
<string name="intent_import_card_from_url_share_text">Eu quero compartilhar um cartão com você</string>
|
||||
<string name="settings_keep_screen_on">Manter tela ligada</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Previnir bloqueio de tela</string>
|
||||
<string name="settings_allow_content_provider_read_title">Permitir que outros aplicativos acessem meus dados</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplicativos ainda precisarão pedir permissão para ter acesso concedido</string>
|
||||
<string name="group_edit">Editar grupo</string>
|
||||
<string name="exportSuccessful">Dados exportados</string>
|
||||
<string name="noGroups">Clique no botão \"+\" para adicionar grupos a serem categorizados.</string>
|
||||
<string name="group_name_already_in_use">Nome do grupo já em uso</string>
|
||||
<string name="deleteConfirmationGroup">Excluir grupo?</string>
|
||||
<string name="failedOpeningFileManager">Instale um gerenciador de arquivos primeiro.</string>
|
||||
<string name="enter_group_name">Inserir nome do grupo</string>
|
||||
<string name="groups">Grupos</string>
|
||||
<string name="noGroupCards">Este grupo está vazio</string>
|
||||
<string name="group_name_is_empty">O nome do grupo não pode estar vazio</string>
|
||||
<string name="group_updated">Grupo atualizado</string>
|
||||
<string name="all">Todos</string>
|
||||
<string name="addManually">Insira o código de barras manualmente</string>
|
||||
<string name="chooseExpiryDate">Escolher data de expiração</string>
|
||||
<string name="moveUp">Mover para cima</string>
|
||||
<string name="never">Nunca</string>
|
||||
<string name="moveDown">Mover para baixo</string>
|
||||
<string name="leaveWithoutSaveTitle">Sair</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Sair sem salvar?</string>
|
||||
<string name="groupsList">Grupos: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editGroup">Editando grupo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editBarcode">Editar código de barras</string>
|
||||
<string name="expiryDate">Data de expiração</string>
|
||||
<string name="noBarcodeFound">Nenhum código de barras foi encontrado</string>
|
||||
<string name="addFromImage">Selecionar uma imagem da galeria</string>
|
||||
<string name="expiryStateSentence">Expira: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentenceExpired">Expirado: <xliff:g>%s</xliff:g></string>
|
||||
<string name="card">Cartão</string>
|
||||
<string name="errorReadingImage">Não foi possível ler a imagem</string>
|
||||
<string name="points">Pontos</string>
|
||||
<string name="privacy_policy">Política de Privacidade</string>
|
||||
<string name="currency">Moeda</string>
|
||||
<string name="chooseImportType">Importar dados de</string>
|
||||
<string name="privacy_policy_popup_text">Declaração de Política de Privacidade
|
||||
\n
|
||||
\nNENHUM DADO É COLETADO, o que pode ser confimado por qualquer pessoa já que o nosso aplicativo é software livre.</string>
|
||||
<string name="importCatima">Importar do Catima</string>
|
||||
<string name="balanceParsingFailed">Saldo inválido</string>
|
||||
<string name="accept">Aceitar</string>
|
||||
<string name="importFidme">Importar de FidMe</string>
|
||||
<string name="importFidmeMessage">Selecione o arquivo <i>fidme-export-request-xxxxxx.zip</i>, exportado de FidMe, para importação e em seguida selecione o tipo de código de barras manualmente.
|
||||
\nCrie-o pelo seu perfil no FidMe escolhendo \'Proteção de Dados\' (Data Protection) e então clicando em \"Extrair meus dados\".</string>
|
||||
<string name="importStocardMessage">Selecionar arquivo <i>***.zip</i>, exportado de Stocard, para importação.
|
||||
\nObtenha-o enviando um e-mail para support@stocardapp.com solicitando exportação dos seus dados.</string>
|
||||
<string name="importVoucherVaultMessage">Selecionar arquivo<i>vouchervault.json</i>, exportado de Voucher Vault, para importação.
|
||||
\nPrimeiro, crie-o pressionando em Exportar no Voucher Vault.</string>
|
||||
<string name="enter_card_id">Insira o ID ou texto escrito no seu cartão</string>
|
||||
<string name="manually_enter_barcode_instructions">Insira o ID ou texto escrito no seu cartão e clique no código de barras que se parece com o do seu cartão.</string>
|
||||
<string name="app_license">Software livre com copyleft, licenciado sob a licença GPLv3+</string>
|
||||
<string name="validFromDate">Válido a partir de</string>
|
||||
<string name="chooseValidFromDate">Escolha uma data válida a partir de</string>
|
||||
<string name="validFromSentence">Válido a partir de: <xliff:g>%s</xliff:g></string>
|
||||
<string name="view_online">Ver online</string>
|
||||
<string name="importCancelled">Importação cancelada</string>
|
||||
<string name="exportCancelled">Exportação cancelada</string>
|
||||
<string name="useBackImage">Usar imagem traseira</string>
|
||||
<string name="useFrontImage">Usar imagem frontal</string>
|
||||
</resources>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Adicionar</string>
|
||||
<string name="action_add">Acrescentar</string>
|
||||
<string name="importOptionFilesystemExplanation">Escolha um ficheiro específico a partir do sistema de ficheiros.</string>
|
||||
<string name="action_search">Pesquisa</string>
|
||||
<string name="star">Adicionar aos favoritos</string>
|
||||
@@ -123,7 +123,7 @@
|
||||
<string name="groupsList">Grupos: <xliff:g>%s</xliff:g></string>
|
||||
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editBarcode">Editar código de barras</string>
|
||||
<string name="expiryDate">Data de validade</string>
|
||||
<string name="expiryDate">Data de expiração</string>
|
||||
<string name="never">Nunca</string>
|
||||
<string name="chooseExpiryDate">Escolher validade</string>
|
||||
<string name="moveBarcodeToTopOfScreen">Mover o código de barras para o topo do ecrã</string>
|
||||
@@ -152,7 +152,7 @@
|
||||
<string name="unsupportedBarcodeType">Este tipo de código de barras ainda não pode ser mostrado. Pode vir a ser suportado numa versão posterior da aplicação.</string>
|
||||
<string name="setFrontImage">Definir imagem frontal</string>
|
||||
<string name="setBackImage">Definir imagem de trás</string>
|
||||
<string name="failedGeneratingShareURL">Não foi possível gerar um URL partilhável. Por favor reporte isto aos programadores.</string>
|
||||
<string name="failedGeneratingShareURL">Não foi possível gerar uma URL partilhável. Por favor reporte isto aos programadores.</string>
|
||||
<string name="turn_flashlight_on">Ligar lanterna</string>
|
||||
<string name="turn_flashlight_off">Desligar lanterna</string>
|
||||
<string name="settings_locale">Idioma</string>
|
||||
@@ -167,7 +167,7 @@
|
||||
<string name="sort">Ordenar</string>
|
||||
<string name="sort_by_name">Nome</string>
|
||||
<string name="sort_by_most_recently_used">Mais usados recentemente</string>
|
||||
<string name="sort_by_expiry">Validade</string>
|
||||
<string name="sort_by_expiry">Expiração</string>
|
||||
<string name="reverse">…na ordem inversa</string>
|
||||
<string name="sort_by">Ordenar por</string>
|
||||
<string name="version_history">Histórico de versões</string>
|
||||
@@ -203,7 +203,7 @@
|
||||
<string name="shortcutSelectCard">Selecione um cartão</string>
|
||||
<string name="translate_platform">no Weblate</string>
|
||||
<string name="starred">Estrela</string>
|
||||
<string name="showMoreInfo">Mostrar informação</string>
|
||||
<string name="showMoreInfo">Mostrar info</string>
|
||||
<string name="options">Opções</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> ponto</item>
|
||||
@@ -230,7 +230,7 @@
|
||||
<string name="failedLaunchingPhotoPicker">Não foi encontrada nenhuma aplicação de galeria de imagens</string>
|
||||
<string name="nextCard">Próximo</string>
|
||||
<string name="previousCard">Anterior</string>
|
||||
<string name="failedToOpenUrl">Instale primeiro um navegador de Internet</string>
|
||||
<string name="failedToOpenUrl">Instale primeiro um navegador da Internet</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Ver arquivo (<xliff:g>%1$d</xliff:g> cartão)</item>
|
||||
<item quantity="many">Ver arquivo (<xliff:g>%1$d</xliff:g> cartões)</item>
|
||||
@@ -238,7 +238,7 @@
|
||||
</plurals>
|
||||
<string name="welcome">Bem-vindo ao Catima</string>
|
||||
<string name="failedToRetrieveImageFile">Falha ao recuperar o ficheiro de imagem</string>
|
||||
<string name="barcodeLongPressMessage">Só podem ser abertas imagens na aplicação da galeria</string>
|
||||
<string name="barcodeLongPressMessage">Apenas imagens podem ser abertas na aplicação de galeria</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Para digitalizar código de barras, o Catima tem de aceder à câmara. Clique aqui para mudar as configurações de permissão.</string>
|
||||
<string name="cameraPermissionDeniedTitle">Não foi possível aceder à câmara</string>
|
||||
<string name="importCards">Importar cartões</string>
|
||||
@@ -272,39 +272,34 @@
|
||||
<string name="settings_keep_screen_on_summary">Desativa o tempo limite da tela ao visualizar um cartão</string>
|
||||
<string name="settings_allow_content_provider_read_title">Permitir que outros aplicativos acessem meus dados</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Os aplicativos ainda terão que solicitar permissão para receber acesso</string>
|
||||
<string name="settings_oled_dark_summary">Reduz a utilização da bateria em ecrãs OLED</string>
|
||||
<string name="settings_oled_dark_summary">Reduz o uso da bateria em telas OLED</string>
|
||||
<string name="icon_header_click_text">Pressione e segure para editar o icone</string>
|
||||
<string name="settings_category_title_cards">Cartões</string>
|
||||
<string name="settings_category_title_general">Geral</string>
|
||||
<string name="settings_category_title_cards">cartões</string>
|
||||
<string name="settings_category_title_general">geral</string>
|
||||
<string name="settings_category_title_privacy">Privacidade</string>
|
||||
<string name="card_id_must_not_be_empty">O ID do cartão não pode estar vazio</string>
|
||||
<string name="balanceParsingFailed">Saldo inválido</string>
|
||||
<string name="add_a_card_in_a_different_way">Adicione um cartão de uma forma diferente</string>
|
||||
<string name="view_online">Ver online</string>
|
||||
<string name="view_online">Exibir online</string>
|
||||
<string name="manually_enter_barcode_instructions">Digite o número ID ou o texto em seu cartão e pressione o código de barras que se parece com o que está em seu cartão.</string>
|
||||
<string name="action_more_options">Mais opções</string>
|
||||
<string name="enter_card_id">Digite o número ID ou o texto em seu cartão</string>
|
||||
<string name="action_display_options">Opções de visualização</string>
|
||||
<string name="action_display_options">Opções de exibição</string>
|
||||
<string name="addWithoutBarcode">Adicione um cartão sem código de barras</string>
|
||||
<string name="app_copyright_short">Copyright © Sylvia van Os e colaboradores</string>
|
||||
<string name="field_must_not_be_empty">O campo não pode estar vazio</string>
|
||||
<string name="show_archived_cards">Mostrar cartões arquivados</string>
|
||||
<string name="show_archived_cards">Exibir cartões arquivados</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="continue_">Continuar</string>
|
||||
<string name="add_manually_warning_title">Recomenda-se a digitalização</string>
|
||||
<string name="add_manually_warning_message">Em algumas lojas, o valor do código de barras é diferente do número escrito no cartão. Por este motivo, a introdução manual de um código de barras pode nem sempre funcionar. Recomenda-se vivamente que, em vez disso, digitalize o código de barras com a sua câmara. Ainda quer continuar?</string>
|
||||
<string name="spend">Gastar</string>
|
||||
<string name="receive">Receber</string>
|
||||
<string name="amountParsingFailed">Montante inválido</string>
|
||||
<string name="amountParsingFailed">Montante inválida</string>
|
||||
<string name="settings_follow_sensor_orientation">Rodar sempre (ignora as definições do sistema)</string>
|
||||
<string name="addFromPdfFile">Selecionar um ficheiro PDF</string>
|
||||
<string name="errorReadingFile">Não foi possível ler o ficheiro</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Qual dos códigos de barras encontrados pretende utilizar?</string>
|
||||
<string name="pageWithNumber">Página <xliff:g>%d</xliff:g></string>
|
||||
<string name="failedLaunchingFileManager">Não foi possível encontrar um gestor de ficheiros suportado</string>
|
||||
<string name="noCameraFoundGuideText">O seu dispositivo não parece ter uma câmara. Se tiver, tente reiniciar o dispositivo. Caso contrário, utilize o botão \"Mais opções\" abaixo para adicionar um código de barras de outra maneira.</string>
|
||||
<string name="importCancelled">Importação cancelada</string>
|
||||
<string name="exportCancelled">Exportação cancelada</string>
|
||||
<string name="useFrontImage">Utilizar imagem frontal</string>
|
||||
<string name="useBackImage">Utilizar imagem do verso</string>
|
||||
</resources>
|
||||
@@ -24,10 +24,10 @@
|
||||
<string name="card">Cardul</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="all">Toate</string>
|
||||
<string name="noCardsMessage">Adăugați mai întâi un card</string>
|
||||
<string name="noCardsMessage">Adăugați mai întâi o carte</string>
|
||||
<string name="noCardExistsError">Acel card nu a putut fi găsit</string>
|
||||
<string name="failedParsingImportUriError">Nu s-a putut analiza URI-ul de import</string>
|
||||
<string name="importExport">Importă/Exportă</string>
|
||||
<string name="importExport">Importație/Export</string>
|
||||
<string name="exportName">Exportați</string>
|
||||
<string name="importSuccessfulTitle">Importat</string>
|
||||
<string name="importFailedTitle">Importul a eșuat</string>
|
||||
@@ -262,7 +262,7 @@
|
||||
<string name="app_resources">Resurse terță deschise: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="app_name">Catima</string>
|
||||
<string name="shortcutSelectCard">Selectați un card</string>
|
||||
<string name="accept">Acceptă</string>
|
||||
<string name="accept">Accept</string>
|
||||
<string name="settings_category_title_privacy">Confidențialitate</string>
|
||||
<string name="show_balance">Afișați balanța</string>
|
||||
<string name="nextCard">Următor</string>
|
||||
@@ -302,9 +302,4 @@
|
||||
<string name="failedLaunchingFileManager">Nu s-a găsit un manager de fișiere suportat</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Pe care dintre codurile de bare găsite dorești să-l folosești?</string>
|
||||
<string name="pageWithNumber">Pagina <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Dispozitivul dvs. nu pare să aibă o cameră foto/video. Daca are, încercați să vă reporniți dispozitivul. Altfel, folosiți butonul cu opțiunea \'Mai multe\' de mai jos pentru a adăuga un cod de bare prin altă modalitate.</string>
|
||||
<string name="importCancelled">Importare anulată</string>
|
||||
<string name="exportCancelled">Exportare anulată</string>
|
||||
<string name="useBackImage">Utilizează imaginea din spate</string>
|
||||
<string name="useFrontImage">Utilizează imaginea din față</string>
|
||||
</resources>
|
||||
@@ -309,9 +309,4 @@
|
||||
<string name="pageWithNumber">Страница <xliff:g>%d</xliff:g></string>
|
||||
<string name="failedLaunchingFileManager">Не найден поддерживаемый файловый менеджер</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Какой из найденных штрих-кодов вы хотите использовать?</string>
|
||||
<string name="noCameraFoundGuideText">Похоже, ваше устройство не оснащено камерой. Если это не так, попробуйте перезагрузить устройство. В противном случае воспользуйтесь кнопкой \"Ещё\", чтобы добавить штри-хкод другим способом.</string>
|
||||
<string name="importCancelled">Импорт отменён</string>
|
||||
<string name="exportCancelled">Экспорт отменён</string>
|
||||
<string name="useFrontImage">Использовать лицевую сторону</string>
|
||||
<string name="useBackImage">Использовать заднюю сторону</string>
|
||||
</resources>
|
||||
@@ -297,9 +297,4 @@
|
||||
<string name="amountParsingFailed">Neplatná hodnota</string>
|
||||
<string name="add_manually_warning_title">Skenovanie je odporúčané</string>
|
||||
<string name="add_manually_warning_message">V niektorých obchodoch nie je číslo na cenovke totožné s čiarovým kódom, preto je lepšie zoskenovať čiarový kód. Chcete napriek tomu pokračovať?</string>
|
||||
<string name="addFromPdfFile">Vyberte súbor PDF</string>
|
||||
<string name="errorReadingFile">Súbor sa nepodarilo prečítať</string>
|
||||
<string name="failedLaunchingFileManager">Nepodarilo sa nájsť podporovaného správcu súborov</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Ktorý z nájdených čiarových kódov chcete použiť?</string>
|
||||
<string name="pageWithNumber">Stránka <xliff:g>%d</xliff:g></string>
|
||||
</resources>
|
||||
@@ -1,310 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="action_add">Dodaj</string>
|
||||
<string name="action_search">Pretraga</string>
|
||||
<string name="noGiftCards">Klikni + plus znak da dodaš karticu, ili je uvezi pomoću ⋮ menija.</string>
|
||||
<string name="storeName">Ime</string>
|
||||
<string name="cardId">Broj kartice</string>
|
||||
<string name="star">Dodaj u omiljene</string>
|
||||
<string name="unstar">Ukloni iz omiljenih</string>
|
||||
<string name="cancel">Otkaži</string>
|
||||
<string name="save">Sačuvaj</string>
|
||||
<string name="edit">Izmeni</string>
|
||||
<string name="delete">Obriši</string>
|
||||
<string name="confirm">Potvrdi</string>
|
||||
<string name="deleteTitle">Obriši karticu</string>
|
||||
<string name="deleteConfirmation">Trajno obriši ovu karticu?</string>
|
||||
<plurals name="deleteCardsConfirmation">
|
||||
<item quantity="one">Obriši <xliff:g>%d</xliff:g> karticu trajno?</item>
|
||||
<item quantity="few">Obriši <xliff:g>%d</xliff:g> kartice trajno?</item>
|
||||
<item quantity="other">Obriši <xliff:g>%d</xliff:g> kartica trajno?</item>
|
||||
</plurals>
|
||||
<string name="ok">Potvrdi</string>
|
||||
<string name="share">Podeli</string>
|
||||
<string name="sendLabel">Pošalji…</string>
|
||||
<string name="editCardTitle">Izmeni karticu</string>
|
||||
<string name="addCardTitle">Dodaj karticu</string>
|
||||
<string name="cardShortcut">Prečica kartice</string>
|
||||
<string name="noCardsMessage">Prvo dodaj karticu</string>
|
||||
<string name="noCardExistsError">Nije moguće pronaći tu karticu</string>
|
||||
<string name="failedParsingImportUriError">Nije moguće obraditi uvozni URI</string>
|
||||
<string name="importExport">Uvoz/Izvoz</string>
|
||||
<string name="exportName">Izvoz</string>
|
||||
<string name="importExportHelp">Pravljenje rezervnih kopija podataka omogućava premeštanje na drugi uređaj.</string>
|
||||
<string name="importSuccessfulTitle">Uvezeno</string>
|
||||
<string name="importFailedTitle">Uvoz nije uspeo</string>
|
||||
<string name="importFailed">Nije moguće izvršiti uvoz</string>
|
||||
<string name="exportSuccessfulTitle">Izvezeno</string>
|
||||
<string name="exportFailedTitle">Izvoz nije uspeo</string>
|
||||
<string name="importing">Uvoz…</string>
|
||||
<string name="exporting">Izvoz…</string>
|
||||
<string name="storageReadPermissionRequired">Potrebna dozvola za čitanje memorije za ovu akciju…</string>
|
||||
<string name="barcodeType">Tip bar-koda</string>
|
||||
<string name="noBarcode">Nema bar-koda</string>
|
||||
<string name="scanCardBarcode">Skeniraj bar-kod</string>
|
||||
<string name="barcodeImageDescriptionWithType">Fotografija <xliff:g>%s</xliff:g> bar-koda</string>
|
||||
<string name="exportOptionExplanation">Podaci će biti sačuvani na lokaciji po tvom izboru.</string>
|
||||
<string name="importOptionFilesystemExplanation">Odaberi određenu datoteku iz sistema za upravljanje datotekama.</string>
|
||||
<string name="importOptionFilesystemTitle">Uvezi iz sistema za upravljanje datotekama</string>
|
||||
<string name="importOptionFilesystemButton">Iz sistema za upravljanje datotekama</string>
|
||||
<string name="importOptionApplicationTitle">Koristi drugu aplikaciju</string>
|
||||
<string name="importOptionApplicationExplanation">Koristi bilo koju aplikaciju ili omiljeni menadžer datoteka da bi otvorio datoteku.</string>
|
||||
<string name="importOptionApplicationButton">Koristi drugu aplikaciju</string>
|
||||
<string name="about">O aplikaciji</string>
|
||||
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autorska prava © 2019–<xliff:g>%d</xliff:g> Sylvia van Os i saradnici</string>
|
||||
<string name="app_copyright_old">Bazirana na osnovu aplikcije Loyalty Card Keychain
|
||||
\nautorska prava © 2016–2020 Branden Archer</string>
|
||||
<string name="starImage">Omiljena zvezda</string>
|
||||
<string name="settings">Podešavanja</string>
|
||||
<string name="settings_theme">Tema</string>
|
||||
<string name="settings_system_theme">Sistem</string>
|
||||
<string name="settings_light_theme">Svetla</string>
|
||||
<string name="settings_dark_theme">Tamna</string>
|
||||
<string name="settings_follow_system_orientation">Kao sistem</string>
|
||||
<string name="settings_follow_sensor_orientation">Uvek rotiraj (ignoriše sistemska podešavanja)</string>
|
||||
<string name="settings_portrait_orientation">Uspravno</string>
|
||||
<string name="settings_landscape_orientation">Položeno</string>
|
||||
<string name="settings_lock_on_opening_orientation">Zaključavanje orijentacije koja se koristi prilikom otvaranja kartice</string>
|
||||
<string name="settings_display_barcode_max_brightness">Posvetli bar-kod pogled</string>
|
||||
<string name="settings_display_barcode_max_brightness_summary">Neophodno za rad nekih čitača</string>
|
||||
<string name="selectBarcodeTitle">Odaberi bar-kod</string>
|
||||
<string name="settings_card_orientation">Orijentacija bar-koda</string>
|
||||
<string name="thumbnailDescription">Naslovna fotografija</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card">Spreči zaključavanje ekrana</string>
|
||||
<string name="settings_allow_content_provider_read_title">Dozvoli drugim aplikacijama da pristupe mojim podacima</string>
|
||||
<string name="settings_allow_content_provider_read_summary">Aplikacije će i dalje morati da zatraže dozvolu da bi im se odobrio pristup</string>
|
||||
<string name="intent_import_card_from_url_share_text">Želim da podelim karticu sa tobom</string>
|
||||
<string name="importSuccessful">Podaci uvezeni</string>
|
||||
<string name="exportSuccessful">Podaci izvezeni</string>
|
||||
<string name="enter_group_name">Unesite ime grupe</string>
|
||||
<string name="noGroups">Klikni + plus znak da dodaš grupe za kategorizaciju.</string>
|
||||
<string name="noGroupCards">Ova grupa je prazna</string>
|
||||
<plurals name="groupCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> kartica</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> kartice</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> kartica</item>
|
||||
</plurals>
|
||||
<string name="group_name_already_in_use">Grupa pod ovim imenom već postoji</string>
|
||||
<string name="group_name_is_empty">Grupa mora imati ime</string>
|
||||
<string name="all">Sve</string>
|
||||
<string name="deleteConfirmationGroup">Obriši grupu?</string>
|
||||
<string name="moveUp">Pomeri nagore</string>
|
||||
<string name="moveDown">Pomeri nadole</string>
|
||||
<string name="leaveWithoutSaveTitle">Izlaz</string>
|
||||
<string name="leaveWithoutSaveConfirmation">Izlaziš, a nisi sačuvao?</string>
|
||||
<string name="addManually">Unesite bar-kod ručno</string>
|
||||
<string name="addFromImage">Izaberi sliku iz galerije</string>
|
||||
<string name="groupsList">Grupe: <xliff:g>%s</xliff:g></string>
|
||||
<string name="card">Kartica</string>
|
||||
<string name="errorReadingImage">Nije moguće očitati sliku</string>
|
||||
<string name="balance">Stanje</string>
|
||||
<string name="currency">Valuta</string>
|
||||
<string name="points">Bodovi</string>
|
||||
<string name="balanceParsingFailed">Nevažeće stanje</string>
|
||||
<string name="chooseImportType">Uvoz podataka iz</string>
|
||||
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
|
||||
<string name="privacy_policy">Politika privatnosti</string>
|
||||
<string name="privacy_policy_popup_text">Obaveštenje o politici privatnosti (zahtevano od nekih prodavnica aplikacija):
|
||||
\n
|
||||
\nPODACI SE UOPŠTE NE PRIKUPLJAJU, što svako može proveriti jer je naša aplikacija slobodni softver.</string>
|
||||
<string name="accept">Prihvati</string>
|
||||
<string name="importCatima">Uvezi iz Catime</string>
|
||||
<string name="importFidme">Uvoz iz FidMe</string>
|
||||
<string name="importLoyaltyCardKeychain">Uvezi iz aplikacije Loyalty Card Keychain</string>
|
||||
<string name="importLoyaltyCardKeychainMessage">Odaberi svoj <i>LoyaltyCardKeychain.csv</i> izvoz iz aplikacije Loyalty Card Keychain za uvoz.
|
||||
\nKreiraj ga iz menija \"Import/Export\" u aplikaciji Loyalty Card Keychain klikom na \"Export\".</string>
|
||||
<string name="importStocard">Uvoz iz Stocard</string>
|
||||
<string name="importVoucherVault">Uvoz iz Voucher Vault</string>
|
||||
<string name="importVoucherVaultMessage">Odaberi svoj <i>vouchervault.json</i> izvoz iz Voucher Vault za uvoz.
|
||||
\nKreiraj ga pritiskom na \"Export\" u Voucher Vault aplikaciji.</string>
|
||||
<string name="barcodeId">Vrednost bar-koda</string>
|
||||
<string name="sameAsCardId">Isti kao broj kartice</string>
|
||||
<string name="setBarcodeId">Podesi vrednost bar-koda</string>
|
||||
<string name="unsupportedBarcodeType">Ovaj tip bar-koda nije podržan te ne može da se prikaže. Možda bude podržan u nekoj novijoj verziji aplikacije.</string>
|
||||
<string name="wrongValueForBarcodeType">Vrednost nije validna za izabrani tip bar-koda</string>
|
||||
<string name="intent_import_card_from_url_share_multiple_text">Želim da podelim neke kartice sa tobom</string>
|
||||
<string name="frontImageDescription">Prednja fotografija kartice</string>
|
||||
<string name="photos">Fotografije</string>
|
||||
<string name="setFrontImage">Postavi prednju fotografiju</string>
|
||||
<string name="removeImage">Ukloni fotografiju</string>
|
||||
<string name="takePhoto">Uslikaj fotografiju</string>
|
||||
<string name="updateBarcodeQuestionTitle">Ažuriraj vrednost bar-koda?</string>
|
||||
<string name="yes">Da</string>
|
||||
<string name="exportPassword">Podesi lozinku da bi zaštitio svoj izvoz (opciono)</string>
|
||||
<string name="exportPasswordHint">Unesi lozinku</string>
|
||||
<string name="failedGeneratingShareURL">Nije moguće generisati URL koji se može podeliti. Molim te da prijaviš ovo developeru.</string>
|
||||
<string name="turn_flashlight_on">Uključi blic</string>
|
||||
<string name="turn_flashlight_off">Isključi blic</string>
|
||||
<string name="settings_locale">Jezik</string>
|
||||
<string name="settings_oled_dark">Čisto crna pozadina za tamnu temu</string>
|
||||
<string name="settings_oled_dark_summary">Smanjuje potrošnju baterije na OLED ekranima</string>
|
||||
<string name="settings_system_locale">Sistem</string>
|
||||
<string name="selectColor">Odaberi boju</string>
|
||||
<string name="setIcon">Odaberi naslovnu fotografiju</string>
|
||||
<string name="settings_theme_color">Boja teme</string>
|
||||
<string name="settings_catima_theme">Catima</string>
|
||||
<string name="settings_pink_theme">Roze</string>
|
||||
<string name="settings_magenta_theme">Magenta</string>
|
||||
<string name="settings_violet_theme">Ljubičasta</string>
|
||||
<string name="settings_brown_theme">Braon</string>
|
||||
<string name="sort">Sortiranje</string>
|
||||
<string name="showMoreInfo">Prikaži informacije</string>
|
||||
<string name="updateBalance">Ažuriraj stanje</string>
|
||||
<string name="failedToRetrieveImageFile">Preuzimanje fotografije nije uspelo</string>
|
||||
<string name="sort_by_name">Ime</string>
|
||||
<string name="sort_by_most_recently_used">Nedevno korišćeno</string>
|
||||
<string name="sort_by_expiry">Ističe</string>
|
||||
<string name="reverse">…u obrnutom redosledu</string>
|
||||
<string name="sort_by">Sortiraj po</string>
|
||||
<string name="version_history">Istorija verzija</string>
|
||||
<string name="credits">Stanje</string>
|
||||
<string name="help_translate_this_app">Pomozi da prevedemo aplikaciju</string>
|
||||
<string name="license">Licenca</string>
|
||||
<string name="source_repository">Izvorni repozitorijum</string>
|
||||
<string name="on_github">na GitHub-u</string>
|
||||
<string name="and_data_usage">i korišćenje podataka</string>
|
||||
<string name="rate_this_app">Oceni aplikaciju</string>
|
||||
<string name="on_google_play">na Google Play prodavnici</string>
|
||||
<string name="report_error">Prijavi grešku</string>
|
||||
<string name="shortcutSelectCard">Odaberi karticu</string>
|
||||
<string name="options">Opcije</string>
|
||||
<string name="starred">Označeni zvezdicom</string>
|
||||
<string name="duplicateCard">Dupliraj</string>
|
||||
<string name="archive">Arhiviraj</string>
|
||||
<string name="unarchive">Ukloni iz arhive</string>
|
||||
<string name="unarchived">Kartica uklonjena iz arhive</string>
|
||||
<string name="archived">Kartica dodata u arhivu</string>
|
||||
<string name="failedLaunchingPhotoPicker">Nije moguće pronaći podržanu galerija aplikaciju</string>
|
||||
<string name="previousCard">Prethodna</string>
|
||||
<string name="nextCard">Sledeća</string>
|
||||
<string name="failedToOpenUrl">Prvo instalirajte internet pregledač</string>
|
||||
<plurals name="viewArchivedCardsWithCount">
|
||||
<item quantity="one">Pregledaj arhivu (<xliff:g>%1$d</xliff:g> kartica)</item>
|
||||
<item quantity="few">Pregledaj arhivu (<xliff:g>%1$d</xliff:g> kartice)</item>
|
||||
<item quantity="other">Pregledaj arhivu (<xliff:g>%1$d</xliff:g> kartica)</item>
|
||||
</plurals>
|
||||
<string name="welcome">Dobrodošli u Catima aplikaciju</string>
|
||||
<string name="importCards">Uvezi kartice</string>
|
||||
<string name="updateBalanceTitle">Koliko si potrošio ili primio?</string>
|
||||
<string name="updateBalanceHint">Unesi vrednost</string>
|
||||
<string name="currentBalanceSentence">Trenutno stanje: <xliff:g>%s</xliff:g></string>
|
||||
<string name="validFromDate">Važi do</string>
|
||||
<string name="anyDate">bilo kog datuma</string>
|
||||
<string name="chooseValidFromDate">Odaberi datum važenja</string>
|
||||
<string name="validFromSentence">Važi od: <xliff:g>%s</xliff:g></string>
|
||||
<string name="height">Visina:</string>
|
||||
<string name="switchToFrontImage">Prebaci na prednju fotografiju</string>
|
||||
<string name="switchToBarcode">Prebaci na bar-kod</string>
|
||||
<string name="openFrontImageInGalleryApp">Otvori prednju fotografiju u galerija aplikaciji</string>
|
||||
<string name="setBarcodeHeight">Postavi visinu bar-koda</string>
|
||||
<string name="donate">Doniraj</string>
|
||||
<string name="icon_header_click_text">Dugi pritisak za izmenu naslovne fotografije</string>
|
||||
<string name="show_name_below_image_thumbnail">Prikaži naziv ispod naslovne fotografije</string>
|
||||
<string name="show_note">Prikaži napomenu</string>
|
||||
<string name="show_balance">Prikaži stanje</string>
|
||||
<string name="show_validity">Prikaži validnost</string>
|
||||
<string name="settings_category_title_privacy">Privatnost</string>
|
||||
<string name="settings_category_title_general">Glavno</string>
|
||||
<string name="action_display_options">Prikaz</string>
|
||||
<string name="show_archived_cards">Prikaži arhivirane kartice</string>
|
||||
<string name="view_online">Pregledaj online</string>
|
||||
<string name="action_more_options">Više opcija</string>
|
||||
<string name="app_name">Catima</string>
|
||||
<plurals name="selectedCardCount">
|
||||
<item quantity="one"><xliff:g>%d</xliff:g> izabrana</item>
|
||||
<item quantity="few"><xliff:g>%d</xliff:g> izabrane</item>
|
||||
<item quantity="other"><xliff:g>%d</xliff:g> izabranih</item>
|
||||
</plurals>
|
||||
<string name="noGiftCardsGroup">Kreirajte par kartica, a zatim ih ovde dodeli grupi.</string>
|
||||
<string name="noMatchingGiftCards">Nema rezultata. Pokušaj da promeniš pretragu.</string>
|
||||
<string name="note">Napomena</string>
|
||||
<plurals name="deleteCardsTitle">
|
||||
<item quantity="one">Obriši <xliff:g>%d</xliff:g> karticu</item>
|
||||
<item quantity="few">Obriši <xliff:g>%d</xliff:g> kartice</item>
|
||||
<item quantity="other">Obriši <xliff:g>%d</xliff:g> kartica</item>
|
||||
</plurals>
|
||||
<string name="cameraPermissionRequired">Potrebna dozvola za pristup kameri za ovu akciju…</string>
|
||||
<string name="permissionReadCardsLabel">Pročitaj Catima kartice</string>
|
||||
<string name="permissionReadCardsDescription">Pročitaj svoje Catima kartice i sve njihove detalje, uključujući beleške i slike</string>
|
||||
<string name="cameraPermissionDeniedTitle">Nije moguće pristupiti kameri</string>
|
||||
<string name="exportFailed">Nije moguće izvršiti izvoz</string>
|
||||
<string name="app_copyright_short">Autorska prava © Sylvia van Os i saradnici</string>
|
||||
<string name="app_license">Kopileftovani slobodni softver, licenciran GPLv3+</string>
|
||||
<string name="about_title_fmt">O <xliff:g id="app_name">%s</xliff:g></string>
|
||||
<string name="debug_version_fmt">Verzija: <xliff:g id="version">%s</xliff:g></string>
|
||||
<string name="app_libraries">Slobodne biblioteke trećih strana: <xliff:g id="app_libraries_list">%s</xliff:g></string>
|
||||
<string name="app_resources">Slobodni resursi trećih strana: <xliff:g id="app_resources_list">%s</xliff:g></string>
|
||||
<string name="settings_keep_screen_on">Drži ekran uključen</string>
|
||||
<string name="settings_keep_screen_on_summary">Onemogućava vremensko ograničenje gašenja ekrana dok gledate karticu</string>
|
||||
<string name="settings_disable_lockscreen_while_viewing_card_summary">Onemogućava zaključavanje ekrana dok gledate karticu</string>
|
||||
<string name="noCameraPermissionDirectToSystemSetting">Za skeniranje bar-kodova, Catimi će trebati pristup tvojoj kameri. Dodirnite ovde da biste promenili podešavanja dozvole.</string>
|
||||
<string name="groups">Grupe</string>
|
||||
<string name="group_edit">Izmeni grupu</string>
|
||||
<string name="group_updated">Grupa ažurirana</string>
|
||||
<string name="failedOpeningFileManager">Prvo instaliraj menadžer datoteka.</string>
|
||||
<string name="editGroup">Izmena grupe: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentence">Ističe: <xliff:g>%s</xliff:g></string>
|
||||
<string name="expiryStateSentenceExpired">Istekla: <xliff:g>%s</xliff:g></string>
|
||||
<string name="balanceSentence">Stanje: <xliff:g>%s</xliff:g></string>
|
||||
<string name="editBarcode">Izmeni bar-kod</string>
|
||||
<string name="moveBarcodeToTopOfScreen">Premesti bar-kod na vrh ekrana</string>
|
||||
<plurals name="balancePoints">
|
||||
<item quantity="one"><xliff:g>%s</xliff:g> bod</item>
|
||||
<item quantity="few"><xliff:g>%s</xliff:g> boda</item>
|
||||
<item quantity="other"><xliff:g>%s</xliff:g> bodova</item>
|
||||
</plurals>
|
||||
<string name="expiryDate">Datum isteka</string>
|
||||
<string name="never">Nikad</string>
|
||||
<string name="chooseExpiryDate">Odaberi datum isteka</string>
|
||||
<string name="noBarcodeFound">Nije pronađen bar-kod</string>
|
||||
<string name="importCatimaMessage">Odaberi svoj <i>catima.zip</i> koji želiš da uvezeš.
|
||||
\nMožeš da ga kreiraš u Catima aplikaciji koju prenosiš iz menija Uvoz/Izvoz aplikacije pritiskom na izvoz.</string>
|
||||
<string name="importFidmeMessage">Odaberi svoj <i>fidme-export-request-xxxxxx.zip</i> izvoz iz FidMe za uvoz, a zatim ručno izaberite tipove bar-kodova.
|
||||
\nKreirajte ga iz svog FidMe profila tako što ćeš izabrati \"Data Protection\", a zatim pritisnuti \"Extract my data first\".</string>
|
||||
<string name="importStocardMessage">Odaberi svoj <i>***.zip</i> izvoz iz Stocard za uvoz.
|
||||
\nNabavi ga putem e-mail adrese support@stocardapp.com tražeći izvoz vaših podataka.</string>
|
||||
<string name="backImageDescription">Zadnja fotografija kartice</string>
|
||||
<string name="setBackImage">Postavi zadnju fotografiju</string>
|
||||
<string name="passwordRequired">Unesi lozinku</string>
|
||||
<string name="updateBarcodeQuestionText">Promenio si broj kartice. Da li želiš da ažuriraš i bar-kod da bude iste vrednosti?</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="app_contributors">Saradnici: <xliff:g id="app_contributors">%s</xliff:g></string>
|
||||
<string name="settings_sky_blue_theme">Nebo plava</string>
|
||||
<string name="settings_green_theme">Zelena</string>
|
||||
<string name="barcodeLongPressMessage">Samo fotografije mogu da se otvore u galerija aplikaciji</string>
|
||||
<string name="settings_blue_theme">Plava</string>
|
||||
<string name="settings_grey_theme">Siva</string>
|
||||
<string name="translate_platform">na Weblate-u</string>
|
||||
<plurals name="groupCardCountWithArchived">
|
||||
<item quantity="one"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirana)</item>
|
||||
<item quantity="few"><xliff:g>%1$d</xliff:g> kartice (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirane)</item>
|
||||
<item quantity="other"><xliff:g>%1$d</xliff:g> kartica (<xliff:g id="archivedCount">%2$d</xliff:g> arhivirano)</item>
|
||||
</plurals>
|
||||
<string name="include_if_asking_support">Ako želiš da zatražiš podršku, ubaci sledeće informacije:</string>
|
||||
<string name="newBalanceSentence">Novo stanje: <xliff:g>%s</xliff:g></string>
|
||||
<string name="switchToBackImage">Prebaci na zadnju fotografiju</string>
|
||||
<string name="openBackImageInGalleryApp">Otvori zadnju fotografiju u galerija aplikaciji</string>
|
||||
<string name="settings_category_title_cards">Kartice</string>
|
||||
<string name="addWithoutBarcode">Dodaj karticu bez bar-koda</string>
|
||||
<string name="enter_card_id">Unesite broj ili tekst sa kartice</string>
|
||||
<string name="card_id_must_not_be_empty">Unesi broj kartice</string>
|
||||
<string name="add_a_card_in_a_different_way">Dodaj karticu na drugi način</string>
|
||||
<string name="field_must_not_be_empty">Ovo polje ne sme biti prazno</string>
|
||||
<string name="manually_enter_barcode_instructions">Unesi broj ili tekst sa kartice i pritisnite bar-kod koji liči na onaj koji je na kartici.</string>
|
||||
<string name="add_manually_warning_title">Skeniranje se preporučuje</string>
|
||||
<string name="add_manually_warning_message">Za neke prodavnice, vrednost bar-koda može da se razlikuje od broja napisanog na kartici. Zbog toga, ručno unešeni bar-kod možda neće uvek funkcionisati. Toplo se preporučuje da umesto toga skeniraš bar-kod kamerom. Da li ipak želiš da nastaviš?</string>
|
||||
<string name="continue_">Nastavi</string>
|
||||
<string name="spend">Potroši</string>
|
||||
<string name="receive">Primi</string>
|
||||
<string name="amountParsingFailed">Nevažeći iznos</string>
|
||||
<string name="addFromPdfFile">Odaberi PDF datoteku</string>
|
||||
<string name="errorReadingFile">Nije moguće pročitati datoteku</string>
|
||||
<string name="failedLaunchingFileManager">Nije moguće pronaći podržani menadžer datoteka</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Koji od pronađenih bar-kodova želiš da koristiš?</string>
|
||||
<string name="importCancelled">Uvoz je otkazan</string>
|
||||
<string name="exportCancelled">Izvoz je otkazan</string>
|
||||
<string name="useFrontImage">Koristi prednju fotografiju</string>
|
||||
<string name="useBackImage">Koristi zadnju fotografiju</string>
|
||||
<string name="pageWithNumber">Strana <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Čini se da tvoj uređaj nema kameru. Ako je ima, pokušaj da ponovo pokreneš uređaj. U suprotnom, koristi dugme Više opcija, koje se nalazi ispod, da bi dodao bar-kod na drugi način.</string>
|
||||
</resources>
|
||||
@@ -295,9 +295,4 @@
|
||||
<string name="addFromPdfFile">PDF dosyası seç</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Bulunan barkodlardan hangisini kullanmak istiyorsunuz?</string>
|
||||
<string name="pageWithNumber">Sayfa <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Aygıtınızda kamera yok gibi görünüyor. Eğer varsa, aygıtı yeniden başlatmayı deneyin. Aksi takdirde, barkodu başka bir şekilde eklemek için aşağıdaki daha fazla seçenek düğmesini kullanın.</string>
|
||||
<string name="importCancelled">İçe aktarma iptal edildi</string>
|
||||
<string name="exportCancelled">Dışa aktarma iptal edildi</string>
|
||||
<string name="useFrontImage">Ön resmi kullan</string>
|
||||
<string name="useBackImage">Arka resmi kullan</string>
|
||||
</resources>
|
||||
@@ -309,9 +309,4 @@
|
||||
<string name="spend">Витратити</string>
|
||||
<string name="receive">Отримайте</string>
|
||||
<string name="amountParsingFailed">Неправильна сума</string>
|
||||
<string name="noCameraFoundGuideText">Ваш пристрій може не мати камери. перезавантажте пристрій, якщо це не так. В іншому випадку додайте штрих-код за допомогою кнопки \"Більше опцій\".</string>
|
||||
<string name="importCancelled">Імпортування скасовано</string>
|
||||
<string name="exportCancelled">Експортування скасовано</string>
|
||||
<string name="useFrontImage">Використати фронтальне зображення</string>
|
||||
<string name="useBackImage">Використати зворотне зображення</string>
|
||||
</resources>
|
||||
@@ -288,5 +288,4 @@
|
||||
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Bạn muốn sử dụng mã vạch nào được tìm thấy?</string>
|
||||
<string name="failedLaunchingFileManager">Không thể tìm thấy trình quản lý tệp được hỗ trợ</string>
|
||||
<string name="noCameraFoundGuideText">Có vẻ như thiết bị của bạn không có camera. Nếu có, hãy thử khởi động lại thiết bị. Nếu không, hãy sử dụng nút Tùy chọn khác bên dưới để thêm mã vạch theo cách khác.</string>
|
||||
</resources>
|
||||
@@ -288,9 +288,4 @@
|
||||
<string name="pageWithNumber">第 <xliff:g>%d</xliff:g> 页</string>
|
||||
<string name="addFromPdfFile">选择 PDF 文件</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">找到的多个条形码中,你希望使用哪个?</string>
|
||||
<string name="noCameraFoundGuideText">你的设备似乎没有相机。如果的确如此,请尝试重启设备。否则,使用下方的“更多”按钮以另一种方式添加条形码。</string>
|
||||
<string name="importCancelled">取消了导入</string>
|
||||
<string name="exportCancelled">取消了导出</string>
|
||||
<string name="useFrontImage">使用正面图</string>
|
||||
<string name="useBackImage">使用背面图</string>
|
||||
</resources>
|
||||
@@ -234,7 +234,7 @@
|
||||
<string name="cameraPermissionRequired">這個行動需要使用鏡頭的權限…</string>
|
||||
<string name="cameraPermissionDeniedTitle">不能使用鏡頭</string>
|
||||
<string name="updateBalance">更新餘額</string>
|
||||
<string name="updateBalanceTitle">你花費或收到了多少錢?</string>
|
||||
<string name="updateBalanceTitle">你用了多少?</string>
|
||||
<string name="updateBalanceHint">輸入金額</string>
|
||||
<string name="currentBalanceSentence">餘額:<xliff:g>%s</xliff:g></string>
|
||||
<string name="newBalanceSentence">新的餘額:<xliff:g>%s</xliff:g></string>
|
||||
@@ -282,10 +282,4 @@
|
||||
<string name="errorReadingFile">無法讀取此檔案</string>
|
||||
<string name="receive">接收</string>
|
||||
<string name="amountParsingFailed">無效的數值</string>
|
||||
<string name="continue_">繼續</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">你想要使用哪個找到的條碼?</string>
|
||||
<string name="pageWithNumber">第 <xliff:g>%d</xliff:g> 頁</string>
|
||||
<string name="add_manually_warning_message">對於某些商店,條碼值與卡片上寫的數字並不相同。因此,手動輸入條碼可能並不總是有效。強烈建議使用相機掃描條碼。你還想繼續嗎?</string>
|
||||
<string name="spend">花費</string>
|
||||
<string name="noCameraFoundGuideText">您的裝置似乎沒有相機鏡頭。如果實際上有相機鏡頭,請嘗試重新啟動此裝置,否則請點選下方的「更多」按鈕,以其它方式新增條碼。</string>
|
||||
</resources>
|
||||
@@ -83,7 +83,6 @@
|
||||
<item>es-rAR</item>
|
||||
<!-- <item>fa</item> -->
|
||||
<item>fi</item>
|
||||
<!-- <item>fil</item> -->
|
||||
<item>fr</item>
|
||||
<item>he-rIL</item>
|
||||
<item>hi</item>
|
||||
@@ -104,13 +103,11 @@
|
||||
<item>nl</item>
|
||||
<item>oc</item>
|
||||
<item>pl</item>
|
||||
<item>pt-rBR</item>
|
||||
<item>pt-rPT</item>
|
||||
<item>ro-rRO</item>
|
||||
<item>ru</item>
|
||||
<item>sk</item>
|
||||
<item>sl</item>
|
||||
<item>sr</item>
|
||||
<item>sv</item>
|
||||
<!-- <item>ti</item> -->
|
||||
<item>tr</item>
|
||||
|
||||
@@ -346,9 +346,7 @@
|
||||
<string name="failedLaunchingFileManager">Could not find a supported file manager</string>
|
||||
<string name="multipleBarcodesFoundPleaseChooseOne">Which of the found barcodes do you want to use?</string>
|
||||
<string name="pageWithNumber">Page <xliff:g>%d</xliff:g></string>
|
||||
<string name="noCameraFoundGuideText">Your device does not seem to have a camera. If it does, try rebooting the device. Otherwise, use the "More options" button below to add a barcode another way.</string>
|
||||
<string name="importCancelled">Import cancelled</string>
|
||||
<string name="exportCancelled">Export cancelled</string>
|
||||
<string name="useFrontImage">Use front image</string>
|
||||
<string name="useBackImage">Use back image</string>
|
||||
<string name="exportStartedCheckNotifications">Export started, check your notifications for the result</string>
|
||||
<string name="importStartedCheckNotifications">Import started, check your notifications for the result</string>
|
||||
<string name="postNotificationsPermissionRequired">Permission to show notifications needed for this action…</string>
|
||||
</resources>
|
||||
|
||||
@@ -30,13 +30,11 @@
|
||||
<locale android:name="nl" />
|
||||
<locale android:name="oc" />
|
||||
<locale android:name="pl" />
|
||||
<locale android:name="pt-BR" />
|
||||
<locale android:name="pt-PT" />
|
||||
<locale android:name="ro-RO" />
|
||||
<locale android:name="ru" />
|
||||
<locale android:name="sk" />
|
||||
<locale android:name="sl" />
|
||||
<locale android:name="sr" />
|
||||
<locale android:name="sv" />
|
||||
<locale android:name="tr" />
|
||||
<locale android:name="uk" />
|
||||
|
||||
@@ -574,72 +574,6 @@ public class ImportExportTest {
|
||||
}
|
||||
}
|
||||
|
||||
class TestTaskCompleteListener implements ImportExportTask.TaskCompleteListener {
|
||||
ImportExportResult result;
|
||||
|
||||
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
|
||||
this.result = result;
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
@LooperMode(LooperMode.Mode.PAUSED)
|
||||
public void useImportExportTask() throws FileNotFoundException {
|
||||
final int NUM_CARDS = 10;
|
||||
|
||||
final File sdcardDir = Environment.getExternalStorageDirectory();
|
||||
final File exportFile = new File(sdcardDir, "Catima.csv");
|
||||
|
||||
TestHelpers.addLoyaltyCards(mDatabase, NUM_CARDS);
|
||||
|
||||
TestTaskCompleteListener listener = new TestTaskCompleteListener();
|
||||
|
||||
// Export to the file
|
||||
final String password = "123456789";
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(exportFile);
|
||||
ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream, password.toCharArray(), listener);
|
||||
TaskHandler mTasks = new TaskHandler();
|
||||
mTasks.executeTask(TaskHandler.TYPE.EXPORT, task);
|
||||
|
||||
// Actually run the task to completion
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.EXPORT, false, false, true);
|
||||
shadowOf(Looper.getMainLooper()).idleFor(Duration.ofMillis(5000));
|
||||
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
||||
|
||||
|
||||
// Check that the listener was executed
|
||||
assertNotNull(listener.result);
|
||||
assertEquals(ImportExportResultType.Success, listener.result.resultType());
|
||||
|
||||
TestHelpers.getEmptyDb(activity);
|
||||
|
||||
// Import everything back from the default location
|
||||
|
||||
listener = new TestTaskCompleteListener();
|
||||
|
||||
FileInputStream fileStream = new FileInputStream(exportFile);
|
||||
|
||||
task = new ImportExportTask(activity, DataFormat.Catima, fileStream, password.toCharArray(), listener);
|
||||
mTasks.executeTask(TaskHandler.TYPE.IMPORT, task);
|
||||
|
||||
// Actually run the task to completion
|
||||
// I am CONVINCED there must be a better way than to wait on this Queue with a flush.
|
||||
mTasks.flushTaskList(TaskHandler.TYPE.IMPORT, false, false, true);
|
||||
shadowOf(Looper.getMainLooper()).idleFor(Duration.ofMillis(5000));
|
||||
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
|
||||
|
||||
// Check that the listener was executed
|
||||
assertNotNull(listener.result);
|
||||
assertEquals(ImportExportResultType.Success, listener.result.resultType());
|
||||
|
||||
assertEquals(NUM_CARDS, DBHelper.getLoyaltyCardCount(mDatabase));
|
||||
|
||||
checkLoyaltyCards();
|
||||
|
||||
// Clear the database for the next format under test
|
||||
TestHelpers.getEmptyDb(activity);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void importWithoutColorsV1() {
|
||||
InputStream inputStream = getClass().getResourceAsStream("catima_v1_no_colors.csv");
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
plugins {
|
||||
id("com.android.application") version "8.5.1" apply false
|
||||
id("com.android.application") version "8.4.1" apply false
|
||||
id("com.github.spotbugs") version "5.1.4" apply false
|
||||
}
|
||||
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
Copylefted libre software (GPLv3+) card management app.
|
||||
|
||||
[](https://github.com/CatimaLoyalty/Android/releases)
|
||||
[](https://github.com/TheLastProject/Catima/releases)
|
||||
[](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima)
|
||||
[](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
|
||||
|
||||

|
||||

|
||||
[](https://hosted.weblate.org/engage/catima/)
|
||||
|
||||
[](https://matrix.to/#/%23catima:matrix.org)
|
||||
@@ -17,7 +17,7 @@ Copylefted libre software (GPLv3+) card management app.
|
||||
<a href="https://play.google.com/store/apps/details?id=me.hackerchick.catima" target="_blank">
|
||||
<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="90"/></a>
|
||||
|
||||
[](https://catima.app/)
|
||||
[](https://catima.app/)
|
||||
|
||||
*Logo by [Rose (TangentFoxy)](https://github.com/TangentFoxy), feature graphic by [Ziad OUALHADJ](https://github.com/ziadOUA)*
|
||||
|
||||
@@ -41,14 +41,14 @@ Supported barcodes:
|
||||
|
||||
# Screenshots
|
||||
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png)
|
||||
[<img src="https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png" width=250>](https://github.com/CatimaLoyalty/Android/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-01.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-02.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-03.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-04.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-05.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-06.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-07.png)
|
||||
[<img src="https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png" width=250>](https://github.com/TheLastProject/Catima/raw/main/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot-08.png)
|
||||
|
||||
# Moving data from other apps
|
||||
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
- Podpora skenování PDF souborů pro čárový kód
|
||||
- Podpora obrazových souborů s více čárovými kódy
|
||||
- Drobné UI opravy
|
||||
@@ -1 +0,0 @@
|
||||
- Různé opravy a vylepšení
|
||||
@@ -1,5 +1,5 @@
|
||||
- Karten-ID beim Bearbeiten vorab ausfüllen. (Pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
|
||||
- Barcode-Breite begrenzen, um Speicherprobleme zu vermeiden. (Pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
|
||||
- „Bearbeiten“ statt „Hinzufügen“ bei existierender ID anzeigen. (Pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
|
||||
- Farbschema und Layout überarbeitet. (Pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
|
||||
- Einführungsassistent bei der ersten Nutzung hinzugefügt. (Pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
|
||||
- Wenn du eine Karten-ID bearbeitest, wird die vorhandene ID zu Beginn ausgefüllt. (Pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
|
||||
- Begrenzen der Breite der erzeugten Barcodes, um die Speichernutzung und Fehler durch Speicherüberschreitung zu reduzieren. (Pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
|
||||
- Beim Bearbeiten einer Karte wird die Schaltfläche "Karte eingeben" in "Karte bearbeiten" geändert, wenn bereits eine Karten-ID existiert. (Pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
|
||||
- Farbschema angepasst so, dass mit dem App-Symbol kompatibel ist und das Layout beim Anzeigen einer Karte übersichtlicher gestaltet. (Pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
|
||||
- Hinzufügen eines Intro-Assistenten, der beim ersten Start der App gestartet wird. (Pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- Arabisch hinzugefügt
|
||||
- Archivierte Kartenanzahl anzeigen
|
||||
- Fehler beim Parsen der Salden behoben
|
||||
- Theme auf Hauptbildschirm korrigiert
|
||||
- Anzeige der ausgewählten Karten verbessert
|
||||
- Absturz bei RTL-Layouts behoben
|
||||
- Zurück-Pfeil in RTL-Layouts korrigiert
|
||||
- Arabisch wird unterstützt
|
||||
- Anzeige der archivierten Kartenanzahl in der Gruppenübersicht
|
||||
- Guthabenanalyse - Fehler beseitigt (Arabisch bzw. Sprachen mit nicht-westlichen Zahlen wurden nicht gespeichert)
|
||||
- Benutzerdefiniertes Thema wird nun korrekt auf dem Hauptbildschirm gezeigt
|
||||
- Verbesserte Anzeige ausgewählter Karten
|
||||
- Kein Absturz beim Verlassen der Kartenansicht bei Karten mit Ablaufdatum/Guthaben
|
||||
- Rückwärtspfeil in der Kartenansicht zeigt nicht mehr die falsche Richtung (RTL-Layout)
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
- Änderung in v0.11: Barcode-Dimensionen beibehalten und gleichzeitig den Speicherverbrauch reduzieren. (Pull #126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
|
||||
- Deutsche und französische Übersetzungen aktualisiert. (Pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), Pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), Pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125))
|
||||
- Eine Änderung in v0.11 reduzierte die Speichernutzung beim Zeichnen von Barcodes, wirkte sich aber auf die Barcode-Abmessungen aus. Dies wurde nun geändert, um die Barcode-Abmessungen beizubehalten und gleichzeitig die Speichernutzung zu reduzieren. (Pull #126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
|
||||
- Aktualisierung der deutschen und franz. Übersetzungen. (pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125))
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
- Unterstützung für das Scannen von PDF-Dateien nach Barcodes
|
||||
- Unterstützung für Bilddateien mit mehreren Barcodes
|
||||
- Kleinere UI-Korrekturen
|
||||
@@ -1 +0,0 @@
|
||||
- Verschiedene Fehlerbehebungen und Verbesserungen bei der Handhabung der Balance
|
||||
@@ -1,4 +0,0 @@
|
||||
- Unterstützung für die Erstellung einer Karte beim Teilen von einfachem Text
|
||||
- Anzeige des Bildtyps anstelle des Barcodes unter Bildern
|
||||
- Behebung eines möglichen Absturzes beim Versuch, ein Backup aus der Nextcloud-App zu importieren
|
||||
- Verbesserte Unterstützung für Geräte ohne Kamera
|
||||
@@ -1,3 +0,0 @@
|
||||
- Lange Store-Namen in der Vorschau auf mehrere Zeilen aufteilen
|
||||
- Vorder- oder Hintergrundbild im Thumbnail-Menü verwenden
|
||||
- Kleine Fehlerbehebungen bei Import/Export
|
||||
@@ -1,3 +1,3 @@
|
||||
- Menüoption zum Sperren der Bildschirmdrehung beim Anzeigen einer Karte hinzugefügt. (Pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
|
||||
- Wenn eine Karte nicht geladen werden kann, zeigt die App eine Fehlermeldung an. (Pull #132 (https://github.com/brarcher/loyalty-card-locker/pull/132))
|
||||
- Fehler bei fehlenden Layout-IDs für das Einführungstutorial behoben. (Pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
|
||||
- Hinzufügen einer Menüoption zum Sperren der Bildschirmdrehung, wenn eine Karte angezeigt wird. Wenn sie gesperrt ist, wird der Bildschirm in seine "natürliche" Ausrichtung übergehen und eine weitere Bildschirmdrehung wird blockiert (Pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
|
||||
- Wenn eine Karte auf dem Hauptbildschirm ausgewählt wird, aber nicht geladen werden kann, schlägt die Anwendung fehl und gibt eine Meldung aus. (Pull #132 (https://github.com/brarcher/loyalty-card-locker/pull/132))
|
||||
- Der Fall, dass Layout-IDs für den Intro-Assistenten nicht gefunden werden konnten, wurde behoben. (pull #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- Unterstützung für Home-Screen-Shortcuts beim Hinzufügen oder Bearbeiten einer Karte. (Pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
|
||||
- Widget entfernt, da es keine gute Alternative zu Shortcuts war. (Pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
|
||||
- Fehler beim Export von Backups auf Android 7+ behoben. (Pull #153 (https://github.com/brarcher/loyalty-card-locker/pull/153))
|
||||
- Genaueren MIME-Typ beim Export von Backup-Daten gemeldet. (Pull #156 (https://github.com/brarcher/loyalty-card-locker/pull/156))
|
||||
- Fehler beim Bearbeiten von Karten behoben. (Pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
|
||||
- Unterstützung für das Hinzufügen von Shortcuts zum Startbildschirm beim Hinzufügen oder Bearbeiten einer Karte. (Pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
|
||||
- Widget entfernen, da es ein schlechter Ersatz für Shortcuts war. (Pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
|
||||
- Exportieren von Backups unter Android 7+ korrigiert. (pull #153 (https://github.com/brarcher/loyalty-card-locker/pull/153))
|
||||
- Genauere Angabe des Mime-Typs beim Exportieren von Sicherungsdaten. (pull #156 (https://github.com/brarcher/loyalty-card-locker/pull/156))
|
||||
- Behebt einen Fehler, bei dem eine Karte nicht bearbeitet werden konnte. (pull #155 (https://github.com/brarcher/loyalty-card-locker/pull/155))
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
- Suche nach Karten hinzugefügt. (#320 (https://github.com/brarcher/loyalty-card-locker/pull/320))
|
||||
- Karten teilen und empfangen möglich. (#321 (https://github.com/brarcher/loyalty-card-locker/pull/321))
|
||||
- Unterstützung für den Dunkelmodus. (#322 (https://github.com/brarcher/loyalty-card-locker/pull/322))
|
||||
- Treuekarten können jetzt ohne Barcode gespeichert werden. (#324 (https://github.com/brarcher/loyalty-card-locker/pull/324))
|
||||
- Notizen können mehrere Zeilen umfassen. (#326 (https://github.com/brarcher/loyalty-card-locker/pull/326))
|
||||
- Verbesserungen bei der Notizgröße. (#319 (https://github.com/brarcher/loyalty-card-locker/pull/319))
|
||||
- Benachrichtigungen und App-Icon sichtbarer gemacht. (#330 (https://github.com/brarcher/loyalty-card-locker/pull/330))
|
||||
- Ziel-SDK auf Android 10 aktualisiert.
|
||||
- Übersetzungen verbessert:
|
||||
- Möglichkeit nach einer Karte zu suchen (#320 (https://github.com/brarcher/loyalty-card-locker/pull/320))
|
||||
- Möglichkeit Treuekarten weiterzugeben und zu empfangen (#321 (https://github.com/brarcher/loyalty-card-locker/pull/321))
|
||||
- Unterstützung des dunklen Modus (#322 (https://github.com/brarcher/loyalty-card-locker/pull/322))
|
||||
- Treuekarten können jetzt barcodefrei sein (d.h. keinen Barcode haben) (#324 (https://github.com/brarcher/loyalty-card-locker/pull/324))
|
||||
- Notizen können sich über mehrere Zeilen erstrecken (#326 (https://github.com/brarcher/loyalty-card-locker/pull/326))
|
||||
- Größe von Notizen verbessert (#319 (https://github.com/brarcher/loyalty-card-locker/pull/319))
|
||||
- Sichtbarkeit von Benachrichtigungen und App-Symbolen verbessert (#330 (https://github.com/brarcher/loyalty-card-locker/pull/330))
|
||||
- Ziel-SDK auf Android 10 gesetzt
|
||||
- Verbesserte Übersetzungen:
|
||||
- Deutsch
|
||||
- Italienisch
|
||||
- Niederländisch
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
- BREAKING CHANGE: Backup-Format geändert, siehe https://github.com/TheLastProject/Catima/wiki/Export-format
|
||||
- BREAKING CHANGE: URL-Sharing-Format geändert, siehe https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
|
||||
- Taschenlampe beim Scannen an/aus
|
||||
- UPC-E-Unterstützung hinzugefügt
|
||||
- Fotos von Vorder- und Rückseite der Karte hinzufügen
|
||||
- Passwortgeschützte Zip-Dateien importieren
|
||||
- Stocard-Import (Beta) unterstützt
|
||||
- Leerzeichen bei Fidme-Import entfernt
|
||||
- Neues Voucher Vault-Format unterstützt
|
||||
- Floating Action Buttons auf Android 4 repariert
|
||||
- Oberer Rand der Appbar repariert
|
||||
- BREAKING CHANGE: Das Backupformat hat sich geändert, siehe https://github.com/TheLastProject/Catima/wiki/Export-format
|
||||
- BREAKING CHANGE: Das URL-Sharing-Format wurde geändert, siehe https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format
|
||||
- Aktivieren/Deaktivieren der Taschenlampe während des Scannens ermöglicht
|
||||
- UPC-E-Unterstützung
|
||||
- Hinzufügen eines Vorder- und Rückseitenfotos zu jeder Karte
|
||||
- Imports passwortgeschützter Zip-Dateien
|
||||
- Imports von Stocard (Beta)
|
||||
- Unnötige Leerzeichen in Notizen aus dem Fidme-Import korrigiert
|
||||
- Unterstützung des neuen Voucher Vault-Exportformats
|
||||
- Aktionsschaltflächen repariert, die sich hinter anderen UI-Elementen auf Android 4 befanden
|
||||
- Oberer Rand der Treuekarten Leiste repariert
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
- Bildschirmhelligkeit auf Maximum beim Anzeigen einer Karte. (Pull #54 (https://github.com/brarcher/loyalty-card-locker/pull/54))
|
||||
- Bestätigung beim Löschen von Karten hinzugefügt. (Pull #55 (https://github.com/brarcher/loyalty-card-locker/pull/55))
|
||||
- Deutsche (Pull #57 (https://github.com/brarcher/loyalty-card-locker/pull/57)) und tschechische (Pull #58 (https://github.com/brarcher/loyalty-card-locker/pull/58)) Übersetzungen hinzugefügt.
|
||||
- Italienische Übersetzung verbessert. (Pull #66 (https://github.com/brarcher/loyalty-card-locker/pull/66))
|
||||
- Bildschirmhelligkeit wird beim Anzeigen einer Karte auf das Maximum erhöht, um das Scannen zu verbessern. (pull #54 (https://github.com/brarcher/loyalty-card-locker/pull/54))
|
||||
- Bestätigung beim Löschen einer Karte. (pull #55 (https://github.com/brarcher/loyalty-card-locker/pull/55))
|
||||
- Deutsche Übersetzung (pull #57 (https://github.com/brarcher/loyalty-card-locker/pull/57)) und Tschechisch (pull #58 (https://github.com/brarcher/loyalty-card-locker/pull/58)) hinzugefügt.
|
||||
- Vereinfachung der italienischen Übersetzung. (pull #66 (https://github.com/brarcher/loyalty-card-locker/pull/66))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Der Name „Locker“ war missverständlich. Ein neues Icon von betsythefc und der neue Name „Loyalty Card Keychain“ verdeutlichen den Zweck der App.
|
||||
Der "Locker" -Teil des Namens war nicht intuitiv. Um dies zu ändern, wurde von betsythefc ein neues Anwendungssymbol erstellt, das den Zweck der Anwendung besser darstellt: die Speicherung von Kundenkarten, die Barcodes verwenden. Zusammen mit diesem neuen Symbol wurde der Name der Anwendung in "Kundenkarten-Schlüsselbund" geändert.
|
||||
|
||||
Zusätzliche Funktionen/Verbesserungen:
|
||||
|
||||
- Flexibleres Import/Export von Karten. (Pull #76 (https://github.com/brarcher/loyalty-card-locker/pull/76))
|
||||
- Litauische Übersetzung hinzugefügt. (Pull #62 (https://github.com/brarcher/loyalty-card-locker/pull/62))
|
||||
- Französische Übersetzung hinzugefügt. (Pull #80 (https://github.com/brarcher/loyalty-card-locker/pull/80))
|
||||
- Das Importieren/Exportieren von Karten wurde flexibler gestaltet. (pull #76 (https://github.com/brarcher/loyalty-card-locker/pull/76))
|
||||
- Übersetzung für Litauisch hinzugefügt. (pull #62 (https://github.com/brarcher/loyalty-card-locker/pull/62))
|
||||
- Übersetzung für Französisch hinzugefügt. (pull #80 (https://github.com/brarcher/loyalty-card-locker/pull/80))
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
- Support for creating a card when sharing plain text
|
||||
- Display image type instead of barcode below images
|
||||
- Fix possible crash when trying to import a backup from the Nextcloud app
|
||||
- Improved support for devices without camera
|
||||
- Display image type instead of barcode below images
|
||||
@@ -1,4 +0,0 @@
|
||||
- Allow long store names in preview to split over multiple lines
|
||||
- Option to use front of back image in thumbnail menu
|
||||
- Minor import/export fixes
|
||||
- Minor UI fixes
|
||||
@@ -1,5 +1,5 @@
|
||||
- Al editar un ID de tarjeta, pre-poblar el ID existente para comenzar. (pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
|
||||
- Limitar el ancho de los códigos de barras generados para reducir el uso de memoria y los errores de memoria. (pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
|
||||
- Cuando edite una tarjeta, cambie el botón "Enter Card" para decir "Editar Tarjeta" si ya existe una tarjeta ID. (pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
|
||||
- Cambiar el esquema de color para que sea más suave y compatible con el icono de la aplicación, y cambiar el diseño al ver una tarjeta para que sea más limpio. (pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
|
||||
- Añadir un asistente de introducción que se inicia en el primer lanzamiento de la aplicación. (pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
|
||||
- Al editar un ID de tarjeta, rellenar previamente el ID existente para empezar. (pull #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
|
||||
- Limitar el ancho de los códigos de barras generados para reducir el uso de memoria y los errores de memoria insuficiente. (pull #103 (https://github.com/brarcher/loyalty-card-locker/pull/103))
|
||||
- Al editar una tarjeta, cambiar el botón "Introducir tarjeta" por "Editar tarjeta" si ya existe un ID de tarjeta. (pull #104 (https://github.com/brarcher/loyalty-card-locker/pull/104))
|
||||
- Cambiar la combinación de colores para que sea más suave y compatible con el icono de la aplicación, y cambiar el diseño al ver una tarjeta para que sea más limpio. (pull #107 (https://github.com/brarcher/loyalty-card-locker/pull/107))
|
||||
- Añadir un asistente de introducción que se lanza en el primer lanzamiento de la aplicación. (pull #108 (https://github.com/brarcher/loyalty-card-locker/pull/108))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
- Soporte para idioma árabe
|
||||
- Mostrar el recuento de tarjetas archivadas en la descripción general del grupo
|
||||
- Se corrigieron errores de análisis de equilibrio (las tarjetas no se podían guardar en árabe ni en otros idiomas con números no occidentales)
|
||||
- Se solucionó el problema de que el tema personalizado no se aplicaba correctamente a la pantalla principal
|
||||
- Mejorar la visualización de las tarjetas seleccionadas
|
||||
- Se solucionó el bloqueo al salir de la vista de tarjeta en diseños RTL para tarjetas con vencimiento o saldo
|
||||
- Se corrigió la flecha hacia atrás en la vista de tarjeta que apuntaba en la dirección incorrecta en los diseños RTL
|
||||
- Soporte de idioma árabe
|
||||
- Muestra el número total de tarjetas archivadas en vista general del grupo
|
||||
- Corrección de errores en el análisis de saldo (no se podían guardar tarjetas en árabe y otros idiomas con números no occidentales)
|
||||
- Corrección de tema personalizado no se aplicaba correctamente a la pantalla principal
|
||||
- Mejoras en la pantalla de selección de tarjetas
|
||||
- Corrección error de cierre al salir de la vista de tarjeta en diseños RTL para tarjetas con caducidad o saldo
|
||||
- Corrección de la flecha para volver en la vista de tarjeta que apunta en la dirección incorrecta en diseños RTL
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
- Un cambio en la versión 0.11 redujo el uso de memoria para el dibujo de códigos de barras, pero afectó las dimensiones de los códigos de barras. Esto ahora se modificó para mantener las dimensiones de los códigos de barras y reducir el uso de memoria. (pull n.° 126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
|
||||
- Actualización de las traducciones al alemán y al francés. (pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125))
|
||||
- Un cambio en la versión v0.11 redujo el uso de memoria en la generación de códigos de barras, pero afectó las dimensiones. Se cambió para mantener las dimensiones mientras se reduce el uso de memoria. (pull #126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
|
||||
- Actualizadas las traducciones en alemán y francés. (pull #122 (https://github.com/brarcher/loyalty-card-locker/pull/122), pull #124 (https://github.com/brarcher/loyalty-card-locker/pull/124), pull #125 (https://github.com/brarcher/loyalty-card-locker/pull/125))
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
- Se mejoró el flujo de trabajo "Agregar tarjeta"
|
||||
- Mejoras en el proceso de validación.
|
||||
- Se corrigió un error que causaba que la interfaz de usuario entrara en un estado no válido al cambiar la vista del archivo.
|
||||
- El color del sistema o del mapa se utiliza para la barra de navegación (Android 8.1+)
|
||||
- Se actualizó el selector de fechas para fechas de validez y vencimiento.
|
||||
- Se agregó una opción para forzar la rotación de la pantalla (ignora la configuración del sistema)
|
||||
- Refinado la secuencia de "Añadir tarjeta"
|
||||
- Mejora de la secuencia de validación
|
||||
- Reparación de caso de borde causando un estado invalido de la UI haciendo que se muestre el archivo
|
||||
- Usar el tema o color de la tarjeta para la barra de navegación (Android 8.1+)
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
- Android 14
|
||||
- Abrir el icono de la tarjeta en la galería al tocarla
|
||||
- Mejorar el diseño de la pestaña Fotos en la vista de edición
|
||||
- Actualizar la pantalla de gastos para que también admita la recepción
|
||||
@@ -1,3 +0,0 @@
|
||||
- Soporte para escanear archivos PDF en busca de códigos de barras
|
||||
- Compatibilidad con archivos de imagen con múltiples códigos de barras
|
||||
- Correcciones menores en la interfaz de usuario
|
||||
@@ -1 +0,0 @@
|
||||
- Varias correcciones y mejoras en el manejo del equilibrio
|
||||
@@ -1,4 +0,0 @@
|
||||
- Permitir que los nombres de tiendas largos en la vista previa se dividan en varias líneas
|
||||
- Opción para usar la imagen frontal o posterior en el menú de miniaturas
|
||||
- Correcciones menores de importación y exportación.
|
||||
- Correcciones menores en la interfaz de usuario
|
||||
@@ -1,4 +0,0 @@
|
||||
- Cible Android 14
|
||||
- Ouvre l'icône de la carte dans la galerie au toucher
|
||||
- Améliore la conception de l'onglet "Photos" en mode édition
|
||||
- Mis à jour l'écran des dépenses pour prendre également en charge la réception
|
||||
@@ -1,3 +0,0 @@
|
||||
- Prise en charge de la numérisation des fichiers PDF pour les codes-barres
|
||||
- Prise en charge des fichiers d'image avec plusieurs codes-barres
|
||||
- Corrections mineures de l'interface utilisateur
|
||||
@@ -1 +0,0 @@
|
||||
- Divers correctifs et améliorations pour la gestion du solde
|
||||
@@ -1,4 +0,0 @@
|
||||
- Prise en charge de la création d'une carte lors du partage de texte brut
|
||||
- Affiche le type d'image au lieu du code-barre sous les images
|
||||
- Correction d'un crash possible lors de la tentative d'importation d'une sauvegarde depuis l'application Nextcloud
|
||||
- Amélioration de la prise en charge des appareils sans caméra
|
||||
@@ -1,3 +0,0 @@
|
||||
- Permettre aux noms de magasins longs dans l'aperçu d'être divisés sur plusieurs lignes
|
||||
- Possibilité d'utiliser l'image avant ou arrière dans le menu des vignettes
|
||||
- Corrections mineures pour l'importation et l'exportation
|
||||
@@ -1 +0,0 @@
|
||||
- संतुलन प्रबंधन के लिए विभिन्न सुधार और सुधार
|
||||
@@ -1,4 +0,0 @@
|
||||
- सादा पाठ साझा करते समय कार्ड बनाने का समर्थन करता है
|
||||
- छवियों के नीचे बारकोड के बजाय छवि प्रकार प्रदर्शित करता है
|
||||
- नेक्स्टक्लाउड ऐप से बैकअप आयात करने का प्रयास करते समय संभावित क्रैश को ठीक किया गया
|
||||
- बिना कैमरे वाले उपकरणों के लिए बेहतर समर्थन
|
||||
@@ -1,3 +0,0 @@
|
||||
- पूर्वावलोकन में लंबे स्टोर नामों को कई पंक्तियों में विभाजित करने की अनुमति दें
|
||||
- थंबनेल मेनू में पीछे की छवि के सामने का उपयोग करने का विकल्प
|
||||
- मामूली आयात/निर्यात सुधार
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user