Compare commits

..

2 Commits

Author SHA1 Message Date
Sylvia van Os
3aad062e3d Merge pull request #1751 from CatimaLoyalty/create-pull-request/patch-1708269529
Update feature graphic
2024-02-18 16:20:47 +01:00
TheLastProject
dd09d0e130 Update feature graphic 2024-02-18 15:18:49 +00:00
96 changed files with 322 additions and 753 deletions

View File

@@ -35,7 +35,7 @@ jobs:
- name: Run converter script
run: python .scripts/changelog_to_fastlane.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.2
uses: peter-evans/create-pull-request@v6.0.0
with:
title: "Update Fastlane changelogs"
commit-message: "Update Fastlane changelogs"

View File

@@ -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.0.2
uses: peter-evans/create-pull-request@v6.0.0
with:
title: "Update contributors"
commit-message: "Update contributors"

View File

@@ -38,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.0.2
uses: peter-evans/create-pull-request@v6.0.0
with:
title: "Update feature graphic"
commit-message: "Update feature graphic"

View File

@@ -26,7 +26,7 @@ jobs:
id: gradle-update
- uses: gradle/wrapper-validation-action@v2
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.2
uses: peter-evans/create-pull-request@v6.0.0
with:
title: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"
commit-message: "Update Gradle to ${{ steps.gradle-update.outputs.version }}"

View File

@@ -31,7 +31,7 @@ jobs:
- name: Update locales
run: .scripts/locales.py
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.2
uses: peter-evans/create-pull-request@v6.0.0
with:
title: "Update locales"
commit-message: "Update locales"

View File

@@ -13,18 +13,14 @@ for lang in "$script_location/../../fastlane/metadata/android/"*; do
elif grep -q title.txt; then
# No result, try splitting title.txt on (en dash)
IFS='' read -r appname subtext < title.txt
elif grep -q - title.txt; then
else
# No result, try splitting on - (dash)
IFS='-' read -r appname subtext < title.txt
else
# No result, use the full title as app name and default subtext
appname=$(< title.txt)
subtext="Loyalty Card Wallet"
fi
export appname=${appname%% }
export subtext=${subtext## }
# If the appname isn't Catima or there is subtext, change the .svg accordingly
if [ "$appname" != "Catima" ] || [ -n "$subtext" ]; then
# If there is subtext, change the .svg accordingly
if [ -n "$subtext" ]; then
perl -pi -e 's/Catima/$ENV{appname}/' featureGraphic.svg
perl -pi -e 's/Loyalty Card Wallet/$ENV{subtext}/' featureGraphic.svg
# Set correct font or font size for language if needed

View File

@@ -1,16 +1,10 @@
# Changelog
## Unreleased - 134
- Support for scanning PDF files for barcodes
- Support for image files with multiple barcodes
## v2.28.0 - 133 (2024-03-08)
## Unreleased - 133
- Target Android 14
- Open card icon in gallery on touch
- Improve design of Photos tab in edit view
- Update spending screen to also support receiving
## v2.27.0 - 132 (2024-01-30)

View File

@@ -21,8 +21,8 @@ android {
applicationId = "me.hackerchick.catima"
minSdk = 21
targetSdk = 34
versionCode = 133
versionName = "2.28.0"
versionCode = 132
versionName = "2.27.0"
vectorDrawables.useSupportLibrary = true
multiDexEnabled = true

View File

@@ -44,7 +44,6 @@
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
<data android:mimeType="application/pdf" />
</intent-filter>
</activity>
<activity

View File

@@ -3,17 +3,12 @@ package protect.card_locker;
public class BarcodeValues {
private final String mFormat;
private final String mContent;
private String mNote;
public BarcodeValues(String format, String content) {
mFormat = format;
mContent = content;
}
public void setNote(String note) {
mNote = note;
}
public String format() {
return mFormat;
}
@@ -22,5 +17,7 @@ public class BarcodeValues {
return mContent;
}
public String note() { return mNote; }
}
public boolean isEmpty() {
return mFormat == null && mContent == null;
}
}

View File

@@ -1,6 +0,0 @@
package protect.card_locker;
public interface BarcodeValuesListDisambiguatorCallback {
void onUserChoseBarcode(BarcodeValues barcodeValues);
void onUserDismissedSelector();
}

View File

@@ -12,7 +12,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
@@ -22,7 +21,6 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textfield.TextInputLayout;
import java.io.IOException;
import java.io.InputStream;
@@ -123,19 +121,16 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
builder.setTitle(R.string.exportPassword);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
final TextInputLayout textInputLayout = new TextInputLayout(ImportExportActivity.this);
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);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.leftMargin = 50;
params.rightMargin = 50;
final EditText input = new EditText(ImportExportActivity.this);
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
input.setLayoutParams(params);
input.setHint(R.string.exportPasswordHint);
textInputLayout.addView(input);
container.addView(textInputLayout);
container.addView(input);
builder.setView(container);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
exportPassword = input.getText().toString();
@@ -148,6 +143,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
});
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
builder.show();
});
// Check that there is a file manager available
@@ -319,21 +315,9 @@ public class ImportExportActivity extends CatimaAppCompatActivity {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
builder.setTitle(R.string.passwordRequired);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
final TextInputLayout textInputLayout = new TextInputLayout(ImportExportActivity.this);
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(this);
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
input.setHint(R.string.exportPasswordHint);
textInputLayout.addView(input);
container.addView(textInputLayout);
builder.setView(container);
builder.setView(input);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
openFileForImport(uri, input.getText().toString().toCharArray());

View File

@@ -123,7 +123,8 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
}
inputHolder.mCardIcon.setContentDescription(loyaltyCard.store);
inputHolder.mIconBackgroundColor = Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText);
Utils.setIconOrTextWithBackground(mContext, loyaltyCard, icon, inputHolder.mCardIcon, inputHolder.mCardText);
inputHolder.setIconBackgroundColor(Utils.getHeaderColor(mContext, loyaltyCard));
inputHolder.toggleCardStateIcon(loyaltyCard.starStatus != 0, loyaltyCard.archiveStatus != 0, itemSelected(inputCursor.getPosition()));
@@ -338,6 +339,11 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mArchivedBackground.invalidate();
}
public void setIconBackgroundColor(int color) {
mIconBackgroundColor = color;
mCardIcon.setBackgroundColor(color);
}
}
public int dpToPx(int dp, Context mContext) {

View File

@@ -646,22 +646,11 @@ public class LoyaltyCardEditActivity extends CatimaAppCompatActivity implements
Log.d("barcode card id editor", "barcode and card id editor picker returned without an intent");
return;
}
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, getApplicationContext());
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, getApplicationContext());
Utils.makeUserChooseBarcodeFromList(this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
}
@Override
public void onUserDismissedSelector() {
}
});
cardId = barcodeValues.content();
barcodeType = barcodeValues.format();
barcodeId = "";
}
});

View File

@@ -29,7 +29,6 @@ import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -421,11 +420,7 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
private void showBalanceUpdateDialog() {
AlertDialog.Builder builder = new MaterialAlertDialogBuilder(this);
// Header
builder.setTitle(R.string.updateBalanceTitle);
// Layout
FrameLayout container = new FrameLayout(this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
@@ -443,91 +438,61 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
currentTextview.setText(getString(R.string.currentBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
layout.addView(currentTextview);
TextView updateTextView = new TextView(this);
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)));
layout.addView(updateTextView);
final TextInputEditText input = new TextInputEditText(this);
Context dialogContext = this;
input.setInputType(InputType.TYPE_CLASS_NUMBER);
input.setKeyListener(DigitsKeyListener.getInstance("0123456789,."));
input.setHint(R.string.updateBalanceHint);
input.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal newBalance;
try {
newBalance = calculateNewBalance(loyaltyCard.balance, loyaltyCard.balanceType, s.toString());
} catch (ParseException e) {
input.setTag(null);
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(dialogContext, loyaltyCard.balance, loyaltyCard.balanceType)));
return;
}
// Save new balance into this element
input.setTag(newBalance);
updateTextView.setText(getString(R.string.newBalanceSentence, Utils.formatBalance(dialogContext, newBalance, loyaltyCard.balanceType)));
}
});
layout.addView(input);
layout.setLayoutParams(params);
container.addView(layout);
// Set layout
builder.setView(container);
// Buttons
builder.setPositiveButton(R.string.spend, (dialogInterface, i) -> {
// Calculate and update balance
try {
BigDecimal balanceChange = Utils.parseBalance(input.getText().toString(), loyaltyCard.balanceType);
BigDecimal newBalance = loyaltyCard.balance.subtract(balanceChange).max(new BigDecimal(0));
DBHelper.updateLoyaltyCardBalance(database, loyaltyCardId, newBalance);
} catch (ParseException e) {
Toast.makeText(getApplicationContext(), R.string.amountParsingFailed, Toast.LENGTH_LONG).show();
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
// Grab calculated balance from input field
BigDecimal newBalance = (BigDecimal) input.getTag();
if (newBalance == null) {
return;
}
// Reload state
// Actually update balance
DBHelper.updateLoyaltyCardBalance(database, loyaltyCardId, newBalance);
// Reload UI
this.onResume();
// Show new balance
Toast.makeText(getApplicationContext(), getString(R.string.newBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)), Toast.LENGTH_LONG).show();
});
builder.setNegativeButton(R.string.receive, (dialogInterface, i) -> {
// Calculate and update balance
try {
BigDecimal balanceChange = Utils.parseBalance(input.getText().toString(), loyaltyCard.balanceType);
BigDecimal newBalance = loyaltyCard.balance.add(balanceChange);
DBHelper.updateLoyaltyCardBalance(database, loyaltyCardId, newBalance);
} catch (ParseException e) {
Toast.makeText(getApplicationContext(), R.string.amountParsingFailed, Toast.LENGTH_LONG).show();
}
// Reload state
this.onResume();
// Show new balance
Toast.makeText(getApplicationContext(), getString(R.string.newBalanceSentence, Utils.formatBalance(this, loyaltyCard.balance, loyaltyCard.balanceType)), Toast.LENGTH_LONG).show();
});
builder.setNeutralButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
builder.setNegativeButton(getString(R.string.cancel), (dialog, which) -> dialog.cancel());
AlertDialog dialog = builder.create();
// Now that the dialog exists, we can bind something that affects the buttons
input.addTextChangedListener(new SimpleTextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
BigDecimal balanceChange;
try {
balanceChange = Utils.parseBalance(s.toString(), loyaltyCard.balanceType);
} catch (ParseException e) {
input.setError(getString(R.string.amountParsingFailed));
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
return;
}
input.setError(null);
if (balanceChange.equals(new BigDecimal(0))) {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
} else {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(true);
}
}
});
dialog.show();
// Disable buttons (must be done **after** dialog is shown to prevent crash
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
// Set focus on input field
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
input.requestFocus();
}
private BigDecimal calculateNewBalance(BigDecimal currentBalance, Currency currency, String unparsedSubtraction) throws ParseException {
BigDecimal subtraction = Utils.parseBalance(unparsedSubtraction, currency);
return currentBalance.subtract(subtraction).max(new BigDecimal(0));
}
private void setBottomAppBarButtonState() {
if (!loyaltyCard.note.isEmpty() || !loyaltyCardGroups.isEmpty() || hasBalance(loyaltyCard) || loyaltyCard.validFrom != null || loyaltyCard.expiry != null) {
binding.bottomAppBarInfoButton.setVisibility(View.VISIBLE);
@@ -736,8 +701,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.updateLoyaltyCardLastUsed(database, loyaltyCard.id);
invalidateOptionsMenu();
ShortcutHelper.updateShortcuts(this, loyaltyCard);
}
private void setStateBasedOnImageTypes() {
@@ -837,8 +800,6 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
DBHelper.updateLoyaltyCardArchiveStatus(database, loyaltyCardId, 1);
Toast.makeText(LoyaltyCardViewActivity.this, R.string.archived, Toast.LENGTH_LONG).show();
ShortcutHelper.removeShortcut(LoyaltyCardViewActivity.this, loyaltyCardId);
// Re-init loyaltyCard with new data from DB
onResume();
invalidateOptionsMenu();

View File

@@ -7,6 +7,8 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.database.CursorIndexOutOfBoundsException;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
@@ -31,6 +33,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.tabs.TabLayout;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
@@ -147,7 +150,6 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
for (LoyaltyCard loyaltyCard : mAdapter.getSelectedItems()) {
Log.d(TAG, "Archiving card: " + loyaltyCard.id);
DBHelper.updateLoyaltyCardArchiveStatus(mDatabase, loyaltyCard.id, 1);
ShortcutHelper.removeShortcut(MainActivity.this, loyaltyCard.id);
updateLoyaltyCardList(false);
inputMode.finish();
invalidateOptionsMenu();
@@ -192,12 +194,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
protected void onCreate(Bundle inputSavedInstanceState) {
extractIntentFields(getIntent());
SplashScreen.installSplashScreen(this);
super.onCreate(inputSavedInstanceState);
// We should extract the share intent after we called the super.onCreate as it may need to spawn a dialog window and the app needs to be initialized to not crash
extractIntentFields(getIntent());
binding = MainActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
setSupportActionBar(binding.toolbar);
@@ -287,11 +287,11 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
Intent intent = result.getData();
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(Utils.BARCODE_SCAN, result.getResultCode(), intent, this);
Bundle inputBundle = intent.getExtras();
String group = inputBundle != null ? inputBundle.getString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP) : null;
processBarcodeValuesList(barcodeValuesList, group, false);
processBarcodeValues(barcodeValues, group);
});
mSettingsLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
@@ -446,57 +446,63 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
}
private void processBarcodeValuesList(List<BarcodeValues> barcodeValuesList, String group, boolean closeAppOnNoBarcode) {
if (barcodeValuesList.isEmpty()) {
private void processBarcodeValues(BarcodeValues barcodeValues, String group) {
if (barcodeValues.isEmpty()) {
throw new IllegalArgumentException("barcodesValues may not be empty");
}
Utils.makeUserChooseBarcodeFromList(MainActivity.this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
}
@Override
public void onUserDismissedSelector() {
if (closeAppOnNoBarcode) {
finish();
}
}
});
Intent newIntent = new Intent(getApplicationContext(), LoyaltyCardEditActivity.class);
Bundle newBundle = new Bundle();
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_BARCODETYPE, barcodeValues.format());
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_CARDID, barcodeValues.content());
if (group != null) {
newBundle.putString(LoyaltyCardEditActivity.BUNDLE_ADDGROUP, group);
}
newIntent.putExtras(newBundle);
startActivity(newIntent);
}
private void onSharedIntent(Intent intent) {
String receivedAction = intent.getAction();
String receivedType = intent.getType();
// Check if an image or file was shared to us
// Check if an image was shared to us
if (Intent.ACTION_SEND.equals(receivedAction)) {
List<BarcodeValues> barcodeValuesList;
if (receivedType.startsWith("image/")) {
barcodeValuesList = Utils.retrieveBarcodesFromImage(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else if (receivedType.equals("application/pdf")) {
barcodeValuesList = Utils.retrieveBarcodesFromPdf(this, intent.getParcelableExtra(Intent.EXTRA_STREAM));
} else {
if (!receivedType.startsWith("image/")) {
Log.e(TAG, "Wrong mime-type");
return;
}
if (barcodeValuesList.isEmpty()) {
BarcodeValues barcodeValues;
Bitmap bitmap;
Uri data = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (data == null) {
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
processBarcodeValuesList(barcodeValuesList, null, true);
try {
bitmap = Utils.retrieveImageFromUri(this, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(this, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
finish();
return;
}
barcodeValues = Utils.getBarcodeFromBitmap(bitmap);
if (barcodeValues.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(this, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
finish();
return;
}
processBarcodeValues(barcodeValues, null);
}
}
@@ -792,6 +798,8 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
b.putIntegerArrayList("cardList", cardList);
intent.putExtras(b);
ShortcutHelper.updateShortcuts(MainActivity.this, loyaltyCard);
startActivity(intent);
}
}

View File

@@ -62,7 +62,6 @@ public class ScanActivity extends CatimaAppCompatActivity {
private static final int COMPAT_SCALE_FACTOR_DIP = 320;
private static final int PERMISSION_SCAN_ADD_FROM_IMAGE = 100;
private static final int PERMISSION_SCAN_ADD_FROM_PDF = 101;
private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
@@ -74,7 +73,6 @@ public class ScanActivity extends CatimaAppCompatActivity {
private ActivityResultLauncher<Intent> manualAddLauncher;
// can't use the pre-made contract because that launches the file manager for image type instead of gallery
private ActivityResultLauncher<Intent> photoPickerLauncher;
private ActivityResultLauncher<Intent> pdfPickerLauncher;
static final String STATE_SCANNER_ACTIVE = "scannerActive";
private boolean mScannerActive = true;
@@ -101,7 +99,6 @@ public class ScanActivity extends CatimaAppCompatActivity {
manualAddLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.SELECT_BARCODE_REQUEST, result.getResultCode(), result.getData()));
photoPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_IMAGE_FILE, result.getResultCode(), result.getData()));
pdfPickerLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> handleActivityResult(Utils.BARCODE_IMPORT_FROM_PDF_FILE, result.getResultCode(), result.getData()));
customBarcodeScannerBinding.fabOtherOptions.setOnClickListener(view -> {
setScannerActive(false);
@@ -111,8 +108,7 @@ public class ScanActivity extends CatimaAppCompatActivity {
new CharSequence[]{
getString(R.string.addWithoutBarcode),
getString(R.string.addManually),
getString(R.string.addFromImage),
getString(R.string.addFromPdfFile)
getString(R.string.addFromImage)
},
(dialogInterface, i) -> {
switch (i) {
@@ -125,9 +121,6 @@ public class ScanActivity extends CatimaAppCompatActivity {
case 2:
addFromImage();
break;
case 3:
addFromPdfFile();
break;
default:
throw new IllegalArgumentException("Unknown 'Add a card in a different way' dialog option");
}
@@ -275,24 +268,14 @@ public class ScanActivity extends CatimaAppCompatActivity {
private void handleActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
List<BarcodeValues> barcodeValuesList = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
BarcodeValues barcodeValues = Utils.parseSetBarcodeActivityResult(requestCode, resultCode, intent, this);
if (barcodeValuesList.isEmpty()) {
if (barcodeValues.isEmpty()) {
setScannerActive(true);
return;
}
Utils.makeUserChooseBarcodeFromList(this, barcodeValuesList, new BarcodeValuesListDisambiguatorCallback() {
@Override
public void onUserChoseBarcode(BarcodeValues barcodeValues) {
returnResult(barcodeValues.content(), barcodeValues.format());
}
@Override
public void onUserDismissedSelector() {
setScannerActive(true);
}
});
returnResult(barcodeValues.content(), barcodeValues.format());
}
private void addWithoutBarcode() {
@@ -381,23 +364,19 @@ public class ScanActivity extends CatimaAppCompatActivity {
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_IMAGE);
}
public void addFromPdfFile() {
PermissionUtils.requestStorageReadPermission(this, PERMISSION_SCAN_ADD_FROM_PDF);
}
private void addFromImageOrFileAfterPermission(String mimeType, ActivityResultLauncher<Intent> launcher, int chooserText, int errorMessage) {
private void addFromImageAfterPermission() {
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType(mimeType);
photoPickerIntent.setType("image/*");
Intent contentIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentIntent.setType(mimeType);
contentIntent.setType("image/*");
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(chooserText));
Intent chooserIntent = Intent.createChooser(photoPickerIntent, getString(R.string.addFromImage));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { contentIntent });
try {
launcher.launch(chooserIntent);
photoPickerLauncher.launch(chooserIntent);
} catch (ActivityNotFoundException e) {
setScannerActive(true);
Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_LONG).show();
Toast.makeText(getApplicationContext(), R.string.failedLaunchingPhotoPicker, Toast.LENGTH_LONG).show();
Log.e(TAG, "No activity found to handle intent", e);
}
}
@@ -445,13 +424,9 @@ public class ScanActivity extends CatimaAppCompatActivity {
if (requestCode == CaptureManager.getCameraPermissionReqCode()) {
showCameraPermissionMissingText(!granted);
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE || requestCode == PERMISSION_SCAN_ADD_FROM_PDF) {
} else if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
if (granted) {
if (requestCode == PERMISSION_SCAN_ADD_FROM_IMAGE) {
addFromImageOrFileAfterPermission("image/*", photoPickerLauncher, R.string.addFromImage, R.string.failedLaunchingPhotoPicker);
} else {
addFromImageOrFileAfterPermission("application/pdf", pdfPickerLauncher, R.string.addFromPdfFile, R.string.failedLaunchingFileManager);
}
addFromImageAfterPermission();
} else {
setScannerActive(true);
Toast.makeText(this, R.string.storageReadPermissionRequired, Toast.LENGTH_LONG).show();

View File

@@ -43,11 +43,6 @@ class ShortcutHelper {
* used card shortcut is discarded.
*/
static void updateShortcuts(Context context, LoyaltyCard card) {
if (card.archiveStatus == 1) {
// Don't add archived card to menu
return;
}
LinkedList<ShortcutInfoCompat> list = new LinkedList<>(ShortcutManagerCompat.getDynamicShortcuts(context));
SQLiteDatabase database = new DBHelper(context).getReadableDatabase();
@@ -113,7 +108,18 @@ class ShortcutHelper {
* shortcut exists.
*/
static void removeShortcut(Context context, int cardId) {
ShortcutManagerCompat.removeDynamicShortcuts(context, Collections.singletonList(Integer.toString(cardId)));
List<ShortcutInfoCompat> list = ShortcutManagerCompat.getDynamicShortcuts(context);
String shortcutId = Integer.toString(cardId);
for (int index = 0; index < list.size(); index++) {
if (list.get(index).getId().equals(shortcutId)) {
list.remove(index);
break;
}
}
ShortcutManagerCompat.setDynamicShortcuts(context, list);
}
static @NotNull

View File

@@ -12,10 +12,8 @@ import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ImageDecoder;
import android.graphics.Matrix;
import android.graphics.pdf.PdfRenderer;
import android.net.Uri;
import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.provider.MediaStore;
import android.text.Layout;
import android.text.Spanned;
@@ -41,7 +39,6 @@ import androidx.exifinterface.media.ExifInterface;
import androidx.palette.graphics.Palette;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
@@ -49,8 +46,6 @@ import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.multi.GenericMultipleBarcodeReader;
import com.google.zxing.multi.MultipleBarcodeReader;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
@@ -69,7 +64,6 @@ import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Currency;
import java.util.Date;
import java.util.GregorianCalendar;
@@ -89,13 +83,12 @@ public class Utils {
public static final int SELECT_BARCODE_REQUEST = 2;
public static final int BARCODE_SCAN = 3;
public static final int BARCODE_IMPORT_FROM_IMAGE_FILE = 4;
public static final int BARCODE_IMPORT_FROM_PDF_FILE = 5;
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 6;
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 7;
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 8;
public static final int CARD_IMAGE_FROM_FILE_FRONT = 9;
public static final int CARD_IMAGE_FROM_FILE_BACK = 10;
public static final int CARD_IMAGE_FROM_FILE_ICON = 11;
public static final int CARD_IMAGE_FROM_CAMERA_FRONT = 5;
public static final int CARD_IMAGE_FROM_CAMERA_BACK = 6;
public static final int CARD_IMAGE_FROM_CAMERA_ICON = 7;
public static final int CARD_IMAGE_FROM_FILE_FRONT = 8;
public static final int CARD_IMAGE_FROM_FILE_BACK = 9;
public static final int CARD_IMAGE_FROM_FILE_ICON = 10;
public static final String CARD_IMAGE_FILENAME_REGEX = "^(card_)(\\d+)(_(?:front|back|icon)\\.png)$";
@@ -138,80 +131,6 @@ public class Utils {
return ColorUtils.calculateLuminance(backgroundColor) > LUMINANCE_MIDPOINT;
}
static public List<BarcodeValues> retrieveBarcodesFromImage(Context context, Uri uri) {
Log.i(TAG, "Received image file with possible barcode");
if (uri == null) {
Log.e(TAG, "Uri did not contain any data");
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
Bitmap bitmap;
try {
bitmap = retrieveImageFromUri(context, uri);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
List<BarcodeValues> barcodesFromBitmap = getBarcodesFromBitmap(bitmap);
if (barcodesFromBitmap.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
}
return barcodesFromBitmap;
}
static public List<BarcodeValues> retrieveBarcodesFromPdf(Context context, Uri uri) {
Log.i(TAG, "Received PDF file with possible barcode");
if (uri == null) {
Log.e(TAG, "Uri did not contain any data");
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
ParcelFileDescriptor parcelFileDescriptor;
PdfRenderer renderer;
try {
parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
renderer = new PdfRenderer(parcelFileDescriptor);
} catch (IOException e) {
Log.e(TAG, "Could not read file in uri");
Toast.makeText(context, R.string.errorReadingFile, Toast.LENGTH_LONG).show();
return new ArrayList<>();
}
// Loop over all pages to find barcodes
List<BarcodeValues> barcodesFromPdfPages = new ArrayList<>();
Bitmap renderedPage;
for (int i = 0; i < renderer.getPageCount(); i++) {
PdfRenderer.Page page = renderer.openPage(i);
renderedPage = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
page.render(renderedPage, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
page.close();
List<BarcodeValues> barcodesFromPage = getBarcodesFromBitmap(renderedPage);
for (BarcodeValues barcodeValues : barcodesFromPage) {
barcodeValues.setNote(String.format(context.getString(R.string.pageWithNumber), i+1));
barcodesFromPdfPages.add(barcodeValues);
}
}
renderer.close();
if (barcodesFromPdfPages.isEmpty()) {
Log.i(TAG, "No barcode found in pdf file");
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
}
return barcodesFromPdfPages;
}
/**
* Returns the Barcode format and content based on the result of an activity.
* It shows toasts to notify the end-user as needed itself and will return an empty
@@ -223,20 +142,45 @@ public class Utils {
* @param context
* @return BarcodeValues
*/
static public List<BarcodeValues> parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
static public BarcodeValues parseSetBarcodeActivityResult(int requestCode, int resultCode, Intent intent, Context context) {
String contents;
String format;
if (resultCode != Activity.RESULT_OK) {
return new ArrayList<>();
return new BarcodeValues(null, null);
}
if (requestCode == Utils.BARCODE_IMPORT_FROM_IMAGE_FILE) {
return retrieveBarcodesFromImage(context, intent.getData());
}
Log.i(TAG, "Received image file with possible barcode");
if (requestCode == Utils.BARCODE_IMPORT_FROM_PDF_FILE) {
return retrieveBarcodesFromPdf(context, intent.getData());
Uri data = intent.getData();
if (data == null) {
Log.e(TAG, "Intent did not contain any data");
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new BarcodeValues(null, null);
}
Bitmap bitmap;
try {
bitmap = retrieveImageFromUri(context, data);
} catch (IOException e) {
Log.e(TAG, "Error getting data from image file");
e.printStackTrace();
Toast.makeText(context, R.string.errorReadingImage, Toast.LENGTH_LONG).show();
return new BarcodeValues(null, null);
}
BarcodeValues barcodeFromBitmap = getBarcodeFromBitmap(bitmap);
if (barcodeFromBitmap.isEmpty()) {
Log.i(TAG, "No barcode found in image file");
Toast.makeText(context, R.string.noBarcodeFound, Toast.LENGTH_LONG).show();
}
Log.i(TAG, "Read barcode id: " + barcodeFromBitmap.content());
Log.i(TAG, "Read format: " + barcodeFromBitmap.format());
return barcodeFromBitmap;
}
if (requestCode == Utils.BARCODE_SCAN || requestCode == Utils.SELECT_BARCODE_REQUEST) {
@@ -252,7 +196,7 @@ public class Utils {
Log.i(TAG, "Read barcode id: " + contents);
Log.i(TAG, "Read format: " + format);
return Collections.singletonList(new BarcodeValues(format, contents));
return new BarcodeValues(format, contents);
}
throw new UnsupportedOperationException("Unknown request code for parseSetBarcodeActivityResult");
@@ -272,22 +216,22 @@ public class Utils {
return MediaStore.Images.Media.getBitmap(context.getContentResolver(), data);
}
static public List<BarcodeValues> getBarcodesFromBitmap(Bitmap bitmap) {
static public BarcodeValues getBarcodeFromBitmap(Bitmap bitmap) {
// This function is vulnerable to OOM, so we try again with a smaller bitmap is we get OOM
for (int i = 0; i < 10; i++) {
try {
return Utils.getBarcodesFromBitmapReal(bitmap);
return Utils.getBarcodeFromBitmapReal(bitmap);
} catch (OutOfMemoryError e) {
Log.w(TAG, "Ran OOM in getBarcodesFromBitmap! Trying again with smaller picture! Retry " + i + " of 10.");
Log.w(TAG, "Ran OOM in getBarcodeFromBitmap! Trying again with smaller picture! Retry " + i + " of 10.");
bitmap = Bitmap.createScaledBitmap(bitmap, (int) Math.round(0.75 * bitmap.getWidth()), (int) Math.round(0.75 * bitmap.getHeight()), false);
}
}
// Give up
return new ArrayList<>();
return new BarcodeValues(null, null);
}
static private List<BarcodeValues> getBarcodesFromBitmapReal(Bitmap bitmap) {
static private BarcodeValues getBarcodeFromBitmapReal(Bitmap bitmap) {
// In order to decode it, the Bitmap must first be converted into a pixel array...
int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
@@ -296,63 +240,15 @@ public class Utils {
LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
List<BarcodeValues> barcodeValuesList = new ArrayList<>();
try {
MultiFormatReader multiFormatReader = new MultiFormatReader();
MultipleBarcodeReader multipleBarcodeReader = new GenericMultipleBarcodeReader(multiFormatReader);
Result barcodeResult = new MultiFormatReader().decode(binaryBitmap);
Result[] barcodeResults = multipleBarcodeReader.decodeMultiple(binaryBitmap);
for (Result barcodeResult : barcodeResults) {
Log.i(TAG, "Read barcode id: " + barcodeResult.getText());
Log.i(TAG, "Read format: " + barcodeResult.getBarcodeFormat().name());
barcodeValuesList.add(new BarcodeValues(barcodeResult.getBarcodeFormat().name(), barcodeResult.getText()));
}
return barcodeValuesList;
return new BarcodeValues(barcodeResult.getBarcodeFormat().name(), barcodeResult.getText());
} catch (NotFoundException e) {
return barcodeValuesList;
return new BarcodeValues(null, null);
}
}
static public void makeUserChooseBarcodeFromList(Context context, List<BarcodeValues> barcodeValuesList, BarcodeValuesListDisambiguatorCallback callback) {
// If there is only one choice, consider it chosen
if (barcodeValuesList.size() == 1) {
callback.onUserChoseBarcode(barcodeValuesList.get(0));
return;
}
// Ask user to choose a barcode
// TODO: This should contain an image of the barcode in question to help users understand the choice they're making
CharSequence[] barcodeDescriptions = new CharSequence[barcodeValuesList.size()];
for (int i = 0; i < barcodeValuesList.size(); i++) {
BarcodeValues barcodeValues = barcodeValuesList.get(i);
CatimaBarcode catimaBarcode = CatimaBarcode.fromName(barcodeValues.format());
String barcodeContent = barcodeValues.content();
// Shorten overly long barcodes
if (barcodeContent.length() > 22) {
barcodeContent = barcodeContent.substring(0, 20) + "";
}
if (barcodeValues.note() != null) {
barcodeDescriptions[i] = String.format("%s: %s (%s)", barcodeValues.note(), catimaBarcode.prettyName(), barcodeContent);
} else {
barcodeDescriptions[i] = String.format("%s (%s)", catimaBarcode.prettyName(), barcodeContent);
}
}
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context);
builder.setTitle(context.getString(R.string.multipleBarcodesFoundPleaseChooseOne));
builder.setItems(
barcodeDescriptions,
(dialogInterface, i) -> callback.onUserChoseBarcode(barcodeValuesList.get(i))
);
builder.setOnCancelListener(dialogInterface -> callback.onUserDismissedSelector());
builder.show();
}
static public Boolean isNotYetValid(Date validFromDate) {
// The note in `hasExpired` does not apply here, since the bug was fixed before this feature was added.
return validFromDate.after(getStartOfToday().getTime());
@@ -852,30 +748,23 @@ public class Utils {
.replaceAll("(?<!href=\")\\b(https?://[\\w@#%&+=:?/.-]*[\\w@#%&+=:?/-])", "<a href=\"$1\">$1</a>");
}
/**
* Sets an icon or text with background on the given ImageView and/or TextView, including background colour.
*
* @param context Android context
* @param loyaltyCard Loyalty Card
* @param icon Bitmap of the icon to set, or null
* @param backgroundOrIcon ImageView to draw the icon and background on to
* @param textWhenNoImage TextView to write the loyalty card name into if icon is null
* @return background colour
*/
public static int setIconOrTextWithBackground(Context context, LoyaltyCard loyaltyCard, Bitmap icon, ImageView backgroundOrIcon, TextView textWhenNoImage) {
int headerColor = getHeaderColor(context, loyaltyCard);
backgroundOrIcon.setImageBitmap(icon);
backgroundOrIcon.setBackgroundColor(headerColor);
public static void setIconOrTextWithBackground(Context context, LoyaltyCard loyaltyCard, Bitmap icon, ImageView backgroundOrIcon, TextView textWhenNoImage) {
if (icon != null) {
Log.d("onResume", "setting icon image");
textWhenNoImage.setVisibility(View.GONE);
backgroundOrIcon.setImageBitmap(icon);
backgroundOrIcon.setBackgroundColor(Color.TRANSPARENT);
} else {
textWhenNoImage.setVisibility(View.VISIBLE);
int headerColor = getHeaderColor(context, loyaltyCard);
backgroundOrIcon.setImageBitmap(null);
backgroundOrIcon.setBackgroundColor(headerColor);
textWhenNoImage.setText(loyaltyCard.store);
textWhenNoImage.setTextColor(Utils.needsDarkForeground(headerColor) ? Color.BLACK : Color.WHITE);
}
return headerColor;
}
public static boolean installedFromGooglePlay(Context context) {

View File

@@ -1,11 +1,11 @@
Sylvia van Os
Branden Archer
J. Lavoie
solokot
Allan Nordhøy
solokot
Heimen Stoffels
Oğuz Ersen
FC (Fay) Stegerman
Oğuz Ersen
Katharine Chui
SlavekB
StoyanDimitrov
@@ -24,31 +24,28 @@ Aayush Gupta
HudobniVolk
Nyatsuki
Samantaz Fox
Giovanni Donisi
Jiri Grönroos
arno-github
Cliff Heraldo
Sergio Paredes
Ankit Tiwari
Milan Šalka
mdvhimself
Jiri Grönroos
Balázs Meskó
Giovanni Donisi
Milo Ivir
Skrripy
huuhaa
大王叫我来巡山
Projjal Moitra
Quentin PAGÈS
ikanakova
waffshappen
ngocanhtve
Eryk Michalak
Ziad OUALHADJ
Scrambled777
Robin Liu
mdvhimself
Denis Shilin
Alexander Ivanov
Miha Frangež
Silvério Santos
ikanakova
Virginie
Michael Gangolf
rudy3
@@ -56,3 +53,4 @@ Kim Seohyun
Govind S Nair
Freddo espresso
arshbeerSingh
Alexander Ivanov

View File

@@ -251,7 +251,7 @@
<string name="barcodeLongPressMessage">يمكن فتح صور فقط في تطبيق معرض الصور</string>
<string name="failedToOpenUrl">ثبت متصفح ويب أولاً</string>
<string name="welcome">مرحبا بك في كاتيما</string>
<string name="updateBalanceTitle">كم أنفقت أو استلمت؟</string>
<string name="updateBalanceTitle">كم أنفقت؟</string>
<string name="currentBalanceSentence">الرصيد الحالي: <xliff:g> %s </xliff:g></string>
<plurals name="viewArchivedCardsWithCount">
<item quantity="zero">عرض الأرشيف (<xliff:g>%1$d</xliff:g> بطاقة)</item>
@@ -312,10 +312,4 @@
<string name="field_must_not_be_empty">يجب ألا يكون الحقل فارغا</string>
<string name="app_name">كاتيما</string>
<string name="settings_follow_sensor_orientation">التدوير دائمًا ( تجاهل إعدادات النظام)</string>
<string name="add_manually_warning_title">الفحص موصى به</string>
<string name="continue_">استمر</string>
<string name="spend">انفق</string>
<string name="receive">استلم</string>
<string name="amountParsingFailed">كمية غير صحيحة</string>
<string name="add_manually_warning_message">في بعض المتاجر قيمة الباركود تختلف عن الرقم الموجود على البطاقة. لهذا السبب إدخال الباركود يدوياً لن ينجح دائماً. من المستحسن فحص الباركود بكاميرا بدلا من ذالك. هل انت مُصِر على الاستكمال؟</string>
</resources>

View File

@@ -233,7 +233,7 @@
<string name="barcodeLongPressMessage">В приложението галерия могат да бъдат отваряни само изображения</string>
<string name="failedToRetrieveImageFile">Не е възможно извличане на изображение</string>
<string name="noCameraPermissionDirectToSystemSetting">За да сканирате щрихкодове с Catima е необходим достъп до камерата. За да промените разрешението докоснете тук.</string>
<string name="updateBalanceTitle">Колко е похарчено или получено?</string>
<string name="updateBalanceTitle">Каква е промяната\?</string>
<string name="updateBalanceHint">Въведете стойност</string>
<string name="newBalanceSentence">Нов баланс: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Камерата е недостъпна</string>
@@ -284,10 +284,4 @@
<string name="field_must_not_be_empty">Полето не трябва да е празно</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Винаги да се завърта (пренебрегва системната настройка)</string>
<string name="continue_">Продължаване</string>
<string name="add_manually_warning_title">Препоръчително е да сканирате</string>
<string name="add_manually_warning_message">Стойностите от щрихкода и отбелязаните на картата числа в някои случаи се различават. По тази причина е при ръчно въвеждане картата може да не работи. Силно препоръчително е да сканирате щрихкода с камерата. Желаете ли да продължите въпреки това?</string>
<string name="amountParsingFailed">Неприемлива сума</string>
<string name="spend">Похарчено</string>
<string name="receive">Получено</string>
</resources>

View File

@@ -243,7 +243,7 @@
<string name="unarchive">সংরক্ষণাগারমুক্ত করুন</string>
<string name="archived">কার্ড সংরক্ষণাগারভুক্ত</string>
<string name="welcome">Catima-তে স্বাগতম</string>
<string name="updateBalanceTitle">আপনি কত খরচ করেছেন?</string>
<string name="updateBalanceTitle">আপনি কত খরচ করেছেন\?</string>
<string name="updateBalanceHint">পরিমান লিখুন</string>
<string name="currentBalanceSentence">বর্তমান ব্যালেন্স: <xliff:g>%s</xliff:g></string>
<string name="show_name_below_image_thumbnail">ছবির থাম্বনেইল এর নিচে নামটি দেখান</string>

View File

@@ -243,7 +243,7 @@
<string name="updateBalance">Aktualizovat zůstatek</string>
<string name="currentBalanceSentence">Současný zůstatek: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">Pro skenování čárových kódů bude Catima potřebovat přístup k fotoaparátu. Klepněte zde pro změnu nastavení oprávnění.</string>
<string name="updateBalanceTitle">Kolik jste utratil/a nebo obdržel/a?</string>
<string name="updateBalanceTitle">Kolik jste utratil\?</string>
<string name="updateBalanceHint">Zadejte výši</string>
<string name="newBalanceSentence">Nový zůstatek: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Pro tuto akci je potřeba oprávnění ke čtení úložiště…</string>
@@ -291,10 +291,4 @@
<string name="field_must_not_be_empty">Položka nesmí být prázdná</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Vždy otáčet (ignoruje nastavení systému)</string>
<string name="continue_">Pokračovat</string>
<string name="add_manually_warning_title">Doporučuje se skenování</string>
<string name="add_manually_warning_message">V některých obchodech se hodnota čárového kódu liší od čísla napsaného na kartě. Z tohoto důvodu nemusí ruční zadání čárového kódu vždy fungovat. Důrazně doporučujeme místo toho naskenovat čárový kód pomocí fotoaparátu. Chcete přesto pokračovat?</string>
<string name="spend">Utratit</string>
<string name="receive">Obdržet</string>
<string name="amountParsingFailed">Neplatné množství</string>
</resources>

View File

@@ -231,7 +231,7 @@
<string name="welcome">Willkommen bei Catima</string>
<string name="barcodeLongPressMessage">In der Galerie können nur Bilder geöffnet werden</string>
<string name="failedToRetrieveImageFile">Bilddatei konnte nicht abgerufen werden</string>
<string name="updateBalanceTitle">Wie viel hast du ausgegeben oder erhalten?</string>
<string name="updateBalanceTitle">Wie viel haben Sie ausgegeben\?</string>
<string name="cameraPermissionDeniedTitle">Kein Zugriff auf die Kamera möglich</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>
@@ -284,10 +284,4 @@
<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>
<string name="add_manually_warning_title">Es wird empfohlen, zu scannen</string>
<string name="add_manually_warning_message">In einigen Geschäften weicht der Wert des Barcodes von dem auf der Karte angegebenen Wert ab. Aus diesem Grund funktioniert die manuelle Eingabe des Barcodes in einigen Fällen nicht. Es wird dringend empfohlen, den Barcode mit einer Kamera zu scannen. Möchtest du dennoch fortfahren?</string>
<string name="spend">Zahlen</string>
<string name="receive">Erhalten</string>
<string name="amountParsingFailed">Ungültiger Betrag</string>
</resources>

View File

@@ -222,7 +222,7 @@
<string name="archived">Η κάρτα αρχειοθετήθηκε</string>
<string name="unarchived">Η κάρτα αφαιρέθηκε από το αρχείο</string>
<string name="unarchive">Αφαίρεση από το αρχείο</string>
<string name="updateBalanceTitle">Πόσα ξοδέψατε ή λάβατε;</string>
<string name="updateBalanceTitle">Πόσα ξοδέψατε;</string>
<string name="cameraPermissionDeniedTitle">Αδύνατη η πρόσβαση στην κάμερα</string>
<string name="failedToRetrieveImageFile">Αποτυχία ανάκτησης αρχείου εικόνας</string>
<string name="previousCard">Προηγούμενη</string>
@@ -242,26 +242,6 @@
<string name="welcome">Καλώς ήρθατε στο Catima</string>
<string name="settings_disable_lockscreen_while_viewing_card_summary">Απενεργοποιεί το κλείδωμα οθόνης ενόσω βλέπετε μια κάρτα</string>
<string name="settings_display_barcode_max_brightness_summary">Απαραίτητο για να δουλέψει σε κάποια σκάνερ</string>
<string name="cameraPermissionRequired">Δικαίωμα πρόσβασης στην κάμερα απαραίτητο γι\' αυτή την ενέργεια…</string>
<string name="cameraPermissionRequired">Χρειάζεται άδεια για πρόσβαση στην κάμερα γι\' αυτή την ενέργεια…</string>
<string name="settings_allow_content_provider_read_title">Επιτρέπει σε άλλες εφαρμογές να έχουν πρόσβαση στα δεδομένα μου</string>
<string name="app_copyright_short">Πνευματικά δικαιώματα © Sylvia van Os και συνεργάτες</string>
<string name="height">Ύψος:</string>
<string name="switchToFrontImage">Μετάβαση στην μπροστινή εικόνα</string>
<string name="switchToBackImage">Μετάβαση στην πίσω εικόνα</string>
<string name="switchToBarcode">Μετάβαση σε barcode</string>
<string name="validFromSentence">Ισχύει από: <xliff:g>%s</xliff:g></string>
<string name="permissionReadCardsLabel">Διαβάστε τις κάρτες Catima</string>
<string name="openBackImageInGalleryApp">Ανοίξτε την πίσω εικόνα στην εφαρμογή γκαλερί</string>
<string name="permissionReadCardsDescription">Διάβασε τις Κάρτες σου Catima και όλες τους τις λεπτομέρειες, συμπεριλαμβανομένων των σημειώσεων και των εικόνων</string>
<string name="donate">Προσφέρω</string>
<string name="icon_header_click_text">Πατήστε παρατεταμένα για επεξεργασία του εικονιδίου</string>
<string name="openFrontImageInGalleryApp">Ανοίξτε την μπροστινή εικόνα στην εφαρμογή γκαλερί</string>
<string name="storageReadPermissionRequired">Δικαίωμα ανάγνωσης του χώρου αποθήκευσης απαραίτητο για αυτήν την ενέργεια…</string>
<string name="settings_follow_sensor_orientation">Πάντα σε περιστροφή (αγνοεί τις ρυθμίσεις του συστήματος)</string>
<string name="validFromDate">Ισχύει από</string>
<string name="anyDate">Οποιαδήποτε ημερομηνία</string>
<string name="chooseValidFromDate">Επιλέξτε έγκυρη ημερομηνία από</string>
<string name="setBarcodeHeight">Ρυθμίστε το ύψος του barcode</string>
<string name="show_name_below_image_thumbnail">Εμφάνιση ονόματος κάτω από το εικονίδιο</string>
<string name="app_name">Catima</string>
</resources>

View File

@@ -239,7 +239,7 @@
<string name="starred">Estrellado</string>
<string name="failedToRetrieveImageFile">No se pudo recuperar el archivo de imagen</string>
<string name="barcodeLongPressMessage">Solo se pueden abrir imágenes en la aplicación de galería</string>
<string name="updateBalanceTitle">¿Cuánto ha gastado o recibido?</string>
<string name="updateBalanceTitle">¿Cuánto has gastado\?</string>
<string name="currentBalanceSentence">Saldo actual: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">Para escanear códigos de barras, Catima necesitará acceso a su cámara. Toque aquí para cambiar la configuración de sus permisos.</string>
<string name="updateBalanceHint">Introduzca el importe</string>
@@ -291,10 +291,4 @@
<string name="field_must_not_be_empty">Este campo no debe estar vacío</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Girar siempre (ignora la configuración del sistema)</string>
<string name="continue_">Continuar</string>
<string name="add_manually_warning_title">Se recomienda escanear</string>
<string name="add_manually_warning_message">En algunas tiendas, el valor del código de barras difiere del número escrito en la tarjeta. Por este motivo, es posible que la introducción manual del código de barras no siempre funcione. Se recomienda encarecidamente escanear el código de barras con la cámara. ¿Aún desea continuar?</string>
<string name="spend">Gastar</string>
<string name="receive">Recibió</string>
<string name="amountParsingFailed">Importe incorrecto</string>
</resources>

View File

@@ -228,7 +228,7 @@
<item quantity="one">Näytä arkisto (<xliff:g>%1$d</xliff:g> kortti)</item>
<item quantity="other">Näytä arkisto (<xliff:g>%1$d</xliff:g> korttia)</item>
</plurals>
<string name="updateBalanceTitle">Kuinka paljon kulutit tai tienasit?</string>
<string name="updateBalanceTitle">Kuinka paljon kulutit\?</string>
<string name="updateBalanceHint">Syötä summa</string>
<string name="barcodeLongPressMessage">Vain kuvia on mahdollista avata galleriasovelluksessa</string>
<string name="archive">Arkistoi</string>
@@ -284,10 +284,4 @@
<string name="balanceParsingFailed">Virheellinen saldo</string>
<string name="view_online">Näytä verkossa</string>
<string name="settings_follow_sensor_orientation">Kierrä aina (ohittaa järjestelmän asetukset)</string>
<string name="continue_">Jatka</string>
<string name="add_manually_warning_title">Skannausta suositellaan</string>
<string name="spend">Kuluta</string>
<string name="receive">Vastaanota</string>
<string name="amountParsingFailed">Virheellinen määrä</string>
<string name="add_manually_warning_message">Joidenkin kauppojen kohdalla viivakoodin arvo eroaa kortilla olevasta numerosta. Tämän takia viivakoodin syöttäminen käsin ei aina toimi. On vahvasti suositeltua skannata viivakoodi kameralla. Haluatko silti jatkaa?</string>
</resources>

View File

@@ -243,7 +243,7 @@
<string name="cameraPermissionDeniedTitle">Impossible daccéder à la caméra</string>
<string name="noCameraPermissionDirectToSystemSetting">Pour scanner les codes-barres, Catima doit avoir accès à votre caméra. Tapez ici pour modifier vos paramètres d\'autorisation.</string>
<string name="updateBalance">Mettre à jour le solde</string>
<string name="updateBalanceTitle">Combien avez-vous dépensé ou reçu?</string>
<string name="updateBalanceTitle">Combien avez-vous dépensé \?</string>
<string name="newBalanceSentence">Nouveau solde : <xliff:g>%s</xliff:g></string>
<string name="importCards">Importer des cartes</string>
<string name="storageReadPermissionRequired">Lautorisation de lire le stockage est nécessaire pour cette action…</string>
@@ -291,10 +291,4 @@
<string name="field_must_not_be_empty">Le champ ne peut pas être vide</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Toujours pivoter (ignore les paramètres du système)</string>
<string name="add_manually_warning_title">Scan recommandé</string>
<string name="continue_">Continuer</string>
<string name="add_manually_warning_message">Pour certains magasins, la valeur du code-barres diffère du numéro inscrit sur la carte. Pour cette raison, la saisie manuelle dun code-barres peut ne pas toujours fonctionner. Il est fortement recommandé de scanner le code-barres avec votre appareil photo. Voulez-vous toujours continuer?</string>
<string name="spend">Dépenser</string>
<string name="receive">Reçevoir</string>
<string name="amountParsingFailed">Montant Invalide</string>
</resources>

View File

@@ -255,7 +255,7 @@
<item quantity="one">संग्रह देखें (<xliff:g>%1$d</xliff:g> कार्ड)</item>
<item quantity="other">संग्रह देखें (<xliff:g>%1$d</xliff:g> कार्ड)</item>
</plurals>
<string name="updateBalanceTitle">आपने कितना खर्च या प्राप्त किया?</string>
<string name="updateBalanceTitle">आपने कितना खर्च किया?</string>
<string name="chooseValidFromDate">दिनांक से वैध चुनें</string>
<string name="show_name_below_image_thumbnail">छवि थंबनेल के नीचे नाम दिखाएँ</string>
<string name="show_archived_cards">संग्रहीत कार्ड दिखाएँ</string>
@@ -284,10 +284,4 @@
<string name="setBarcodeHeight">बारकोड ऊंचाई सेट करें</string>
<string name="icon_header_click_text">थंबनेल संपादित करने के लिए देर तक दबाएँ</string>
<string name="enter_card_id">अपने कार्ड पर आईडी नंबर या पाठ दर्ज करें</string>
<string name="continue_">जारी रखें</string>
<string name="add_manually_warning_message">कुछ दुकानों के लिए, बारकोड का मान कार्ड पर लिखे नंबर से भिन्न होता है। इस वजह से, बारकोड को मैन्युअल रूप से दर्ज करना हमेशा काम नहीं कर सकता है। इसके बजाय बारकोड को अपने कैमरे से स्कैन करने की पुरजोर अनुशंसा की जाती है। क्या आप अब भी जारी रखना चाहते हैं?</string>
<string name="add_manually_warning_title">स्कैनिंग की अनुशंसा की जाती है</string>
<string name="spend">खर्च किया</string>
<string name="receive">प्राप्त किया</string>
<string name="amountParsingFailed">अमान्य राशि</string>
</resources>

View File

@@ -252,7 +252,7 @@
<string name="shortcutSelectCard">Odaberi karticu</string>
<string name="previousCard">Prethodna</string>
<string name="nextCard">Sljedeća</string>
<string name="updateBalanceTitle">Koliko si potrošio/la?</string>
<string name="updateBalanceTitle">Koliko si potrošio/la\?</string>
<string name="updateBalanceHint">Upiši iznos</string>
<string name="about_title_fmt">Informaije o <xliff:g id="app_name">%s</xliff:g></string>
<string name="failedToOpenUrl">Najprije instaliraj web preglednik</string>

View File

@@ -226,7 +226,7 @@
<string name="currentBalanceSentence">Jelenlegi egyenleg: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Adja meg az összeget</string>
<string name="importCards">Kártyák importálása</string>
<string name="updateBalanceTitle">Mennyit költött és kapott?</string>
<string name="updateBalanceTitle">Mennyit költött\?</string>
<string name="newBalanceSentence">Új egyenleg: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Nem sikerült hozzáférni a kamerához</string>
<string name="failedToRetrieveImageFile">Nem sikerült lekérni a képfájlt</string>
@@ -284,10 +284,4 @@
<string name="show_archived_cards">Archivált kártyák megjelenítése</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Mindig forgassa (figyelmen kívül hagyja a rendszerbeállításokat)</string>
<string name="amountParsingFailed">Hibás érték</string>
<string name="add_manually_warning_title">Szkennelés ajánlott</string>
<string name="add_manually_warning_message">Egyes boltoknál a kártyán levő számsor különbözik a vonalkódtól. Emiatt a manuális szám beírás nem minden esetben fog működni. Erősen ajánlott inkább a vonalkód szkennelése kamerával. Biztosan folytatja?</string>
<string name="continue_">Tovább</string>
<string name="spend">Költött</string>
<string name="receive">Megkapott</string>
</resources>

View File

@@ -231,7 +231,7 @@
<string name="updateBalance">Perbarui saldo</string>
<string name="updateBalanceHint">Masukkan jumlah</string>
<string name="currentBalanceSentence">Saldo saat ini: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan ?</string>
<string name="updateBalanceTitle">Berapa banyak yang telah kamu habiskan \?</string>
<string name="noCameraPermissionDirectToSystemSetting">Untuk memindai barcode, Catima membutuhkan akses ke kamera mu. Tap disini untuk mengganti pengaturan perizinan mu.</string>
<string name="cameraPermissionRequired">Berikan izin untuk mengakses kamera anda…</string>
<string name="storageReadPermissionRequired">Berikan izin untuk membaca penyimpanan anda…</string>

View File

@@ -241,7 +241,7 @@
<string name="cameraPermissionDeniedTitle">È impossibile accedere alla fotocamera</string>
<string name="noCameraPermissionDirectToSystemSetting">Per poter scansionare i codici a barre, Catima ha bisogno di accedere alla tua fotocamera. Premi qui per poter cambiare le impostazioni dei permessi.</string>
<string name="updateBalance">Aggiorna bilancio</string>
<string name="updateBalanceTitle">Quanto hai speso o ricevuto?</string>
<string name="updateBalanceTitle">Quanto hai speso\?</string>
<string name="updateBalanceHint">Inserisci l\'importo</string>
<string name="currentBalanceSentence">Bilancio attuale: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Nuovo bilancio: <xliff:g>%s</xliff:g></string>
@@ -291,10 +291,4 @@
<string name="field_must_not_be_empty">Il campo non deve essere vuoto</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Ruota sempre (ignora le impostazioni di sistema)</string>
<string name="add_manually_warning_title">Consigliata scansione</string>
<string name="continue_">Successivo</string>
<string name="add_manually_warning_message">In alcuni negozi, il valore del codice a barre differisce dal numero scritto sulla carta. Per questo motivo, l\'inserimento manuale del codice a barre potrebbe non funzionare sempre. Si consiglia di scansionare il codice a barre con la fotocamera. Vuoi continuare lo stesso?</string>
<string name="amountParsingFailed">Importo non valido</string>
<string name="spend">Spendi</string>
<string name="receive">Ricevi</string>
</resources>

View File

@@ -206,5 +206,4 @@
<string name="settings_landscape_orientation"></string>
<string name="settings_portrait_orientation"></string>
<string name="noGiftCardsGroup">いくつかのカードを作って、それらをこのグループにアサインします。</string>
<string name="noCameraPermissionDirectToSystemSetting">バーコードをスキャンするためには、Catimaはカメラへのアクセスを必要とします。ここをタップして権限設定の変更をお願いします。</string>
</resources>

View File

@@ -214,7 +214,7 @@
<string name="backImageDescription">후면 사진</string>
<string name="currentBalanceSentence">현재 잔액: <xliff:g>%s</xliff:g></string>
<string name="importCards">카드 가져오기</string>
<string name="updateBalanceTitle">지출하거나 수령한 금액은 얼마입니까?</string>
<string name="updateBalanceTitle">얼마를 썼습니까\?</string>
<string name="newBalanceSentence">새 잔액: <xliff:g>%s</xliff:g></string>
<string name="settings_card_orientation">바코드 방향</string>
<string name="settings_follow_system_orientation">기기 설정 따르기</string>
@@ -276,6 +276,4 @@
<string name="enter_card_id">카드에 있는 ID 숫자 또는 텍스트 입력</string>
<string name="addWithoutBarcode">바코드가 없는 카드 추가</string>
<string name="app_name">Catima</string>
<string name="add_manually_warning_title">스캔을 권장합니다</string>
<string name="settings_follow_sensor_orientation">항상 회전 (시스템 설정 무시)</string>
</resources>

View File

@@ -227,7 +227,7 @@
<string name="unarchive">Išarchyvuoti</string>
<string name="archived">Kortelė archyvuota</string>
<string name="unarchived">Kortelė išarchyvuota</string>
<string name="updateBalanceTitle">Kiek išleidote?</string>
<string name="updateBalanceTitle">Kiek išleidote\?</string>
<string name="updateBalanceHint">Įveskite sumą</string>
<string name="currentBalanceSentence">Dabartinis likutis: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Naujas balansas: <xliff:g>%s</xliff:g></string>
@@ -261,4 +261,4 @@
<string name="switchToFrontImage">Perjungti į priekinį vaizdą</string>
<string name="openFrontImageInGalleryApp">Atidarykite priekinį vaizdą galerijos programėlėje</string>
<string name="donate">Aukoti</string>
</resources>
</resources>

View File

@@ -238,10 +238,10 @@
<string name="noCameraPermissionDirectToSystemSetting">Lai skanētu svītrkods, Catima ir nepieciešama pieeja jūsu kamerai. Nospied šeit lai nomainītu atļaujas iestatījumus.</string>
<string name="cameraPermissionDeniedTitle">Nevar pievienieties kamerai</string>
<string name="updateBalance">Atjaunināta bilance</string>
<string name="updateBalanceTitle">Cik daudz Tu iztērēji?</string>
<string name="updateBalanceTitle">Cik daudz Tu iztērēji\?</string>
<string name="updateBalanceHint">Ievadi summu</string>
<string name="currentBalanceSentence">Šābrīža bilance: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Jauna bilance: <xliff:g>%s</xliff:g></string>
<string name="storageReadPermissionRequired">Atļauja lasīt noliktavu ir nepieciešama šai darbībai…</string>
<string name="importCards">Importēt kartes</string>
</resources>
</resources>

View File

@@ -236,7 +236,7 @@
<string name="noCameraPermissionDirectToSystemSetting">Catima trenger kameratilgang for å skanne strekkoder. Trykk her for å endre tilgangsinnstillingene.</string>
<string name="importCards">Importer kort</string>
<string name="currentBalanceSentence">Nåværende saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceTitle">Hvor mye brukte du?</string>
<string name="updateBalanceTitle">Hvor mye brukte du\?</string>
<string name="updateBalanceHint">Skriv inn beløp</string>
<string name="newBalanceSentence">Ny saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Oppdater saldo</string>
@@ -283,11 +283,4 @@
<string name="manually_enter_barcode_instructions">Skriv inn ID-nummer eller tekst fra kortet og trykk på strekkoden som ser ut til å ligne.</string>
<string name="enter_card_id">Skriv inn ID-nummeret eller teksten på kortet</string>
<string name="field_must_not_be_empty">Feltet må fylles ut</string>
<string name="add_manually_warning_title">Skanning anbefales</string>
<string name="continue_">Fortsett</string>
<string name="amountParsingFailed">Ugyldig beløp</string>
<string name="spend">Utgifter</string>
<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>
</resources>

View File

@@ -233,7 +233,7 @@
<string name="failedToRetrieveImageFile">De afbeelding kan niet worden opgehaald</string>
<string name="barcodeLongPressMessage">Alleen afbeeldingen kunnen worden geopend in de galerij-app</string>
<string name="cameraPermissionDeniedTitle">Geen cameratoegang</string>
<string name="updateBalanceTitle">Hoeveel heb je uitgegeven of ontvangen?</string>
<string name="updateBalanceTitle">Hoeveel heb je uitgegeven\?</string>
<string name="noCameraPermissionDirectToSystemSetting">Catima heeft toegang tot je camera nodig om barcodes te kunnen scannen. Druk hier om toegang te verlenen.</string>
<string name="currentBalanceSentence">Huidig saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Saldo bijwerken</string>
@@ -284,10 +284,4 @@
<string name="field_must_not_be_empty">Dit veld is vereist</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Altijd draaien (negeert systeeminstellingen)</string>
<string name="add_manually_warning_title">Scannen wordt aangeraden</string>
<string name="add_manually_warning_message">Bij sommige winkels wijkt de barcodewaarde af van het nummer op de kaart. Hierdoor werkt het handmatig invoeren van een barcode niet altijd. Het wordt sterk aangeraden om in plaats daarvan de barcode met je camera te scannen. Wilt u nog steeds doorgaan?</string>
<string name="continue_">Ga door</string>
<string name="spend">Geef uit</string>
<string name="receive">Ontvang</string>
<string name="amountParsingFailed">Ongeldig bedrag</string>
</resources>

View File

@@ -248,7 +248,7 @@
</plurals>
<string name="currentBalanceSentence">Bieżące saldo: <xliff:g>%s</xliff:g></string>
<string name="noCameraPermissionDirectToSystemSetting">By zeskanować kody kreskowe, Catima musi mieć dostęp do twojej kamery. Dotknij tutaj by zmienić swoje ustawienia dostępu.</string>
<string name="updateBalanceTitle">Ile wydałeś?</string>
<string name="updateBalanceTitle">Ile wydałeś\?</string>
<string name="updateBalanceHint">Wpisz sumę</string>
<string name="updateBalance">Zaktualizuj balans</string>
<string name="cameraPermissionDeniedTitle">Odmówiono dostępu do kamery</string>

View File

@@ -245,7 +245,7 @@
<string name="currentBalanceSentence">Saldo atual: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">Novo saldo: <xliff:g>%s</xliff:g></string>
<string name="updateBalance">Atualizar saldo</string>
<string name="updateBalanceTitle">Quanto gastou ou recebeu?</string>
<string name="updateBalanceTitle">Quanto gastou\?</string>
<string name="updateBalanceHint">Introduza o valor</string>
<string name="storageReadPermissionRequired">É necessária a permissão para ler o armazenamento para esta ação…</string>
<string name="cameraPermissionRequired">É necessária a permissão para aceder à câmara para esta ação…</string>
@@ -290,11 +290,4 @@
<string name="field_must_not_be_empty">O campo não pode estar vazio</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álida</string>
<string name="settings_follow_sensor_orientation">Rodar sempre (ignora as definições do sistema)</string>
</resources>

View File

@@ -257,7 +257,7 @@
<string name="show_archived_cards">Afișați cardurile arhivate</string>
<string name="settings_card_orientation">Orientarea codului de bare</string>
<string name="app_libraries">Biblioteci terță deschise: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="updateBalanceTitle">Cât de mult ați cheltuit sau primit?</string>
<string name="updateBalanceTitle">Cât de mult ați folosit?</string>
<string name="settings_blue_theme">Albastru</string>
<string name="app_resources">Resurse terță deschise: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_name">Catima</string>
@@ -291,10 +291,4 @@
<string name="rate_this_app">Acordați o recenzie acestei aplicații</string>
<string name="credits">Contribuabili</string>
<string name="settings_follow_sensor_orientation">Rotește întotdeauna (ignora setările de sistem)</string>
<string name="continue_">Continua</string>
<string name="add_manually_warning_title">Se recomandă scanarea</string>
<string name="add_manually_warning_message">Pentru unele magazine, valoarea codului de bare diferă de numărul scris pe card. Din acest motiv, este posibil ca introducerea manuală a unui cod de bare să nu funcționeze întotdeauna. În schimb, este recomandat să scanați codul de bare cu camera dvs. Mai vrei să continui?</string>
<string name="spend">Cheltuie</string>
<string name="receive">Primește</string>
<string name="amountParsingFailed">Sumă nevalidă</string>
</resources>

View File

@@ -18,7 +18,7 @@
<string name="sendLabel">Отправить…</string>
<string name="editCardTitle">Изменить карту</string>
<string name="addCardTitle">Добавить карту</string>
<string name="scanCardBarcode">Сканировать штрих-код</string>
<string name="scanCardBarcode">Отсканируйте штрих-код</string>
<string name="cardShortcut">Ярлык карты</string>
<string name="noCardsMessage">Сначала добавьте карту</string>
<string name="noCardExistsError">Карта не найдена</string>
@@ -252,7 +252,7 @@
<string name="currentBalanceSentence">Текущий баланс: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Камера недоступна</string>
<string name="updateBalanceHint">Введите сумму</string>
<string name="updateBalanceTitle">Сколько потрачено или получено?</string>
<string name="updateBalanceTitle">Какое изменение\?</string>
<string name="importCards">Импорт карт</string>
<string name="storageReadPermissionRequired">Для этого действия необходимо разрешение на чтение хранилища…</string>
<string name="cameraPermissionRequired">Для этого действия необходимо разрешение на доступ к камере…</string>
@@ -298,10 +298,4 @@
<string name="field_must_not_be_empty">Поле не может быть пустым</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Всегда поворачивать (игнорировать системные настройки)</string>
<string name="add_manually_warning_title">Рекомендуется сканирование</string>
<string name="continue_">Продолжить</string>
<string name="add_manually_warning_message">В некоторых магазинах значение штрих-кода отличается от написанного на карте номера, из-за чего введение штрих-кода вручную не всегда работает. Вместо этого настоятельно рекомендуется отсканировать штрих-код камерой. Продолжить?</string>
<string name="spend">Потрачено</string>
<string name="receive">Получено</string>
<string name="amountParsingFailed">Недопустимая сумма</string>
</resources>

View File

@@ -204,7 +204,7 @@
<string name="unarchived">Karta vrátená z archívu</string>
<string name="previousCard">Predošlá</string>
<string name="nextCard">Nasledujúca</string>
<string name="updateBalanceTitle">Koľko ste minuli alebo prjali?</string>
<string name="updateBalanceTitle">Koľko ste minuli\?</string>
<string name="updateBalanceHint">Zadajte čiastku</string>
<string name="failedToOpenUrl">Najprv nainštalujte webový prehliadač</string>
<string name="welcome">Vitajte v Catima</string>
@@ -291,10 +291,4 @@
<string name="show_archived_cards">Zobraziť archivované karty</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Vždy otáčať (ignoruje nastavenie systému)</string>
<string name="continue_">Pokračovať</string>
<string name="spend">Utratené</string>
<string name="receive">Prijaté</string>
<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>
</resources>

View File

@@ -185,7 +185,7 @@
<string name="failedLaunchingPhotoPicker">Ni mogoče najti podprte aplikacije za gledanje slik</string>
<string name="previousCard">Prejšnje</string>
<string name="nextCard">Naslednje</string>
<string name="updateBalanceTitle">Koliko ste porabili?</string>
<string name="updateBalanceTitle">Koliko ste porabili\?</string>
<string name="updateBalanceHint">Vpišite vrednost</string>
<string name="group_name_already_in_use">Ime skupine je že uporabljeno</string>
<string name="group_name_is_empty">Ime skupine ne more biti prazno polje</string>

View File

@@ -242,7 +242,7 @@
<string name="updateBalance">Uppdatera balans</string>
<string name="failedToRetrieveImageFile">Misslyckades att hämta bildfil</string>
<string name="barcodeLongPressMessage">Endast bilder kan öppnas i galleri app</string>
<string name="updateBalanceTitle">Hur mycket spenderade du?</string>
<string name="updateBalanceTitle">Hur mycket spenderade du\?</string>
<string name="updateBalanceHint">Ange summa</string>
<string name="newBalanceSentence">Ny balans: <xliff:g>%s</xliff:g></string>
<string name="openFrontImageInGalleryApp">Öppna bilden på framsidan i galleri-appen</string>

View File

@@ -235,7 +235,7 @@
<string name="noCameraPermissionDirectToSystemSetting">Barkodları taramak için Catima\'nın kameranıza erişmesi gerekecektir. İzin ayarlarınızı değiştirmek için buraya dokunun.</string>
<string name="currentBalanceSentence">Geçerli bakiye: <xliff:g>%s</xliff:g></string>
<string name="updateBalanceHint">Miktarı girin</string>
<string name="updateBalanceTitle">Ne kadar harcadınız veya aldınız?</string>
<string name="updateBalanceTitle">Ne kadar harcadınız\?</string>
<string name="newBalanceSentence">Yeni bakiye: <xliff:g>%s</xliff:g></string>
<string name="cameraPermissionDeniedTitle">Kameraya erişilemedi</string>
<string name="updateBalance">Bakiyeyi güncelle</string>
@@ -284,10 +284,4 @@
<string name="field_must_not_be_empty">Alan boş olamaz</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Her zaman döndür (sistem ayarlarını yok sayar)</string>
<string name="continue_">Devam et</string>
<string name="add_manually_warning_title">Tarama yapılması tavsiye edilir</string>
<string name="add_manually_warning_message">Bazı mağazalarda barkod değeri kartta yazan sayıdan farklıdır. Bu nedenle, bir barkodu elle girmek her zaman işe yaramayabilir. Bunun yerine barkodu kameranızla taramanız şiddetle tavsiye edilir. Yine de devam etmek istiyor musunuz?</string>
<string name="spend">Harca</string>
<string name="receive">Al</string>
<string name="amountParsingFailed">Geçersiz miktar</string>
</resources>

View File

@@ -247,7 +247,7 @@
<string name="failedToRetrieveImageFile">Збій доступу до файлу зображення</string>
<string name="barcodeLongPressMessage">Галерея може відкривати лише зображення</string>
<string name="importCards">Імпорт карток</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>
@@ -298,7 +298,4 @@
<string name="field_must_not_be_empty">Поле вводу не повинно бути порожнім</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">Завжди обертати (ігнорувати системні налаштування)</string>
<string name="add_manually_warning_message">У деяких магазинах значення штрихкоду відрізняється від номера, записаного на картці. Через це введення штрихкоду вручну може не завжди спрацювати. Наполегливо рекомендуємо відсканувати штрихкод за допомогою камери. Ви все ще хочете продовжити?</string>
<string name="continue_">Продовжити</string>
<string name="add_manually_warning_title">Рекомендується відсканувати</string>
</resources>

View File

@@ -86,7 +86,7 @@
<string name="yes"></string>
<string name="barcodeType">Loại mã vạch</string>
<string name="enter_card_id">Nhập số ID hoặc văn bản lên thẻ của bạn</string>
<string name="unarchived">Đã hủy lưu trữ thẻ</string>
<string name="unarchived">Thẻ đã được mở khóa</string>
<string name="noBarcode">Không có mã vạch</string>
<string name="chooseValidFromDate">Chọn ngày hợp lệ</string>
<string name="action_display_options">Tùy chỉnh hiển thị</string>
@@ -127,7 +127,7 @@
<string name="settings_brown_theme">Màu nâu</string>
<string name="app_copyright_short">Bản quyền © Sylvia van Os và các cộng sự</string>
<string name="importExportHelp">Sao lưu cho phép bạn chuyển dữ liệu của mình đến thiết bị khác.</string>
<string name="settings_oled_dark">Nền đen tuyền cho chủ đề tối</string>
<string name="settings_oled_dark">Màu nền đen cho chủ đề tối</string>
<string name="starred">Ưa thích</string>
<string name="field_must_not_be_empty">Không được để ô trống</string>
<string name="importOptionFilesystemExplanation">Chọn 1 tập tin cụ thể từ hệ thống (filesystem).</string>
@@ -228,7 +228,7 @@
<string name="importSuccessful">Nhập dữ liệu xong</string>
<string name="settings_card_orientation">Hướng đặt mã vạch</string>
<string name="app_libraries">Thư viện mở từ bên thứ 3: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="updateBalanceTitle">Bạn đã chi tiêu hoặc nhận được bao nhiêu?</string>
<string name="updateBalanceTitle">Bạn đã chi bao nhiêu\?</string>
<string name="editCardTitle">Sửa Thẻ</string>
<string name="archive">Lưu trữ</string>
<string name="settings_blue_theme">Màu xanh dương</string>
@@ -277,10 +277,4 @@
<string name="app_contributors">Được thực hiện bởi: <xliff:g id="app_contributors">%s</xliff:g></string>
<string name="app_license">Phần mềm libre được bảo vệ bản quyền theo giấy phép GPLv3+.</string>
<string name="settings_follow_sensor_orientation">Luôn xoay (bỏ qua thiết đặt hệ thống)</string>
<string name="continue_">Tiếp tục</string>
<string name="add_manually_warning_title">Nên quét</string>
<string name="spend">Tiêu</string>
<string name="receive">Nhận được</string>
<string name="amountParsingFailed">Số tiền không hợp lệ</string>
<string name="add_manually_warning_message">Đối với một số cửa hàng, giá trị mã vạch khác với số ghi trên thẻ. Vì lý do này, việc nhập mã vạch theo cách thủ công không phải lúc nào cũng hiệu quả. Thay vào đó, bạn nên quét mã vạch bằng máy ảnh của mình. Bạn vẫn muốn tiếp tục chứ?</string>
</resources>

View File

@@ -227,7 +227,7 @@
<item quantity="other">查看存档(<xliff:g>%1$d</xliff:g> 张卡片)</item>
</plurals>
<string name="updateBalance">更新余额</string>
<string name="updateBalanceTitle">支出或者收到了多少钱?</string>
<string name="updateBalanceTitle">了多少钱?</string>
<string name="currentBalanceSentence">当前余额:<xliff:g>%s</xliff:g></string>
<string name="failedToRetrieveImageFile">无法检索图像文件</string>
<string name="newBalanceSentence">新余额:<xliff:g>%s</xliff:g></string>
@@ -277,10 +277,4 @@
<string name="field_must_not_be_empty">字段不能为空</string>
<string name="app_name">Catima</string>
<string name="settings_follow_sensor_orientation">始终旋转(忽略系统设置)</string>
<string name="add_manually_warning_title">建议扫描</string>
<string name="continue_">继续</string>
<string name="add_manually_warning_message">某些商店卡片的二维码值和刻在卡上的数字并不一样。由于这个原因,手动输入二维码可能并不总是有用。这种情况下,强烈建议你用相机扫描二维码。你仍要继续吗?</string>
<string name="receive">接收</string>
<string name="amountParsingFailed">无效金额</string>
<string name="spend">支出</string>
</resources>

View File

@@ -296,7 +296,7 @@
</plurals>
<string name="welcome">Welcome to Catima</string>
<string name="importCards">Import cards</string>
<string name="updateBalanceTitle">How much did you spend or receive?</string>
<string name="updateBalanceTitle">How much did you spend?</string>
<string name="updateBalanceHint">Enter amount</string>
<string name="currentBalanceSentence">Current balance: <xliff:g>%s</xliff:g></string>
<string name="newBalanceSentence">New balance: <xliff:g>%s</xliff:g></string>
@@ -338,12 +338,4 @@
<string name="add_manually_warning_title">Scanning is recommended</string>
<string name="add_manually_warning_message">For some stores, the barcode value differs from the number written on the card. Because of this, entering a barcode manually may not always work. It is strongly recommended to scan the barcode with your camera instead. Do you still want to continue?</string>
<string name="continue_">Continue</string>
<string name="spend">Spend</string>
<string name="receive">Receive</string>
<string name="amountParsingFailed">Invalid amount</string>
<string name="addFromPdfFile">Select a PDF file</string>
<string name="errorReadingFile">Could not read the file</string>
<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>
</resources>

View File

@@ -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.3.1" apply false
id("com.android.application") version "8.2.2" apply false
id("com.github.spotbugs") version "5.1.4" apply false
}

View File

@@ -5,9 +5,8 @@
2. Merge Weblate pull request
3. Update `CHANGELOG.md` with the new version name and the release date
4. Update `app/build.gradle.kts` with the new `versionCode` and `versionName`
5. Create a commit for the new release: `git add CHANGELOG.md app/build.gradle.kts && git commit -m "Release Catima <VERSION>"`
6. Build a new .apk: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
7. Upload the APK to Google Play Open Testing
8. Push the version update commit: `git push`
9. Create a new release on GitHub and attach the `app-release.apk` and `SHA256SUMS` files
10. After the release has been approved on Google Play Production, update the metadata there: `bundle exec fastlane supply --version_code <VERSION_CODE>`
5. Build a new .apk: `KEYSTORE=/path/to/keystore KEYSTORE_ALIAS=catima ./build.sh`
6. Upload the APK to Google Play Open Testing
7. Push the version update: `git add CHANGELOG.md app/build.gradle.kts && git commit -m "Release Catima <VERSION>" && git push`
8. Create a new release on GitHub and attach the `app-release.apk` and `SHA256SUMS` files
9. After the release has been approved on Google Play Production, update the metadata there: `bundle exec fastlane supply --version_code <VERSION_CODE>`

View File

@@ -1,4 +1 @@
- Cílový systém Android 14
- Otevření ikony karty v galerii na dotykovém displeji
- Vylepšení designu karty Fotografie ve zobrazení úprav
- Aktualizována obrazovka výdajů s podporou příjmů

View File

@@ -1,7 +1,7 @@
- Arabisch wird unterstützt
- Unterstützung der arabischen Sprache
- 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)
- Behebung von Fehlern bei der Guthabenanalyse (Karten in arabischer oder anderen nicht-westlichen Zahlen wurden nicht gespeichert)
- Benutzerdefiniertes Thema wird nicht korrekt auf den Hauptbildschirm angewendet
- Verbesserte Anzeige der ausgewählten Karten
- Absturz beim Verlassen der Kartenansicht in RTL-Layouts für Karten mit Ablaufdatum oder Guthaben behoben
- Rückwärtspfeil in der Kartenansicht zeigt in RTL-Layouts nicht mehr in die falsche Richtung

View File

@@ -1,4 +1 @@
- Angepasst für Android 14
- „Touch“ auf Karten-Symbol öffnet dieses in Galerie
- Design der Registerkarte „Fotos“ in der Bearbeitungsansicht verbessert
- Bildschirm für „Guthaben“ aktualisiert, um auch „Einnahmen“ anzeigen zu können
- auf Android 14 richten

View File

@@ -1,4 +1,4 @@
- Steuerung der Bildschirmhelligkeit bei Anzeige des Barcode eingefügt (Pull #259 (https://github.com/brarcher/loyalty-card-locker/pull/259))
- Griechisch eingefügt (Pull #252 (https://github.com/brarcher/loyalty-card-locker/pull/252))
- Slowenisch eingefügt (Pull #260 (https://github.com/brarcher/loyalty-card-locker/pull/260))
- Einstellung zur Steuerung der Bildschirmhelligkeit bei der Bacrode-Anzeige (Pull #259 (https://github.com/brarcher/loyalty-card-locker/pull/259))
- Griechische Übersetzungen hinzugefügt (Pull #252 (https://github.com/brarcher/loyalty-card-locker/pull/252))
- Slowenischen Übersetzungen hinzugefügt (Pull #260 (https://github.com/brarcher/loyalty-card-locker/pull/260))
- Übersetzungen aktualisiert (pull #260 (https://github.com/brarcher/loyalty-card-locker/pull/260), pull #254 (https://github.com/brarcher/loyalty-card-locker/pull/254))

View File

@@ -1,4 +1,3 @@
- Target Android 14
- Open card icon in gallery on touch
- Improve design of Photos tab in edit view
- Update spending screen to also support receiving
- Improve design of Photos tab in edit view

View File

@@ -1,5 +1,5 @@
- 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))
- 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))

View File

@@ -1,5 +1,5 @@
- कार्ड आईडी संपादित करते समय, शुरू करने के लिए मौजूदा आईडी को पहले से भरें।
- मेमोरी उपयोग को कम करने और मेमोरी त्रुटियों को दूर करने के लिए जेनरेट किए गए बारकोड की चौड़ाई सीमित करें।
- कार्ड संपादित करते समय, यदि कार्ड आईडी पहले से मौजूद है तो "कार्ड दर्ज करें" बटन को बदलकर "कार्ड संपादित करें" कहें।
- रंग योजना को नरम और ऐप आइकन के साथ संगत करने के लिए बदलें, और कार्ड को साफ-सुथरा देखने के लिए लेआउट बदलें।
- एक परिचय विज़ार्ड जोड़ें जो ऐप के पहले लॉन्च पर लॉन्च होता है।
- कार्ड आईडी संपादित करते समय, शुरू करने के लिए मौजूदा आईडी को पहले से भरें। (खींचें #94 (https://github.com/brarcher/loyalty-card-locker/pull/94))
- मेमोरी उपयोग को कम करने और मेमोरी त्रुटियों को दूर करने के लिए जेनरेट किए गए बारकोड की चौड़ाई सीमित करें। (#103 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/103))
- कार्ड संपादित करते समय, यदि कार्ड आईडी पहले से मौजूद है तो "कार्ड दर्ज करें" बटन को बदलकर "कार्ड संपादित करें" कहें। (#104 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/104))
- रंग योजना को नरम और ऐप आइकन के साथ संगत करने के लिए बदलें, और कार्ड को साफ-सुथरा देखने के लिए लेआउट बदलें। (#107 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/107))
- एक परिचय विज़ार्ड जोड़ें जो ऐप के पहले लॉन्च पर लॉन्च होता है। (#108 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/108))

View File

@@ -1,2 +1,2 @@
- v0.11 में बदलाव से बारकोड ड्राइंग की मेमोरी का उपयोग कम हो गया, लेकिन बारकोड आयाम प्रभावित हुआ। मेमोरी उपयोग को कम करते हुए बारकोड आयामों को बनाए रखने के लिए इसे अब बदल दिया गया है
- अद्यतन जर्मन और फ़्रेंच अनुवाद
- v0.11 में बदलाव से बारकोड ड्राइंग की मेमोरी का उपयोग कम हो गया, लेकिन बारकोड आयाम प्रभावित हुआ। मेमोरी उपयोग को कम करते हुए बारकोड आयामों को बनाए रखने के लिए इसे अब बदल दिया गया है। (खींचें #126 (https://github.com/brarcher/loyalty-card-locker/pull/126))
- जर्मन और फ़्रेंच अनुवाद अपडेट करें। (#122 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/122), #124 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/124) , #125 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/125))

View File

@@ -1,4 +1 @@
- लक्षित Android 14
- टच करने पर गैलरी में कार्ड आइकन खोलें
- संपादन दृश्य में फ़ोटो टैब का बेहतर डिज़ाइन
- प्राप्त करने में सहायता के लिए व्यय स्क्रीन को अपडेट किया गया
- लक्ष्य एंड्रॉइड 14

View File

@@ -1,3 +1,3 @@
- कार्ड प्रदर्शित करते समय स्क्रीन रोटेशन लॉक मेनू विकल्प जोड़ें। यदि लॉक किया गया है, तो स्क्रीन अपने "प्राकृतिक" ओरिएंटेशन में परिवर्तित हो जाएगी और आगे स्क्रीन रोटेशन अवरुद्ध हो जाएगा।
- यदि कोई कार्ड मुख्य स्क्रीन से चुना गया है लेकिन लोड नहीं किया जा सकता है, तो एप्लिकेशन शान से विफल हो जाता है और एक संदेश पोस्ट करता है।
- उस मामले को ठीक किया गया जहां इंट्रो विज़ार्ड के लिए लेआउट आईडी नहीं मिल सके।
- कार्ड प्रदर्शित करते समय स्क्रीन रोटेशन लॉक मेनू विकल्प जोड़ें। यदि लॉक किया गया है, तो स्क्रीन अपने "प्राकृतिक" ओरिएंटेशन में परिवर्तित हो जाएगी और आगे स्क्रीन रोटेशन अवरुद्ध हो जाएगा। (खींचें #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))
- यदि कोई कार्ड मुख्य स्क्रीन से चुना गया है लेकिन लोड नहीं किया जा सकता है, तो एप्लिकेशन शान से विफल हो जाता है और एक संदेश पोस्ट करता है। (खींचें #132 (https://github.com/brarcher/loyalty-card-locker/pull/132))
- उस मामले को ठीक करें जहां इंट्रो विज़ार्ड के लिए लेआउट आईडी नहीं मिल सके। (खींचें #128 (https://github.com/brarcher/loyalty-card-locker/pull/128))

View File

@@ -1,5 +1,5 @@
- कार्ड जोड़ते या संपादित करते समय होम स्क्रीन पर शॉर्टकट जोड़ने के लिए समर्थन जोड़ा गया।
- विजेट हटा दिया गया, क्योंकि यह शॉर्टकट का खराब विकल्प था।
- एंड्रॉइड 7+ पर बैकअप निर्यात करना ठीक किया गया।
- बैकअप डेटा निर्यात करते समय अधिक सटीक माइम प्रकार की रिपोर्ट करें।
- उस बग को ठीक किया गया जहां कार्ड को संपादित नहीं किया जा सकता था।
- कार्ड जोड़ते या संपादित करते समय होम स्क्रीन पर शॉर्टकट जोड़ने के लिए समर्थन जोड़ें। (#155 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/155))
- विजेट हटा दें, क्योंकि यह शॉर्टकट का खराब विकल्प था। (#155 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/155))
- एंड्रॉइड 7+ पर बैकअप निर्यात करना ठीक करें। (#153 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/153))
- बैकअप डेटा निर्यात करते समय अधिक सटीक माइम प्रकार की रिपोर्ट करें। (खींचें #156 (https://github.com/brarcher/loyalty-card-locker/pull/156))
- उस बग को ठीक करें जहां कार्ड को संपादित नहीं किया जा सका। (#155 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/155))

View File

@@ -1,4 +1,4 @@
- बारकोड प्रदर्शित करते समय स्क्रीन की चमक को नियंत्रित करने के लिए एक सेटिंग जोड़ी गई
- ग्रीक अनुवाद जोड़े गए
- स्लोवेनियाई अनुवाद जोड़े गए
- अद्यतन अनुवाद
- बारकोड प्रदर्शित करते समय स्क्रीन की चमक को नियंत्रित करने के लिए एक सेटिंग जोड़ें (#259 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/259))
- ग्रीक अनुवाद जोड़ें (#252 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/252))
- स्लोवेनियाई अनुवाद जोड़ें (#260 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/260))
- अनुवाद अपडेट करें (#260 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/260), #254 खींचें (https://github.com/brarcher/loyalty-card-locker/pull /254))

View File

@@ -1,11 +1,12 @@
- कार्ड खोजने की क्षमता जोड़ी गई
- लॉयल्टी कार्ड साझा करने और प्राप्त करने की क्षमता जोड़ी गई
- डार्क मोड सपोर्ट
- लॉयल्टी कार्ड अब बारकोड रहित हो सकते हैं (जैसे कि बारकोड नहीं)
- नोट्स कई पंक्तियों में फैले हो सकते हैं - नोट्स के आकार में सुधार
- बेहतर अधिसूचना और ऐप आइकन दृश्यता
- लक्ष्य SDK को Android 10 पर अपडेट किया गया
- निम्नलिखित अनुवादों में सुधार किया गया:
- कार्ड खोजने की क्षमता जोड़ें (#320 (https://github.com/brarcher/loyalty-card-locker/pull/320))
- लॉयल्टी कार्ड साझा करने और प्राप्त करने की क्षमता जोड़ें (#321 (https://github.com/brarcher/loyalty-card-locker/pull/321))
- डार्क मोड सपोर्ट (#322 (https://github.com/brarcher/loyalty-card-locker/pull/322))
- लॉयल्टी कार्ड अब बारकोड रहित हो सकते हैं (उदाहरण के लिए बारकोड नहीं) (#324 (https://github.com/brarcher/loyalty-card-locker/pull/324))
- नोट्स कई पंक्तियों में फैले हो सकते हैं (#326 (https://github.com/brarcher/loyalty-card-locker/pull/326))
- नोट्स के आकार में सुधार (#319 (https://github.com/brarcher/loyalty-card-locker/pull/319))
- अधिसूचना और ऐप आइकन दृश्यता में सुधार करें (#330 (https://github.com/brarcher/loyalty-card-locker/pull/330))
- लक्ष्य एसडीके को एंड्रॉइड 10 पर अपडेट करें
- निम्नलिखित अनुवादों में सुधार करें:
- जर्मन
- इटालियन
- डच

View File

@@ -1,2 +1,2 @@
- उपयोगकर्ता को मैन्युअल रूप से बारकोड दर्ज करने की अनुमति दें। यदि कोई उपयोगकर्ता मैन्युअल रूप से बारकोड दर्ज करने का चुनाव करता है, तो सभी वैध और समर्थित बारकोड छवियों की एक सूची प्रदर्शित होती है। उपयोगकर्ता तब बारकोड छवि का चयन कर सकता है जो उपयोगकर्ता की इच्छा से मेल खाती है।
- उस समस्या का समाधान किया गया जहां कुछ प्रदर्शित बारकोड धुंधले थे।
- उपयोगकर्ता को मैन्युअल रूप से बारकोड दर्ज करने की अनुमति दें। यदि कोई उपयोगकर्ता मैन्युअल रूप से बारकोड दर्ज करने का चुनाव करता है, तो सभी वैध और समर्थित बारकोड छवियों की एक सूची प्रदर्शित होती है। उपयोगकर्ता तब बारकोड छवि का चयन कर सकता है जो उपयोगकर्ता की इच्छा से मेल खाती है। अंक #33 (https://github.com/brarcher/loyalty-card-locker/issues/33), पुल #44 (https://github.com/brarcher/loyalty-card-locker/pull/44)
- कुछ प्रदर्शित बारकोड धुंधले होने की समस्या का समाधान हो गया। (अंक #37 (https://github.com/brarcher/loyalty-card-locker/issues/37))

View File

@@ -1,9 +1,11 @@
- महत्वपूर्ण परिवर्तन: बैकअप प्रारूप बदल गया
- महत्वपूर्ण परिवर्तन: URL साझाकरण प्रारूप बदल गया
- महत्वपूर्ण परिवर्तन: बैकअप प्रारूप बदल गया, https://github.com/TheLastProject/Catima/wiki/Export-format देखें
- महत्वपूर्ण परिवर्तन: यूआरएल साझाकरण प्रारूप बदल गया, https://github.com/TheLastProject/Catima/wiki/Card-sharing-URL-format देखें
- स्कैनिंग के दौरान टॉर्च को सक्षम या अक्षम करना संभव बनाया गया
- UPC-E समर्थन जोड़ा
- प्रत्येक कार्ड में आगे और पीछे की फोटो जोड़ने के लिए समर्थन जोड़ा गया
- पासवर्ड से सुरक्षित ज़िप फ़ाइलों को आयात करने के लिए समर्थन जोड़ा गया
- स्टोकार्ड (Beta) से आयात का समर्थन
- Fidme आयात से नोट्स में एक बेकार रिक्त स्थान को ठीक किया गया
- लॉयल्टी कार्ड व्यूअर ऐपबार टॉप मार्जिन तय किया गया
- यूपीसी-ई समर्थन जोड़ा गया
- प्रत्येक कार्ड में आगे और पीछे की फोटो जोड़ने के लिए समर्थन
- पासवर्ड से सुरक्षित ज़िप फ़ाइलें आयात करने क समर्थन करता है
- स्टोकार्ड (बीटा) से आयात का समर्थन करता है
- फिडमे आयात से नोट्स में बेकार रिक्त स्थान को ठीक किया गया
- नए वाउचर वॉल्ट निर्यात प्रारूप का समर्थन करता है
- एंड्रॉइड 4 पर अन्य यूआई तत्वों के पीछे फिक्स्ड फ्लोटिंग एक्शन बटन
- फिक्स्ड लॉयल्टी कार्ड व्यूअर ऐपबार टॉप मार्जिन

View File

@@ -1,4 +1,4 @@
- बारकोड स्कैनर को बारकोड को सफलतापूर्वक कैप्चर करने में मदद करने के लिए, कार्ड प्रदर्शित करते समय स्क्रीन की चमक अधिकतम तक बढ़ जाती है।
- कार्ड हटाते समय डिलीट कन्फर्मेशन जोड़ें।
- जर्मन और चेक के लिए अनुवाद जोड़े गए
- इतालवी अनुवाद के लिए स्पष्टीकरण परिवर्तन।
- बारकोड स्कैनर को बारकोड को सफलतापूर्वक कैप्चर करने में मदद करने के लिए, कार्ड प्रदर्शित करते समय स्क्रीन की चमक अधिकतम तक बढ़ जाती है। (#54 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/54))
- कार्ड हटाते समय डिलीट पुष्टिकरण जोड़ा गया। (खींचें #55 (https://github.com/brarcher/loyalty-card-locker/pull/55))
- जर्मन के लिए अनुवाद जोड़े गए (पुल #57 (https://github.com/brarcher/loyalty-card-locker/pull/57)) और चेक (पुल #58 (https://github.com/brarcher/loyalty-) कार्ड-लॉकर/पुल/58)).
- इतालवी अनुवाद के लिए स्पष्टीकरण परिवर्तन। (खींचें #66 (https://github.com/brarcher/loyalty-card-locker/pull/66))

View File

@@ -1,7 +1,7 @@
नाम का "Locker" भाग सहज ज्ञान युक्त नहीं था। इसे ठीक करने के लिए betsythefc द्वारा एक नया एप्लिकेशन आइकन बनाया गया था जो एप्लिकेशन के उद्देश्य को बेहतर ढंग से दर्शाता है: बारकोड का उपयोग करने वाले लॉयल्टी कार्ड को संग्रहीत करन। इस नए आइकन के साथ ही एप्लिकेशन का नाम बदलकर "Loyalty Card Keychain" कर दिया गया है।
नाम का "लॉकर" भाग सहज ज्ञान युक्त नहीं था। इसे ठीक करने के लिए betsythefc द्वारा एक नया एप्लिकेशन आइकन बनाया गया था जो एप्लिकेशन के उद्देश्य को बेहतर ढंग से दर्शाता है: बारकोड का उपयोग करने वाले लॉयल्टी कार्ड को संग्रहीत करने के लिए। इस नए आइकन के साथ ही एप्लिकेशन का नाम बदलकर "लॉयल्टी कार्ड कीचेन" कर दिया गया है।
अतिरिक्त सुविधाएँ/सुधार:
- कार्डों के आयात/निर्यात को और अधिक लचीला बनाने के लिए इसे बदल दिया गया।
- लिथुआनियाई के लिए अनुवाद जोड़ा गया।
- फ़्रेंच के लिए अनुवाद जोड़ा गया।
- कार्डों के आयात/निर्यात को और अधिक लचीला बनाने के लिए इसे बदल दिया गया। (खींचें #76 (https://github.com/brarcher/loyalty-card-locker/pull/76))
- लिथुआनियाई के लिए अनुवाद जोड़ा गया। (खींचें #62 (https://github.com/brarcher/loyalty-card-locker/pull/62))
- फ़्रेंच के लिए अनुवाद जोड़ा गया। (#80 खींचें (https://github.com/brarcher/loyalty-card-locker/pull/80))

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1,3 +1 @@
- Javított Catima importáló (javítja az importálás után hiányzó kártyákat)
- A hatályos tól/ig határidő dátum beállítása során elforduló képernyő fagyás javítása
- Kisebb UI javítások

View File

@@ -1,4 +0,0 @@
- Kisebb UI javítások
- A képernyő elforgatásnál beírt érvényességi dátumoknál való törlés javítása
- A képernyő elforgatásnál való szín választásnál történő fagyás javítása
- Stocard import javítása

View File

@@ -1,3 +0,0 @@
- "Archív mód" áthelyezése a "Kinézet opciók" menübe (korábban a "Részletek mutatása" pontban volt)
- Android 13 app-onkénti nyelv támogatás
- Beágyazott adatvédelmi politika, változásnapló és licensz az app-ban

View File

@@ -1,6 +0,0 @@
- "Kártya hozzáadása" munkafolyamat finomítása
- Jóváhagyási folyamat fejlesztése
- Hibás archív megjelenítés UI státusz fellépése, amikor a szélső ablak megjelenik hiba javítása
- Téma vagy kártya szín használata a navigációs csíknál (Android 8.1+)
- Érvényesség és lejárati dátum kiválasztó frissítése
- Opció a rendszertől független mindig engedélyezett elforgatáshoz

View File

@@ -1,4 +0,0 @@
- Cél az Android 14
- Kártya ikon megnyitása a galériában egy érintésre
- A szerkesztésen belüli fotó fül tokéletesítése
- Küldő képernyő frissítése támogatás fogadóvá

View File

@@ -13,7 +13,7 @@ Ezzel a mindennapi kellékkel felszabadul a pénztárcájában a plasztikkárty
- Osszon meg kuponokat, exkluzív ajánlatokat, promóciós kódokat, vagy kártyákat és kódokat bármely appal.
- Sötét téma és akadálymentesítés a gyengén látó felhasználóinknak.
- Mindenki számára elérhető a szabad szoftveres közösség jóvoltából.
- Több mint 40 nyelven honosított.
- Több mint 20 nyelven honosított.
- Ingyenes, a közösség tagjai járulnak hozzá a fejlesztéshez.
- Használja, tanulmányozza, változtassa és ossza meg; <i>mindenkivel</i>.
- Nem csak szabad és nyílt forráskódú. <i>Copyleft</i> licencű, szabad (GPLv3+) kártyakezelő szoftver.

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -2,4 +2,3 @@
- Melhorias no fluxo de validação
- Reparo de caso extremo causador de estado inválido da IU ao alternar a exibição do arquivo
- Use tema ou cor do cartão para a barra de navegação (Android 8.1+)
- Adicionar opção para rodar sempre (ignorando as definições do sistema)

View File

@@ -1,4 +0,0 @@
- Objetivo Android 14
- Ícone de cartão aberto na galeria ao toque
- Melhorar o design do separador Fotografias na vista de edição
- Atualizar o ecrã de despesas para suportar também a receção

View File

@@ -13,7 +13,7 @@ Com esta ferramenta essencial de transporte diário pode substituir o plástico
- Partilhe cupões, ofertas exclusivas, códigos promocionais ou cartões e códigos usando qualquer outra aplicação.
- Com tema escuro e opções de acessibilidade para utilizadores com deficiência visual.
- Feito para todos pela comunidade do software livre.
- Traduções localizadas feitas manualmente em mais de 40 idiomas.
- Traduções localizadas feitas manualmente em mais de 20 idiomas.
- Aplicação gratuita, suportada por contribuições da comunidade.
- Use, estude, altere e partilhe o código-fonte da aplicação como quiser; <i>com toda a gente</i>.
- Não é apenas um Software Livre / Código Aberto. É uma aplicação de gestão de cartões de partilha <i>sob a mesma licença</i> segundo a licença (GPLv3+).

View File

@@ -1,4 +0,0 @@
- Ориентация на Android 14
- Значок карты открывается в галерее нажатием
- Улучшен дизайн вкладки фотографий в режиме редактирования
- Обновлён экран баланса баллов: теперь поддерживается получение

View File

@@ -1,14 +1,9 @@
- Добавлена возможность поиска карты (№320)
- Добавлена возможность отправки и получения карт (№321)
- Возможность поиска карты (№320)
- Возможность отправки и получения карт (№321)
- Поддержка тёмного режима (№322)
- Поддержка карт без штрих-кодов (№324)
- Примечания могут отображаться в несколько строк (№326)
- Улучшено масштабирование примечаний (№319)
- Улучшена видимость уведомлений и значка приложения (№330)
- Целевой SDK обновлён до Android 10
- Улучшены переводы:
- Немецкий
- Итальянский
- Нидерландский
- Польский
- Русский
- Улучшены переводы: немецкий, итальянский, нидерландский, польский, русский.

View File

@@ -13,7 +13,7 @@
- Возможность поделиться купонами, эксклюзивными предложениями, промо-кодами или картами и кодами, используя любое приложение.
- Тёмная тема и специальные возможности для слабовидящих пользователей.
- Сделано для всех сообществом разработчиков свободного программного обеспечения.
- Переводы, сделанные людьми, для более чем 40 языков.
- Переводы, сделанные людьми, для более чем 20 языков.
- Безвозмездно, при поддержке сообщества.
- Используйте, изучайте, изменяйте и делитесь по своему усмотрению <i>как угодно</i>.
- Не просто бесплатное программное обеспечение с открытым исходным кодом. Полностью <i>свободное</i> программное обеспечение (GPLv3+) для управления картами.

View File

@@ -1,4 +0,0 @@
- Android 14 hedef alındı
- Dokunulduğunda galeride kart simgesini aç
- Düzenleme görünümünde Fotoğraflar sekmesinin tasarımı iyileştirildi
- Harcama ekranı almayı da destekleyecek şekilde güncellendi

View File

@@ -13,7 +13,7 @@ Bu temel günlük taşıma aracıyla işe yaramaz plastiği nakitle değiştireb
- Herhangi bir uygulamayı kullanarak kuponları, özel teklifleri, tanıtım kodlarını veya kartları ve kodları paylaşın.
- Görme engelli kullanıcılar için koyu tema ve erişilebilirlik seçenekleri.
- Özgür yazılım topluluğu tarafından herkes için yapıldı.
- 40'den fazla dil için yerelleştirilen el yapımı çeviriler.
- 20'den fazla dil için yerelleştirilen el yapımı çeviriler.
- Topluluk katkılarıyla desteklenir ve ücretsizdir.
- Dilediğiniz gibi kullanın, inceleyin, değiştirin ve <i>herkesle</i> paylaşın.
- Yalnızca Özgür Yazılım / Açık Kaynaklı değil. <i>Copyleft lisanslı</i> özgür (GPLv3+) kart yönetimi yazılımı.

View File

@@ -1,3 +0,0 @@
- Thay đổi quy chuẩn mặc định của tên tệp nhập/xuất. (pull #84 (https://github.com/brarcher/loyalty-card-locker/pull/84))
- Sửa lỗi ký tự trong trang nhập/xuất. (pull #87 (https://github.com/brarcher/loyalty-card-locker/pull/87))
- Cải tiến bố cục của trang xem thẻ. Dòng chữ có thể đọc dễ dàng hơn, có thể lựa chọn bằng cách nhấn giữ dài. (pull #91 (https://github.com/brarcher/loyalty-card-locker/pull/91))

View File

@@ -1,2 +0,0 @@
- Ẩn thanh tìm kiếm, mở rộng và thu hẹp biểu tượng cho tới khi có ít nhất 1 thẻ
- Sửa chủ đề khác nhau

View File

@@ -1,2 +0,0 @@
- Lưu chi tiết trạng thái mở rộng của thẻ
- Sửa vài lỗi nhỏ trong giao diện người dùng

View File

@@ -1,22 +0,0 @@
Từ bỏ việc tìm kiếm những chiếc thẻ tích điểm nhựa khi thanh toán tại quầy.
<b>Chỉ cần quét mã vạch bằng máy ảnh trên điện thoại, gác lại những chiếc thẻ.</b>
Để cho chiếc ví được nhẹ nhàng và chứa những thứ có giá trị khác.
Với công cụ "Cầm tay thiết yếu hàng ngày" này, bạn có thể thay thế những miếng nhựa vô dụng bằng tiền mặt.
- Ngăn ngừa gián điệp, cấp giới hạn quyền. Không cần kết nối mạng và không chứa quảng cáo.
- Thêm thẻ hoặc mã với cách đặt tên và màu sắc được cá nhân hoá.
- Có thể nhập mã thủ công nếu không có mã vạch hoặc không thể sử dụng được.
- Nhập thẻ và mã từ đa dạng các tệp, Catima, FidMe, Loyalty Card Keychain, Stocard và Voucher Vault.
- Tạo bản sao lưu cho tất cả dữ liệu thẻ của bạn và khôi phục ở thiết bị mới nếu muốn.
- Chia sẻ phiếu giảm giá, ưu đãi độc quyền, mã khuyến mại hoặc thẻ và mã bằng bất kỳ ứng dụng nào.
- Chế độ hiển thị ban đêm và tuỳ chọn trợ năng cho những người khiếm thị.
- Phần mềm tạo bởi cộng đồng, miễn phí và dành cho tất cả mọi người.
- Bản dịch thủ công được đóng góp bởi cộng đồng với 40+ ngôn ngữ.
- Miễn phí hoàn toàn, được hỗ trợ bởi cộng đồng.
- Sử dụng, nghiên cứu, thay đổi và chia sẻ theo ý bạn cần; <i>với tất cả</i>.
- Không chỉ phần mềm miễn phí/ mã nguồn mở. <i>Bản quyền bởi</i> phần mềm quản lý thẻ miễn phí (GPLv3+).
Đơn giản hoá cuộc sống và mua sắm, gạt đi nỗi lo mất hoá đơn, thẻ quà tặng tại cửa hàng hoặc vé máy bay nữa.
Lưu trữ mọi phần thưởng và tiền thưởng cho bạn, ở bất cứ đâu.

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -1 +1 @@
Dành cho mã vạch, thẻ thành viên, tích điểm, mã giảm giá và vé của bạn.
Dành cho mã vạch, thẻ thành viên, tích điểm, mã giảm giá và vé của bạn

View File

@@ -1,4 +1 @@
- 适配 Android 14
- 触碰打开图库内的卡片图标
- 改进编辑视图下“照片”标签的设计
- 更新开支屏支持显示接收金额

View File

Binary file not shown.

View File

@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME