Merge branch 'master' of github.com:TheLastProject/loyalty-card-locker into feature/power_screen_widgets

This commit is contained in:
Sylvia van Os
2021-10-17 20:02:42 +02:00
56 changed files with 569 additions and 191 deletions

View File

@@ -2,9 +2,13 @@ name: Android CI
on:
push:
branches: [ master ]
branches:
- master
- staging
- trying
pull_request:
branches: [ master ]
branches:
- master
jobs:
build:

View File

@@ -2,7 +2,7 @@ name: 'Close issues and PRs needing info for too long'
on:
schedule:
- cron: '30 1 * * *'
permissions:
issues: write
pull-requests: write

View File

@@ -1,7 +1,8 @@
name: Convert CHANGELOG to Fastlane
on:
push:
branches: [ master ]
branches:
- master
jobs:
convert_changelog_to_fastlane:

View File

@@ -13,10 +13,12 @@ name: "CodeQL"
on:
push:
branches: [ master ]
branches:
- master
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
branches:
- master
schedule:
- cron: '33 1 * * 4'

View File

@@ -1,5 +1,23 @@
# Changelog
## Unreleased - 89
- Fix swiping between groups not working on an empty group
- Allow password-protecting exports
- Improve usage of space for QR codes
## v2.7.3 - 88 (2021-10-10)
- Fix incorrect migration making first card become invisible
## v2.7.2 - 87 (2021-10-09)
- Fix regression breaking import/export
## v2.7.1 - 86 (2021-10-07)
- Improve search with spaces
## v2.7.0 - 85 (2021-10-05)
Android 4.4 is no longer supported starting with this release. If you want to use Catima on Android 4.4, please use version 2.6.1.

View File

@@ -18,8 +18,8 @@ android {
applicationId "me.hackerchick.catima"
minSdkVersion 21
targetSdkVersion 31
versionCode 85
versionName "2.7.0"
versionCode 88
versionName "2.7.3"
vectorDrawables.useSupportLibrary true
multiDexEnabled true
@@ -80,9 +80,7 @@ android {
dependencies {
// AndroidX
implementation "androidx.multidex:multidex:2.0.1"
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.1'
implementation 'androidx.exifinterface:exifinterface:1.3.3'
implementation 'androidx.preference:preference:1.1.1'

View File

@@ -63,6 +63,13 @@ public class CatimaBarcode {
return barcodeFormats.contains(mBarcodeFormat);
}
public boolean isSquare(){
return mBarcodeFormat == BarcodeFormat.AZTEC
|| mBarcodeFormat == BarcodeFormat.DATA_MATRIX
|| mBarcodeFormat == BarcodeFormat.MAXICODE
|| mBarcodeFormat == BarcodeFormat.QR_CODE;
}
public BarcodeFormat format() {
return mBarcodeFormat;
}

View File

@@ -7,6 +7,7 @@ import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.text.TextUtils;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
@@ -20,7 +21,7 @@ public class DBHelper extends SQLiteOpenHelper
{
public static final String DATABASE_NAME = "Catima.db";
public static final int ORIGINAL_DATABASE_VERSION = 1;
public static final int DATABASE_VERSION = 12;
public static final int DATABASE_VERSION = 13;
public static class LoyaltyCardDbGroups
{
@@ -293,6 +294,24 @@ public class DBHelper extends SQLiteOpenHelper
insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note);
}
}
if(oldVersion < 13 && newVersion >= 13)
{
db.execSQL("DELETE FROM " + LoyaltyCardDbFTS.TABLE + ";");
Cursor cursor = db.rawQuery("SELECT * FROM " + LoyaltyCardDbIds.TABLE + ";", null, null);
if (cursor.moveToFirst()) {
LoyaltyCard loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor);
insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note);
while (cursor.moveToNext()) {
loyaltyCard = LoyaltyCard.toLoyaltyCard(cursor);
insertFTS(db, loyaltyCard.id, loyaltyCard.store, loyaltyCard.note);
}
}
cursor.close();
}
}
private ContentValues generateFTSContentValues(final int id, final String store, final String note) {
@@ -663,38 +682,26 @@ public class DBHelper extends SQLiteOpenHelper
return db.rawQuery("SELECT " + LoyaltyCardDbIds.TABLE + ".* FROM " + LoyaltyCardDbIds.TABLE +
" JOIN " + LoyaltyCardDbFTS.TABLE +
" ON " + LoyaltyCardDbFTS.TABLE + "." + LoyaltyCardDbFTS.ID + " = " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.ID +
(filter.isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") +
(filter.trim().isEmpty() ? " " : " AND " + LoyaltyCardDbFTS.TABLE + " MATCH ? ") +
groupFilter.toString() +
" ORDER BY " + LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STAR_STATUS + " DESC, " +
" (CASE WHEN " + LoyaltyCardDbIds.TABLE + "." + orderField + " IS NULL THEN 1 ELSE 0 END), " +
LoyaltyCardDbIds.TABLE + "." + orderField + " COLLATE NOCASE " + getDbDirection(order, direction) + ", " +
LoyaltyCardDbIds.TABLE + "." + LoyaltyCardDbIds.STORE + " COLLATE NOCASE ASC " +
limitString, filter.isEmpty() ? null : new String[] { filter + '*' }, null);
limitString, filter.trim().isEmpty() ? null : new String[] { TextUtils.join("* ", filter.split(" ")) + '*' }, null);
}
/**
* Returns the amount of loyalty cards.
*
* @return Integer
*/
public int getLoyaltyCardCount()
{
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbIds.TABLE);
}
/**
* Returns the amount of loyalty cards with the filter text in either the store or note.
*
* @param filter
* @return Integer
*/
public int getLoyaltyCardCount(String filter)
{
if (filter.isEmpty()) {
return getLoyaltyCardCount();
}
SQLiteDatabase db = getReadableDatabase();
return (int) DatabaseUtils.queryNumEntries(db, LoyaltyCardDbFTS.TABLE,
LoyaltyCardDbFTS.TABLE + " MATCH ? ", withArgs(filter + '*'));
}
/**
* Returns a cursor to all groups.
*
@@ -709,20 +716,22 @@ public class DBHelper extends SQLiteOpenHelper
}
public List<Group> getGroups() {
try(Cursor data = getGroupCursor()) {
List<Group> groups = new ArrayList<>();
Cursor data = getGroupCursor();
if (!data.moveToFirst()) {
return groups;
}
groups.add(Group.toGroup(data));
while (data.moveToNext()) {
groups.add(Group.toGroup(data));
}
List<Group> groups = new ArrayList<>();
if (!data.moveToFirst()) {
data.close();
return groups;
}
groups.add(Group.toGroup(data));
while (data.moveToNext()) {
groups.add(Group.toGroup(data));
}
data.close();
return groups;
}
public void reorderGroups(final List<Group> groups)

View File

@@ -42,7 +42,7 @@ class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListI
public GroupCursorAdapter.GroupListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType)
{
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.group_layout, inputParent, false);
return new GroupCursorAdapter.GroupListItemViewHolder(itemView);
return new GroupListItemViewHolder(itemView);
}
public Cursor getCursor()
@@ -80,7 +80,7 @@ class GroupCursorAdapter extends BaseCursorAdapter<GroupCursorAdapter.GroupListI
void onDeleteButtonClicked(View view);
}
public class GroupListItemViewHolder extends RecyclerView.ViewHolder
public static class GroupListItemViewHolder extends RecyclerView.ViewHolder
{
public TextView mName, mCardCount;
public AppCompatImageButton mMoveUp, mMoveDown, mEdit, mDelete;

View File

@@ -12,14 +12,16 @@ import android.text.InputType;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.Toast;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
@@ -46,6 +48,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity
private String importAlertTitle;
private String importAlertMessage;
private DataFormat importDataFormat;
private String exportPassword;
@Override
protected void onCreate(Bundle savedInstanceState)
@@ -87,7 +90,28 @@ public class ImportExportActivity extends CatimaAppCompatActivity
@Override
public void onClick(View v)
{
chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION);
AlertDialog.Builder builder = new AlertDialog.Builder(ImportExportActivity.this);
builder.setTitle(R.string.exportPassword);
FrameLayout container = new FrameLayout(ImportExportActivity.this);
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);
container.addView(input);
builder.setView(container);
builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {
exportPassword = input.getText().toString();
chooseFileWithIntent(intentCreateDocumentAction, CHOOSE_EXPORT_LOCATION);
});
builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> dialogInterface.cancel());
builder.show();
}
});
@@ -187,7 +211,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity
builder.show();
}
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password)
private void startImport(final InputStream target, final Uri targetUri, final DataFormat dataFormat, final char[] password, final boolean closeWhenDone)
{
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener()
{
@@ -195,6 +219,13 @@ public class ImportExportActivity extends CatimaAppCompatActivity
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat)
{
onImportComplete(result, targetUri, dataFormat);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
};
@@ -203,19 +234,25 @@ public class ImportExportActivity extends CatimaAppCompatActivity
importExporter.execute();
}
private void startExport(final OutputStream target, final Uri targetUri)
private void startExport(final OutputStream target, final Uri targetUri,char[] password, final boolean closeWhenDone)
{
ImportExportTask.TaskCompleteListener listener = new ImportExportTask.TaskCompleteListener()
{
@Override
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat)
{
public void onTaskComplete(ImportExportResult result, DataFormat dataFormat) {
onExportComplete(result, targetUri);
if (closeWhenDone) {
try {
target.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
};
importExporter = new ImportExportTask(ImportExportActivity.this,
DataFormat.Catima, target, listener);
DataFormat.Catima, target,password, listener);
importExporter.execute();
}
@@ -393,6 +430,7 @@ public class ImportExportActivity extends CatimaAppCompatActivity
{
if (requestCode == CHOOSE_EXPORT_LOCATION)
{
OutputStream writer;
if (uri.getScheme() != null)
{
@@ -402,9 +440,8 @@ public class ImportExportActivity extends CatimaAppCompatActivity
{
writer = new FileOutputStream(new File(uri.toString()));
}
Log.e(TAG, "Starting file export with: " + uri.toString());
startExport(writer, uri);
startExport(writer, uri,exportPassword.toCharArray(),true);
}
else
{
@@ -420,10 +457,10 @@ public class ImportExportActivity extends CatimaAppCompatActivity
Log.e(TAG, "Starting file import with: " + uri.toString());
startImport(reader, uri, importDataFormat, password);
startImport(reader, uri, importDataFormat, password, true);
}
}
catch(FileNotFoundException e)
catch(IOException e)
{
Log.e(TAG, "Failed to import/export file: " + uri.toString(), e);
if (requestCode == CHOOSE_EXPORT_LOCATION)

View File

@@ -35,7 +35,7 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
/**
* Constructor which will setup a task for exporting to the given file
*/
ImportExportTask(Activity activity, DataFormat format, OutputStream output,
ImportExportTask(Activity activity, DataFormat format, OutputStream output,char[] password,
TaskCompleteListener listener)
{
super();
@@ -43,6 +43,7 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
this.doImport = false;
this.format = format;
this.outputStream = output;
this.password = password;
this.listener = listener;
}
@@ -70,14 +71,14 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
return importResult;
}
private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db)
private ImportExportResult performExport(Context context, OutputStream stream, DBHelper db,char[] password)
{
ImportExportResult result = ImportExportResult.GenericFailure;
try
{
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
result = MultiFormatExporter.exportData(context, db, stream, format);
result = MultiFormatExporter.exportData(context, db, stream, format,password);
writer.close();
}
catch (IOException e)
@@ -118,7 +119,7 @@ class ImportExportTask extends AsyncTask<Void, Void, ImportExportResult>
}
else
{
result = performExport(activity.getApplicationContext(), outputStream, db);
result = performExport(activity.getApplicationContext(), outputStream, db,password);
}
return result;

View File

@@ -21,7 +21,6 @@ import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.ArrayList;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;
import protect.card_locker.preferences.Settings;
@@ -62,7 +61,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public LoyaltyCardListItemViewHolder onCreateViewHolder(ViewGroup inputParent, int inputViewType)
{
View itemView = LayoutInflater.from(inputParent.getContext()).inflate(R.layout.loyalty_card_layout, inputParent, false);
return new LoyaltyCardListItemViewHolder(itemView);
return new LoyaltyCardListItemViewHolder(itemView, mListener);
}
public Cursor getCursor()
@@ -241,7 +240,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
void onRowLongClicked(int inputPosition);
}
public class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener
public static class LoyaltyCardListItemViewHolder extends RecyclerView.ViewHolder
{
public TextView mStoreField, mNoteField, mBalanceField, mExpiryField;
@@ -251,7 +250,7 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
public View mDivider;
public RelativeLayout mThumbnailFrontContainer, mThumbnailBackContainer;
public LoyaltyCardListItemViewHolder(View inputView)
public LoyaltyCardListItemViewHolder(View inputView, CardAdapterListener inputListener)
{
super(inputView);
mRow = inputView.findViewById(R.id.row);
@@ -265,15 +264,11 @@ public class LoyaltyCardCursorAdapter extends BaseCursorAdapter<LoyaltyCardCurso
mExpiryField = inputView.findViewById(R.id.expiry);
mCardIcon = inputView.findViewById(R.id.thumbnail);
mStarIcon = inputView.findViewById(R.id.star);
inputView.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View inputView)
{
mListener.onRowLongClicked(getAdapterPosition());
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
inputView.setOnLongClickListener(view -> {
inputListener.onRowClicked(getAdapterPosition());
inputView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
return true;
});
}
}
}

View File

@@ -1,14 +1,18 @@
package protect.card_locker;
import android.app.Application;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.multidex.MultiDexApplication;
import protect.card_locker.preferences.Settings;
public class LoyaltyCardLockerApplication extends MultiDexApplication {
public class LoyaltyCardLockerApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Settings settings = new Settings(getApplicationContext());
Settings settings = new Settings(this);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
}
}

View File

@@ -268,7 +268,10 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
if (imageTypes.get(mainImageIndex) == ImageType.BARCODE) {
redrawBarcodeAfterResize();
}
centerGuideline.setGuidelinePercent(0.5f * scale);
if(loyaltyCard!=null && format!=null && format.isSquare())
centerGuideline.setGuidelinePercent(0.75f * scale);
else
centerGuideline.setGuidelinePercent(0.5f * scale);
}
@Override
@@ -417,6 +420,12 @@ public class LoyaltyCardViewActivity extends CatimaAppCompatActivity implements
setupOrientation();
format = loyaltyCard.barcodeType;
if(format != null && format.isSquare()){
centerGuideline.setGuidelinePercent(0.75f);
}
else{
centerGuideline.setGuidelinePercent(0.5f);
}
cardIdString = loyaltyCard.cardId;
barcodeIdString = loyaltyCard.barcodeId;

View File

@@ -195,9 +195,9 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
@Override
public void onTabSelected(TabLayout.Tab tab) {
selectedTab = tab.getPosition();
Log.d("onTabSelected","Tab Position "+tab.getPosition());
mGroup = tab.getTag();
updateLoyaltyCardList();
// Store active tab in Shared Preference to restore next app launch
SharedPreferences activeTabPref = getApplicationContext().getSharedPreferences(
getString(R.string.sharedpreference_active_tab),
@@ -230,6 +230,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
mHelpText.setOnTouchListener(gestureTouchListener);
mNoMatchingCardsText.setOnTouchListener(gestureTouchListener);
mCardList.setOnTouchListener(gestureTouchListener);
mNoGroupCardsText.setOnTouchListener(gestureTouchListener);
mAdapter = new LoyaltyCardCursorAdapter(this, null, this);
mCardList.setAdapter(mAdapter);
@@ -633,6 +634,12 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
mGestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.d(TAG, "On fling");
@@ -648,9 +655,10 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
}
Integer currentTab = groupsTabLayout.getSelectedTabPosition();
Log.d("onFling","Current Tab "+currentTab);
// Swipe right
if (velocityX < -150) {
Log.d("onFling","Right Swipe detected "+velocityX);
Integer nextTab = currentTab + 1;
if (nextTab == groupsTabLayout.getTabCount()) {
@@ -664,6 +672,7 @@ public class MainActivity extends CatimaAppCompatActivity implements LoyaltyCard
// Swipe left
if (velocityX > 150) {
Log.d("onFling","Left Swipe detected "+velocityX);
Integer nextTab = currentTab - 1;
if (nextTab < 0) {

View File

@@ -6,6 +6,7 @@ import android.graphics.Bitmap;
import net.lingala.zip4j.io.outputstream.ZipOutputStream;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.EncryptionMethod;
import net.lingala.zip4j.util.InternalZipConstants;
import org.apache.commons.csv.CSVFormat;
@@ -30,14 +31,21 @@ import protect.card_locker.Utils;
*/
public class CatimaExporter implements Exporter
{
public void exportData(Context context, DBHelper db, OutputStream output) throws IOException, InterruptedException
public void exportData(Context context, DBHelper db, OutputStream output,char[] password) throws IOException, InterruptedException
{
// Necessary vars
int readLen;
byte[] readBuffer = new byte[InternalZipConstants.BUFF_SIZE];
// Create zip output stream
ZipOutputStream zipOutputStream = new ZipOutputStream(output);
ZipOutputStream zipOutputStream;
if(password!=null && password.length>0){
zipOutputStream = new ZipOutputStream(output,password);
}
else{
zipOutputStream = new ZipOutputStream(output);
}
// Generate CSV
ByteArrayOutputStream catimaOutputStream = new ByteArrayOutputStream();
@@ -45,8 +53,7 @@ public class CatimaExporter implements Exporter
writeCSV(db, catimaOutputStreamWriter);
// Add CSV to zip file
ZipParameters csvZipParameters = new ZipParameters();
csvZipParameters.setFileNameInZip("catima.csv");
ZipParameters csvZipParameters = createZipParameters("catima.csv",password);
zipOutputStream.putNextEntry(csvZipParameters);
InputStream csvInputStream = new ByteArrayInputStream(catimaOutputStream.toByteArray());
while ((readLen = csvInputStream.read(readBuffer)) != -1) {
@@ -71,8 +78,7 @@ public class CatimaExporter implements Exporter
// If it exists, add to the .zip file
Bitmap image = Utils.retrieveCardImage(context, card.id, front);
if (image != null) {
ZipParameters imageZipParameters = new ZipParameters();
imageZipParameters.setFileNameInZip(Utils.getCardImageFileName(card.id, front));
ZipParameters imageZipParameters = createZipParameters(Utils.getCardImageFileName(card.id, front),password);
zipOutputStream.putNextEntry(imageZipParameters);
InputStream imageInputStream = new ByteArrayInputStream(Utils.bitmapToByteArray(image));
while ((readLen = imageInputStream.read(readBuffer)) != -1) {
@@ -86,6 +92,16 @@ public class CatimaExporter implements Exporter
zipOutputStream.close();
}
private ZipParameters createZipParameters(String fileName, char[] password){
ZipParameters zipParameters = new ZipParameters();
zipParameters.setFileNameInZip(fileName);
if(password!=null && password.length>0){
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);
}
return zipParameters;
}
private void writeCSV(DBHelper db, OutputStreamWriter output) throws IOException, InterruptedException {
CSVPrinter printer = new CSVPrinter(output, CSVFormat.RFC4180);

View File

@@ -48,7 +48,7 @@ public class CatimaImporter implements Importer
bufferedInputStream.mark(100);
// First, check if this is a zip file
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream);
ZipInputStream zipInputStream = new ZipInputStream(bufferedInputStream,password);
boolean isZipFile = false;

View File

@@ -17,5 +17,5 @@ public interface Exporter
* Export the database to the output stream in a given format.
* @throws IOException
*/
void exportData(Context context, DBHelper db, OutputStream output) throws IOException, InterruptedException;
void exportData(Context context, DBHelper db, OutputStream output,char[] password) throws IOException, InterruptedException;
}

View File

@@ -22,7 +22,7 @@ public class MultiFormatExporter
* another ImportExportResult otherwise. If not Success, partial data may have been
* written to the output stream, and it should be discarded.
*/
public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format)
public static ImportExportResult exportData(Context context, DBHelper db, OutputStream output, DataFormat format,char[] password)
{
Exporter exporter = null;
@@ -40,7 +40,7 @@ public class MultiFormatExporter
{
try
{
exporter.exportData(context, db, output);
exporter.exportData(context, db, output,password);
return ImportExportResult.Success;
}
catch(IOException e)

View File

@@ -116,14 +116,14 @@ public class StocardImporter implements Importer
.substring("/loyalty-card-providers/".length())
);
try {
if (jsonObject.has("input_barcode_format")) {
loyaltyCardHashMap = appendToLoyaltyCardHashMap(
loyaltyCardHashMap,
cardName,
"barcodeType",
jsonObject.getString("input_barcode_format")
);
} catch (JSONException ignored) {}
}
}
} else if (fileName.endsWith("notes/default.json")) {
loyaltyCardHashMap = appendToLoyaltyCardHashMap(

View File

@@ -1,6 +1,7 @@
package protect.card_locker.preferences;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
@@ -41,7 +42,6 @@ public class SettingsActivity extends CatimaAppCompatActivity
// Display the fragment as the main content.
SettingsFragment fragment = new SettingsFragment();
fragment.setParentReference(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.settings_container, fragment)
.commit();
@@ -64,11 +64,6 @@ public class SettingsActivity extends CatimaAppCompatActivity
public static class SettingsFragment extends PreferenceFragmentCompat
{
private static final String DIALOG_FRAGMENT_TAG = "SettingsFragment";
private SettingsActivity parent;
public void setParentReference(SettingsActivity settingsActivity) {
parent = settingsActivity;
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -120,8 +115,9 @@ public class SettingsActivity extends CatimaAppCompatActivity
});
localePreference.setOnPreferenceChangeListener((preference, newValue) -> {
// Refresh the activity
parent.finish();
startActivity(parent.getIntent());
Intent intent = new Intent(getContext(), SettingsActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
getContext().startActivity(intent);
return true;
});

View File

@@ -68,7 +68,7 @@
android:paddingTop="@dimen/inputPadding"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
<com.google.android.material.card.MaterialCardView
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
android:layout_marginEnd="@dimen/activity_margin"
@@ -84,7 +84,7 @@
android:contentDescription="@string/thumbnailDescription"
android:src="@mipmap/ic_launcher"/>
</androidx.cardview.widget.CardView>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/storeNameField"
@@ -347,7 +347,7 @@
android:paddingTop="@dimen/inputPadding">
<!-- Front image -->
<androidx.cardview.widget.CardView
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
@@ -369,7 +369,7 @@
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_camera_white" />
</androidx.cardview.widget.CardView>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<!-- Back image -->
@@ -382,7 +382,7 @@
android:paddingTop="@dimen/inputPadding">
<!-- Back image -->
<androidx.cardview.widget.CardView
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
@@ -404,7 +404,7 @@
android:scaleType="fitCenter"
app:srcCompat="@drawable/ic_camera_white" />
</androidx.cardview.widget.CardView>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</TableLayout>
</TableLayout>

View File

@@ -25,7 +25,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<androidx.cardview.widget.CardView
<com.google.android.material.card.MaterialCardView
android:id="@+id/thumbnail_container"
android:layout_width="@dimen/cardThumbnailSize"
android:layout_height="@dimen/cardThumbnailSize"
@@ -59,7 +59,7 @@
app:srcCompat="@drawable/ic_done" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</com.google.android.material.card.MaterialCardView>
<LinearLayout
android:minHeight="@dimen/cardThumbnailSize"

View File

@@ -6,19 +6,21 @@ Heimen Stoffels
solokot
mondstern
Taco
Gediminas Murauskas
IllusiveMan196
Petr Novák
Gediminas Murauskas
Joel A
Oğuz Ersen
StoyanDimitrov
Samantaz Fox
Nyatsuki
arno-github
Sergio Paredes
StoyanDimitrov
Oğuz Ersen
Petr Novák
Ankit Tiwari
arshbeerSingh
huuhaa
Michael Moroni
Olivia (Zoe)
betsythefc
K. Herbert
Quentin PAGÈS
@@ -35,13 +37,16 @@ Jane Kong
Lukas Grassauer
Michalis
schirinowski
Thomas Bertels
inesre
lgasp
phlostically
Kevin Sicong Jiang
Miha Frangež
Aditya Das
Airat
BMN
Biren
Flav
Franciszek Stefan
Izzy
@@ -49,6 +54,7 @@ Karol Kosek
bittin
Maciej Błędkowski
Mattia
Michael Gangolf
pbeckmann
Peer Beckmann
QuangDNguyen2211
@@ -58,6 +64,7 @@ Simone Dotto
Subhashish Anand
Tymofii Lytvynenko
Tjipke van der Heide
avikkundu
opsik
psa-jforestier
Robin

View File

@@ -208,4 +208,5 @@
<string name="on_google_play">в Google Play</string>
<string name="and_data_usage">и използване на данни</string>
<string name="help_translate_this_app">Помогнете за превода на приложението</string>
</resources>
</resources>

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="save">সংরক্ষণ</string>
<string name="cancel">বাতিল</string>
<string name="unstar">তারা মুক্ত</string>
<string name="star">তারা</string>
<string name="barcodeNoBarcode">বারকোড না বারকোড</string>
<string name="barcodeType">বারকোড ধরন</string>
<string name="note">বিঃদ্রঃ</string>
<string name="storeName">দোকানের নাম</string>
<string name="noMatchingGiftCards">কোন ম্যাচিং উপহার কার্ড নেই</string>
<string name="noGiftCards">উপহার কার্ড নেই</string>
<string name="action_add">কর্ম যোগ</string>
<string name="all">সব</string>
<string name="noGroupCards">গোষ্ঠী কার্ড নেই</string>
<string name="noGroups">গোষ্ঠীগুলি নেই</string>
<string name="groups">গোষ্ঠীগুলি</string>
<string name="enter_group_name">গোষ্ঠী নাম লিখুন </string>
<string name="exportSuccessful">রপ্তানি সফল</string>
<string name="importSuccessful">আগম সফল</string>
<string name="intent_import_card_from_url_share_text">url শেয়ার টেক্সট থেকে ইন্টেন্ট ইম্পোর্ট কার্ড</string>
<string name="settings_disable_lockscreen_while_viewing_card"> কার্ড দেখা কালিন লকস্ক্রিন নিষ্ক্রিয়</string>
<string name="settings_keep_screen_on">সেটিংস পর্দা খোলা রাখুন</string>
<string name="settings_lock_barcode_orientation"> তালাবদ্ধ বার কোড অভিযোজন</string>
<string name="settings_max_font_size_scale">সর্বোচ্চ হরফ আকার</string>
<string name="settings_light_theme">সাদাটে থিম</string>
<string name="settings_system_theme">যন্ত্রর থিম</string>
<string name="settings_theme">থিম</string>
<string name="settings_category_title_ui">বিভাগ শিরোনাম</string>
<string name="starImage">তারা ছবি</string>
<string name="importCatima">ক্যাতিনা আগম</string>
<string name="importLoyaltyCardKeychain">আমদানি লয়্যালটি কার্ড কীচেন</string>
<string name="importStocard">স্টো কার্ড আমদানি করুন</string>
<string name="importVoucherVault">আমদানি ভাউচার ভল্ট</string>
<string name="barcodeId">বারকোড আইডি</string>
<string name="sameAsCardId">কার্ড আইডির মতো</string>
<string name="setBarcodeId">বারকোড আইডি সেট করুন</string>
<string name="unsupportedBarcodeType">অসমর্থিত বারকোড টাইপ</string>
<string name="wrongValueForBarcodeType">বারকোড টাইপের জন্য ভুল মান</string>
<string name="copy_to_clipboard_multiple_toast">ক্লিপবোর্ড একাধিক টোস্টে অনুলিপি করুন</string>
<string name="intent_import_card_from_url_share_multiple_text">url থেকে ইন্টেন্ট ইম্পোর্ট কার্ড একাধিক টেক্সট শেয়ার করে</string>
<string name="frontImageDescription">সামনের চিত্রের বর্ণনা</string>
<string name="backImageDescription">পিছনের চিত্রের বর্ণনা</string>
<string name="photos">ছবি</string>
<string name="setFrontImage">সদর ছবি স্থাপন</string>
<string name="setBackImage">পিছনের ছবি স্থাপন</string>
<string name="removeImage">ছবি অপসারণ</string>
<string name="takePhoto">ছবি নেত্তয়া</string>
<string name="updateBarcodeQuestionTitle">হালনাগাদ বারকোড প্রশ্ন শিরোনাম</string>
<string name="updateBarcodeQuestionText">হালনাগাদ বারকোড প্রশ্ন টেক্সট </string>
<string name="yes">হাঁ</string>
<string name="no">না</string>
<string name="passwordRequired">পাসওয়ার্ড প্রয়োজন</string>
<string name="failedGeneratingShareURL">শেয়ার ইউআরএল তৈরি করতে ব্যর্থ হয়েছে</string>
<string name="turn_flashlight_on">টর্চলাইট চালু করুন</string>
<string name="turn_flashlight_off">টর্চলাইট বন্ধ করুন</string>
<string name="settings_locale">লোকেল</string>
<string name="settings_system_locale">সিস্টেম লোকেল</string>
<string name="settings_theme_color">থিম রঙ</string>
<string name="settings_catima_theme">কটিমা থিম</string>
<string name="settings_pink_theme">গোলাপী থিম</string>
<string name="settings_magenta_theme">ম্যাজেন্টা থিম</string>
<string name="settings_violet_theme">ভায়োলেট থিম</string>
<string name="settings_blue_theme">নীল থিম</string>
<string name="settings_sky_blue_theme">আকাশী নীল থিম</string>
<string name="settings_green_theme">সবুজ থিম</string>
<string name="settings_brown_theme">বাদামী থিম</string>
<string name="sort">সাজান</string>
<string name="toggleMoreInfo">আরও তথ্য টগল করুন</string>
<string name="swipeToSwitchImages">ছবি পরিবর্তন করতে সোয়াইপ করুন</string>
<string name="sort_by_name">নামের দ্বারা সাজান</string>
<string name="sort_by_most_recently_used">সর্বাধিক সম্প্রতি ব্যবহৃত দ্বারা সাজান</string>
<string name="sort_by_expiry">মেয়াদ শেষ করে সাজান</string>
<string name="reverse">বিপরীত</string>
<string name="sort_by">ক্রমানুসার</string>
<string name="noCardExistsError">কোন কার্ড নেই ত্রুটি</string>
<string name="noStoreError">স্টোরেজ ত্রুটি নেই</string>
<string name="card_ids_copied">কার্ড আইডি কপি করা হয়েছে</string>
<string name="noCardsMessage">কোন কার্ড বার্তা নেই</string>
<string name="addCardTitle">কার্ডের শিরোনাম যোগ করুন</string>
<string name="editCardTitle">কার্ডের শিরোনাম সম্পাদনা করুন</string>
<string name="sendLabel">লেবেল পাঠান</string>
<string name="share">ভাগ</string>
<string name="copy_to_clipboard">নকল করুন ক্লিপবোর্ড এ</string>
<string name="deleteConfirmation">নিশ্চিতকরণ মুছে দিন</string>
<string name="unlockScreen">পর্দা আনলক করুন</string>
<string name="confirm">নিশ্চিত করুন</string>
<string name="delete">মুছে ফেলুন</string>
<string name="edit">সম্পাদনা</string>
</resources>

View File

@@ -46,7 +46,7 @@
<string name="importOptionApplicationExplanation">Beliebige Anwendung oder deinen bevorzugten Dateimanager zur Dateiauswahl verwenden.</string>
<string name="importOptionApplicationButton">Aus anderer Anwendung</string>
<string name="about">Über</string>
<string name="app_license">Freie Software, lizensiert unter der GPLv3+.</string>
<string name="app_license">Freie Software, lizensiert unter der GPLv3+</string>
<string name="about_title_fmt">Über <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revisionsinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
@@ -66,7 +66,7 @@
<string name="settings_theme">Farbschema</string>
<string name="enterBarcodeInstructions">Gib die Kartennummer ein und wähle entweder den Barcode-Typ unten oder wähle \"Diese Karte hat keinen Barcode\" aus.</string>
<string name="app_copyright_old">Basierend auf Loyalty Card Keychain
\nCopyright © 2016-2020 Branden Archer.</string>
\nCopyright © 2016-2020 Branden Archer</string>
<string name="exportOptionExplanation">Die Daten werden an einen Ort deiner Wahl geschrieben.</string>
<string name="failedParsingImportUriError">Die Import-URI konnte nicht verarbeitet werden</string>
<string name="share">Teilen</string>
@@ -117,16 +117,16 @@
<string name="accept">Annehmen</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="importVoucherVaultMessage">Wählen Sie Ihren <i>vouchervault.json</i>-Export aus Voucher Vault zum Importieren aus.
\nOder erstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken.</string>
\nErstellen Sie ihn, indem Sie zuerst auf Export in Voucher Vault drücken.</string>
<string name="importVoucherVault">Aus Voucher Vault importieren</string>
<string name="importLoyaltyCardKeychainMessage">Wählen Sie Ihren <i>LoyaltyCardKeychain.csv</i>-Export aus Loyalty Card Keychain zum Importieren aus.
\nOder erstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken.</string>
\nErstellen Sie ihn über das Menü Import/Export in Loyalty Card Keychain, indem Sie dort zuerst auf Export drücken.</string>
<string name="importLoyaltyCardKeychain">Aus Loyalty Card Keychain importieren</string>
<string name="importFidmeMessage">Wählen Sie Ihren <i>fidme-export-request-xxxxxx.zip</i>-Export aus FidMe zum Importieren aus und wählen Sie anschließend die Strichcodetypen manuell aus.
\nOder erstellen Sie ihn aus Ihrem FidMe-Profil, indem Sie Datenschutz wählen und dann zuerst auf Meine Daten extrahieren drücken.</string>
<string name="importFidme">Aus FidMe importieren</string>
<string name="importCatimaMessage">Wählen Sie Ihren <i>catima.zip</i>-Export aus Catima zum Importieren aus.
\nOder erstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
\nErstellen Sie ihn aus dem Import/Export-Menü einer anderen Catima-Anwendung, indem Sie dort zuerst Export drücken.</string>
<string name="importCatima">Aus Catima importieren</string>
<string name="setBarcodeId">Manuell eingeben</string>
<string name="sameAsCardId">Entspricht Kartennummer</string>
@@ -139,7 +139,7 @@
<string name="wrongValueForBarcodeType">Der Wert ist für den gewählten Barcodetyp leider nicht gültig</string>
<string name="app_resources">Freie Ressourcen von Drittanbietern: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Freie Bibliotheken von Drittanbietern: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Ich möchte diese Karten mit dir teilen</string>
<string name="copy_to_clipboard_multiple_toast">Kartennummern in die Zwischenablage kopiert</string>
<string name="card_ids_copied">Kartennummer(n) kopiert</string>
@@ -156,7 +156,7 @@
<string name="backImageDescription">Bild der Kartenrückseite</string>
<string name="passwordRequired">Bitte gib das Passwort ein</string>
<string name="importStocardMessage">Wählen Sie Ihren <i>***-sync.zip</i>-Export aus Stocard zum Importieren aus.
\nOder Sie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten.</string>
\nSie erhalten ihn, indem Sie eine E-Mail an support@stocardapp.com senden und um einen Export Ihrer Daten bitten.</string>
<string name="importStocard">Von Stocard importieren</string>
<string name="turn_flashlight_off">Licht ausschalten</string>
<string name="turn_flashlight_on">Licht einschalten</string>
@@ -198,4 +198,16 @@
<string name="sort_by_name">Name</string>
<string name="sort">Sortieren</string>
<string name="reverse">Umgekehrt</string>
<string name="version_history">Versionshistorie</string>
<string name="credits">Dank an</string>
<string name="help_translate_this_app">Hilfe bei der Übersetzung</string>
<string name="and_data_usage">und Datennutzung</string>
<string name="rate_this_app">Bewerte die Anwendung</string>
<string name="on_google_play">auf Google Play</string>
<string name="license">Lizenz</string>
<string name="source_repository">Quellcode</string>
<string name="on_github">auf GitHub</string>
<string name="report_error">Fehler melden</string>
<string name="exportPassword">Legen Sie ein Passwort fest, um Ihren Export zu schützen (optional)</string>
<string name="exportPasswordHint">Passwort eingeben</string>
</resources>

View File

@@ -200,12 +200,14 @@
<string name="sort_by_balance">Solde</string>
<string name="report_error">Signaler une erreur</string>
<string name="on_google_play">sur Google Play</string>
<string name="rate_this_app">Notez cette app</string>
<string name="rate_this_app">Notez cette appli</string>
<string name="and_data_usage">utilisation des données</string>
<string name="on_github">sur GitHub</string>
<string name="source_repository">Dépôt source</string>
<string name="license">Licence</string>
<string name="help_translate_this_app">Aidez à traduire cette app</string>
<string name="help_translate_this_app">Aidez à traduire cette appli</string>
<string name="credits">Contributeurs</string>
<string name="version_history">Historique des versions</string>
<string name="exportPassword">Définissez un mot de passe pour protéger vos exportations (facultatif)</string>
<string name="exportPasswordHint">Entrez le mot de passe</string>
</resources>

View File

@@ -47,7 +47,7 @@
<string name="importOptionApplicationExplanation">Usa qualsiasi app o il tuo gestore di file preferito per aprire un file.</string>
<string name="importOptionApplicationButton">Usa unaltra app</string>
<string name="about">Informazioni</string>
<string name="app_license">Software libero con copyleft, licenza GPLv3+.</string>
<string name="app_license">Software libero con copyleft, licenza GPLv3+</string>
<string name="about_title_fmt">Informazioni su <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versione: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Informazioni sulla revisione: <xliff:g id="app_revision_url"> %s </xliff:g></string>
@@ -67,7 +67,7 @@
<string name="exportSuccessful">Dati della carta importati</string>
<string name="importSuccessful">Dati della carta importati</string>
<string name="app_copyright_old">Basato su Loyalty Card Keychain
\ncopyright © 20162020 Branden Archer.</string>
\ncopyright © 20162020 Branden Archer</string>
<string name="exportOptionExplanation">I dati verranno scritti in una posizione a tua scelta.</string>
<string name="barcodeType">Tipo di codice a barre</string>
<string name="unstar">Rimuovi dai preferiti</string>
@@ -116,16 +116,16 @@
\nNESSUN DATO VIENE RACCOLTO, cosa che chiunque può confermare dato che la nostra applicazione è un software libero.</string>
<string name="privacy_policy">Informativa sulla riservatezza</string>
<string name="importVoucherVaultMessage">Seleziona la tua esportazione <i>vouchervault.json</i> da Voucher Vault da importare.
\nOppure crealo premendo prima Esporta in Voucher Vault.</string>
\nCrealo premendo prima Esporta in Voucher Vault.</string>
<string name="importVoucherVault">Importa da Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Seleziona la tua esportazione <i>LoyaltyCardKeychain.csv</i> da Loyalty Card Keychain per importarla.
\nOppure createlo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta.</string>
\nCreatelo dal menù Importazione/Esportazione in Loyalty Card Keychain premendo prima su Esporta.</string>
<string name="importLoyaltyCardKeychain">Importa da Loyalty Card Keychain</string>
<string name="importFidmeMessage">Seleziona la tua esportazione <i>fidme-export-request-xxxxxx.zip</i> da FidMe per importare, e seleziona i tipi di codice a barre manualmente dopo.
\nOppure crearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
\nCrearlo dal tuo profilo FidMe scegliendo Protezione Dati e poi premendo Estrai i miei dati prima.</string>
<string name="importFidme">Importa da FidMe</string>
<string name="importCatimaMessage">Seleziona la tua esportazione <i>catima.zip</i> da Catima per importarla.
\nOppure crealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta.</string>
\nCrealo dal menù Importazione/Esportazione di un\'altra applicazione Catima premendo prima Esporta.</string>
<string name="importCatima">Importa da Catima</string>
<string name="setBarcodeId">Imposta il valore del codice a barre</string>
<string name="sameAsCardId">Uguale all\'ID della carta</string>
@@ -138,7 +138,7 @@
<string name="wrongValueForBarcodeType">Il valore non è valido per il tipo di codice a barre selezionato</string>
<string name="app_resources">Risorse libre di terze parti: <xliff:g id="app_resources_list"> %s </xliff:g></string>
<string name="app_libraries">Librerie libre di terze parti: <xliff:g id="app_libraries_list"> %s </xliff:g></string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="intent_import_card_from_url_share_multiple_text">Voglio condividere alcune carte con te</string>
<string name="copy_to_clipboard_multiple_toast">Numeri delle carte copiati negli appunti</string>
<string name="card_ids_copied">Numero/i della carta copiato/i</string>
@@ -155,7 +155,7 @@
<string name="frontImageDescription">Immagine frontale della carta</string>
<string name="passwordRequired">Si prega di inserire la password</string>
<string name="importStocardMessage">Seleziona la tua esportazione <i>***-sync.zip</i> da Stocard per importare.
\nOppure ottenerlo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati.</string>
\nOttienilo inviando un\'e-mail a support@stocardapp.com chiedendo un\'esportazione dei tuoi dati.</string>
<string name="importStocard">Importa da Stocard</string>
<string name="turn_flashlight_off">Spegni la torcia</string>
<string name="turn_flashlight_on">Accendi la torcia</string>
@@ -198,4 +198,16 @@
<string name="sort_by_most_recently_used">Usate più di recente</string>
<string name="sort_by_name">Nome</string>
<string name="sort">Ordina</string>
<string name="license">Licenza</string>
<string name="source_repository">Repository fonti</string>
<string name="on_github">su GitHub</string>
<string name="exportPasswordHint">Inserisci la password</string>
<string name="on_google_play">su Google Play</string>
<string name="exportPassword">Imposta una password per proteggere la tua esportazione (opzionale)</string>
<string name="version_history">Cronologia delle versioni</string>
<string name="credits">Crediti</string>
<string name="help_translate_this_app">Aiuta a tradurre questa app</string>
<string name="and_data_usage">e utilizzo dei dati</string>
<string name="rate_this_app">Valuta questa applicazione</string>
<string name="report_error">Segnala un errore</string>
</resources>

View File

@@ -25,7 +25,7 @@
<string name="exporting">Eksportuoja…</string>
<string name="noExternalStoragePermissionError">Pirmiausia suteikite išorinės saugyklos leidimą, kad galėtumėte importuoti arba eksportuoti korteles</string>
<string name="about">Apie</string>
<string name="app_license">Copylefted libre programinė įranga, licencijuota GPLv3+.</string>
<string name="app_license">Copylefted libre programinė įranga, licencijuota GPLv3+</string>
<string name="about_title_fmt">Apie <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versija: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Revizijos info: <xliff:g id="app_revision_url">%s</xliff:g></string>
@@ -45,10 +45,10 @@
<string name="action_search">Ieškoti</string>
<string name="cardShortcut">Kortelės sparčioji nuoroda</string>
<string name="importVoucherVaultMessage">Pasirinkite savo <i>vouchervault.json</i> eksportą iš Voucher Vault, kurį norite importuoti.
\nArba sukurkite jį pirmiausia paspausdami Eksportuoti Voucher Vault.</string>
\nSukurkite jį pirmiausia paspausdami Eksportuoti Voucher Vault.</string>
<string name="importVoucherVault">Importuoti iš Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Pasirinkite savo <i> LoyaltyCardKeychain.csv</i> eksportą iš Loyalty Card Keychain, kurį norite importuoti.
\nArba sukurkite jį iš Loyalty Card Keychain meniu Importas/Eksportas, pirmiausia paspausdami Eksportuoti.</string>
\nSukurkite jį iš Loyalty Card Keychain meniu Importavimas/Eksportavimas, pirmiausia paspausdami Eksportuoti.</string>
<string name="importLoyaltyCardKeychain">Importuoti iš Loyalty Card Keychain</string>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="parsingBalanceFailed">Panašu, kad <xliff:g> %s </xliff:g> reikšmė nėra tinkama.</string>
@@ -79,13 +79,13 @@
<string name="sameAsCardId">Tokia pat kaip kortelės ID</string>
<string name="barcodeId">Brūkšninio kodo reikšmė</string>
<string name="importStocardMessage">Pasirinkite <i>***-sync.zip</i> eksportą iš Stocard, kad galėtumėte importuoti.
\nArba gaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string>
\nGaukite susisiekę el. paštu support@stocardapp.com, prašydami eksportuoti jūsų duomenis.</string>
<string name="importStocard">Importuoti iš Stocard</string>
<string name="importFidmeMessage">Pasirinkite <i>fidme-export-request-xxxxxx.zip</i> eksportą iš FidMe, kurį norite importuoti, ir po to brūkšninių kodų tipus pasirinkite rankiniu būdu.
\nArba sukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis.</string>
\nSukurkite jį iš savo FidMe profilio, pasirinkę Duomenų apsauga ir pirmiausia paspaudę Išgauti mano duomenis.</string>
<string name="importFidme">Importuoti iš FidMe</string>
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportą iš Catima.
\nArba sukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia paspausdami Eksportuoti ten.</string>
<string name="importCatimaMessage">Norėdami importuoti, pasirinkite savo <i> catima.zip </i> eksportavimą iš Catima.
\nSukurkite ją iš kitos Catima programos importavimo / eksportavimo meniu, pirmiausia ten paspausdami Eksportuoti.</string>
<string name="importCatima">Importuoti iš Catima</string>
<string name="accept">Priimti</string>
<string name="privacy_policy_popup_text">Privatumo politikos pranešimas (kurio reikalaujama kai kuriose programėlių parduotuvėse):
@@ -145,8 +145,8 @@
<string name="app_resources">Libre trečiųjų šalių ištekliai: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Libre trečiųjų šalių bibliotekos: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_copyright_old">Paremta Loyalty Card Keychain
\nautorinės teisės © 20162020 Branden Archer.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autorinės teisės © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
\nautorinės teisės © 20162020 Branden Archer</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Autorinės teisės © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="importOptionApplicationButton">Naudoti kitą programą</string>
<string name="importOptionApplicationExplanation">Norėdami atidaryti failą, naudokite bet kurią programą arba mėgstamą failų tvarkyklę.</string>
<string name="importOptionApplicationTitle">Naudoti kitą programą</string>
@@ -202,4 +202,14 @@
<string name="sort_by_most_recently_used">Vėliausiai naudota</string>
<string name="sort_by_name">Pavadinimas</string>
<string name="sort">Rikiuoti</string>
<string name="credits">Padėkos</string>
<string name="source_repository">Šaltinio repozitorija</string>
<string name="and_data_usage">ir duomenų naudojimas</string>
<string name="rate_this_app">Įvertinkite šią programėlę</string>
<string name="version_history">Versijų istorija</string>
<string name="license">Licencija</string>
<string name="on_github">GitHub</string>
<string name="on_google_play">Google Play</string>
<string name="help_translate_this_app">Padėkite išversti šią programėlę</string>
<string name="report_error">Pranešti apie klaidą</string>
</resources>

View File

@@ -44,7 +44,7 @@
<string name="importOptionApplicationExplanation">Bruk en hvilken som helst app, eller din favoritt-filutforsker for å åpne en fil.</string>
<string name="importOptionApplicationButton">Bruk en annen app</string>
<string name="about">Om</string>
<string name="app_license">Copyleft fri programvare, lisensiert under GPLv3+.</string>
<string name="app_license">Gemenhetslig fri programvare, lisensiert GPLv3+</string>
<string name="about_title_fmt">Om <xliff:g id="app_name">%s</xliff:g></string>
<string name="debug_version_fmt">Versjon: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Utgivelsesinfo: <xliff:g id="app_revision_url">%s</xliff:g></string>
@@ -64,7 +64,7 @@
<string name="settings_system_theme">System</string>
<string name="settings_theme">Drakt</string>
<string name="app_copyright_old">Basert på Kundekortknippe
\nopphavsrett 20162020 Branden Archer.</string>
\nopphavsrett 20162020 Branden Archer</string>
<string name="failedParsingImportUriError">Kunne ikke tolke importerings-URI</string>
<string name="share">Del</string>
<string name="barcodeNoBarcode">Dette kortet har ingen strekkode</string>
@@ -124,14 +124,14 @@
<string name="setBarcodeId">Sett strekkodeverdi</string>
<string name="sameAsCardId">Samme som kort-ID</string>
<string name="barcodeId">Strekkodeverdi</string>
<string name="importVoucherVaultMessage">Finn en fil som antagelig heter <i>voucher.vault.json</i> å importere.
\nEller opprett den ved å trykke «Eksport» i Voucher Vault først.</string>
<string name="importVoucherVaultMessage">Velg din <i>vouchervault.json</i>-eksport fra Voucher Vault å importere.
\nOpprett den ved å trykke «Eksport» i Voucher Vault først.</string>
<string name="importVoucherVault">Importer fra Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Velg din <i>LoyaltyCardKeychain.csv - </i> eksporter fra kundekort Nøkkelring til import.
\nEller lage det fra Import/Eksport-menyen i lojalitetskort Nøkkelringen ved å trykke Eksport det første.</string>
<string name="importLoyaltyCardKeychainMessage">Velg din <i>LoyaltyCardKeychain.csv</i>-eksport fra Kundekortknippe å importere.
\nOpprett den i «Import/Eksport»-menyen i Kundekortknippe ved å trykke «Eksporter» der først.</string>
<string name="importLoyaltyCardKeychain">Importer fra Kundekortknippe</string>
<string name="importFidmeMessage">Velg din <i>fidme-eksport-be-xxxxxx.zip</i> eksporter fra FidMe til å importere, og velg strekkode typer manuelt etterpå.
\nEller lage den fra FidMe profil ved å velge Beskyttelse av Data og deretter trykke Trekke ut dataene mine første.</string>
<string name="importFidmeMessage">Velg din <i>fidme.export-request-xxxxx.zip</i>-eksport fra FidMe å importere, for så å velge strekkodetypene manuelt etterpå-
\nOpprett den i din FidMe-profil ved å velge «Databeskyttelse», for så å trykke «Pakk ut dataen min» først.</string>
<string name="settings_max_font_size_scale">Maks. skriftstørrelse</string>
<string name="wrongValueForBarcodeType">Verdien er ikke gyldig for valgt strekkodetype</string>
<string name="intent_import_card_from_url_share_multiple_text">Jeg vil dele noen kort med deg</string>
@@ -139,7 +139,7 @@
<string name="app_resources">Frie tredjepartsressurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Frie tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="card_ids_copied">Kopierte kort-ID(er)</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Opphavsrett © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Opphavsrett © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="updateBarcodeQuestionText">Du har endret kortets ID. Ønsker du å også oppdatere strekkoden til samme verdi?</string>
<string name="no">Nei</string>
<string name="yes">Ja</string>
@@ -152,7 +152,7 @@
<string name="backImageDescription">Kortets bakside</string>
<string name="frontImageDescription">Kortets forside</string>
<string name="importStocardMessage">Velg din <i>***-sync.zip</i>-eksport fra Stocard å importere.
\nEller få den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din.</string>
\nSkaff den ved å sende e-post til support@stocardapp.com der du etterspør eksport av dataen din.</string>
<string name="passwordRequired">Skriv inn passordet</string>
<string name="importStocard">Importer fra Stocard</string>
<string name="failedGeneratingShareURL">Klarte ikke å lage delbar nettadresse. Rapporter denne feilen.</string>
@@ -162,8 +162,8 @@
</plurals>
<string name="deleteConfirmation">Slett dette kortet for godt?</string>
<plurals name="deleteCardsConfirmation">
<item quantity="one">Slett dette kortet for godt?</item>
<item quantity="other">Slett disse <xliff:g xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">%s</xliff:g> kortene for godt?</item>
<item quantity="one">Slett dette kortet for godt\?</item>
<item quantity="other">Slett disse <xliff:g>%d</xliff:g> kortene for godt\?</item>
</plurals>
<string name="turn_flashlight_on">Skru på lommelykten</string>
<string name="turn_flashlight_off">Skru av lommelykten</string>
@@ -199,11 +199,15 @@
<string name="help_translate_this_app">Hjelp med å oversette denne appen</string>
<string name="license">Lisens</string>
<string name="version_history">Versjonshistorikk</string>
<string name="importCatimaMessage">Velg din <i>catima.zip</i> fra Catima å importere. Eller lag den fra Importer/Eksporter-menyen i en annen Catima-app ved å trykke på \"Eksporter\" der først</string>
<string name="importCatimaMessage">Velg din <i>catima.zip</i>-eksport fra Catima å importere.
\nOpprett den fra «Importer/Eksporter»-menyen i en annen Catima-app ved å trykke på «Eksporter» der først</string>
<string name="source_repository">Kildekode</string>
<string name="on_github">på GitHub</string>
<string name="and_data_usage">og bruk av data</string>
<string name="rate_this_app">Vurder denne appen</string>
<string name="on_google_play">på Google Play</string>
<string name="report_error">Rapporter feil</string>
</resources>
<string name="credits">Bidragsytere</string>
<string name="exportPassword">Sett et passord for å beskytte eksporten din (valgfritt)</string>
<string name="exportPasswordHint">Skriv inn passord</string>
</resources>

View File

@@ -116,15 +116,15 @@
<string name="privacy_policy">Privacybeleid</string>
<string name="accept">Accepteren</string>
<string name="importVoucherVaultMessage">Kies het te importeren <i>vouchervault.json</i>-exportbestand.
\nOf ga naar het exportmenu van Voucher Vault om een exportbestand samen te stellen.</string>
\nGa naar het exportmenu van Voucher Vault om een exportbestand samen te stellen.</string>
<string name="importVoucherVault">Importeren uit Voucher Vault</string>
<string name="importLoyaltyCardKeychainMessage">Kies het te importeren genaamd <i>LoyaltyCardKeychain.csv</i>-exportbestand.
\nOf ga naar het import-/exportmenu van Klantenkaartkluis om een exportbestand samen te stellen.</string>
\nGa naar het import-/exportmenu van Klantenkaartkluis om een exportbestand samen te stellen.</string>
<string name="importLoyaltyCardKeychain">Importeren uit Klantenkaartkluis</string>
<string name="importFidmeMessage">Kies het te importeren <i>fidme-export-request-xxxxxx.zip</i>-exportbestand en kies nadien de juiste barcodes.
\nOf ga naar je FidMe-profiel en druk op Gegevensbescherming om een exportbestand samen te stellen.</string>
\nGa naar je FidMe-profiel en druk op Gegevensbescherming om een exportbestand samen te stellen.</string>
<string name="importCatimaMessage">Kies het te importeren <i>Catima.zip</i>-exportbestand.
\nOf ga naar het import-/exportmenu van Catima op een ander apparaat om een exportbestand samen te stellen.</string>
\nGa naar het import-/exportmenu van Catima op een ander apparaat om een exportbestand samen te stellen.</string>
<string name="importFidme">Importeren uit FidMe</string>
<string name="importCatima">Importeren uit Catima</string>
<string name="errorReadingImage">De afbeelding kan niet worden uitgelezen</string>
@@ -155,7 +155,7 @@
<string name="frontImageDescription">Voorzijde van de kaart</string>
<string name="passwordRequired">Voer het wachtwoord in</string>
<string name="importStocardMessage">Kies het te importeren Stocard-exportbestand genaamd <i>***-sync.zip</i>.
\nOf stuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand.</string>
\nStuur een e-mail naar support@stocardapp.com waarin je vraagt om een exportbestand.</string>
<string name="importStocard">Importeren uit Stocard</string>
<string name="failedGeneratingShareURL">De te delen link kan niet worden gegenereerd. Meld deze fout.</string>
<string name="turn_flashlight_off">Zaklamp uitzetten</string>
@@ -208,4 +208,6 @@
<string name="help_translate_this_app">Help deze app te vertalen</string>
<string name="credits">Met dank aan</string>
<string name="version_history">Versiegeschiedenis</string>
</resources>
<string name="exportPasswordHint">Voer een wachtwoord in</string>
<string name="exportPassword">Stel een wachtwoord in om je exportbestand te beveiligen (optioneel)</string>
</resources>

View File

@@ -54,7 +54,7 @@
<string name="debug_version_fmt">Версия: <xliff:g id="version">%s</xliff:g></string>
<string name="app_revision_fmt">Информация о версиях: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="selectBarcodeTitle">Выбор штрих-кода</string>
<string name="enterBarcodeInstructions">Введите номер карты и выберите тип штрих-кода. Или выберите \"Эта карта без штрих-кода\".</string>
<string name="enterBarcodeInstructions">Введите номер карты и выберите тип штрих-кодали выберите \"Эта карта без штрих-кода\").</string>
<string name="copy_to_clipboard_toast">Номер карты скопирован в буфер обмена</string>
<string name="thumbnailDescription">Логотип карты</string>
<string name="settings">Настройки</string>
@@ -216,4 +216,6 @@
<string name="source_repository">Исходный код</string>
<string name="license">Лицензия</string>
<string name="help_translate_this_app">Помощь в переводе приложения</string>
<string name="exportPassword">Защитить файл экспорта паролем (необязательно)</string>
<string name="exportPasswordHint">Введите пароль</string>
</resources>

View File

@@ -25,7 +25,7 @@
<string name="noCardExistsError">Te kartice zvestobe ni bilo moč najti</string>
<string name="importExport">Uvozi/izvozi</string>
<string name="exportName">Izvozi</string>
<string name="importExportHelp">Varnostna kopija omogoča varen prenos kartic na druge telefonske naprave.</string>
<string name="importExportHelp">Varnostna kopija omogoča varen prenos kartic na druge naprave.</string>
<string name="importSuccessfulTitle">Uvoz je bil uspešen</string>
<string name="importFailedTitle">Uvoz ni uspel</string>
<string name="importFailed">Napaka pri uvozu</string>
@@ -39,7 +39,7 @@
<string name="importOptionFilesystemExplanation">Izberite specifično datoteko iz datotečnega sistema.</string>
<string name="importOptionFilesystemButton">Iz datotečnega sistema</string>
<string name="importOptionApplicationTitle">Uporabi zunanjo aplikacijo</string>
<string name="importOptionApplicationExplanation">Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteko.</string>
<string name="importOptionApplicationExplanation">Uporabi zunanjo aplikacijo, kot npr. Dropbox, Google Drive ali ostale upravljalnike datotek, za odpiranje datoteke.</string>
<string name="importOptionApplicationButton">Uporabi zunanjo aplikacijo</string>
<string name="about">Več o aplikaciji</string>
<string name="app_license">Licencirano s skladu z GPLv3.</string>
@@ -57,7 +57,7 @@
<string name="deleteConfirmation">Prosim potrdite, če želite izbrisati to kartico\?</string>
<string name="card">Kartica</string>
<string name="addFromImage">Izberite sliko iz galerije</string>
<string name="addManually">Ročno vnesite ID kartice</string>
<string name="addManually">Ročno vnesite št. kartice</string>
<string name="leaveWithoutSaveConfirmation">Zapustite brez shranjevanja\?</string>
<string name="leaveWithoutSaveTitle">Izhod</string>
<string name="moveDown">Premikanje navzdol</string>
@@ -71,18 +71,17 @@
<string name="enter_group_name">Vnesite ime skupine</string>
<string name="exportSuccessful">Izvoženi podatki o karticah</string>
<string name="importSuccessful">Uvoženi podatki o karticah</string>
<string name="intent_import_card_from_url_share_text">Želim z vami deliti kartico</string>
<string name="intent_import_card_from_url_share_text">Z vami želim deliti kartico</string>
<string name="settings_disable_lockscreen_while_viewing_card">Preprečitev zaklepanja zaslona</string>
<string name="settings_keep_screen_on">Ohranite zaslon vklopljen</string>
<string name="enterBarcodeInstructions">Vnesite ID kartice in spodaj izberite vrsto črtne kode ali \"Ta kartica nima črtne kode\".</string>
<string name="settings_max_font_size_scale">Največja velikost pisave</string>
<string name="settings_dark_theme">Temno</string>
<string name="settings_light_theme">Luč</string>
<string name="settings_light_theme">Svetlo</string>
<string name="settings_system_theme">Sistem</string>
<string name="settings_theme">Tema</string>
<string name="starImage">Najljubša zvezda</string>
<string name="app_copyright_old">Na podlagi kartice zvestobe obesek za ključe
\ncopyright © 2016-2020 Branden Archer.</string>
<string name="starImage">Zvezdica za priljubljene</string>
<string name="app_copyright_old">Na podlagi aplikacije Loyalty Card Keychain copyright © 2016-2020 Branden Archer.</string>
<string name="exportOptionExplanation">Podatki bodo zapisani na izbrano mesto.</string>
<string name="failedParsingImportUriError">Ni bilo mogoče razčleniti URI uvoza</string>
<string name="card_ids_copied">Kopirana kartica ID(s)</string>
@@ -94,4 +93,72 @@
<string name="barcodeType">Vrsta črtne kode</string>
<string name="noMatchingGiftCards">Ničesar nisem našel. Poskusite spremeniti iskanje.</string>
<string name="action_search">Iskanje</string>
<string name="exportPasswordHint">Vnesite geslo</string>
<string name="exportPassword">Izberite geslo za zaščito izvoza (neobvezno)</string>
<string name="help_translate_this_app">Pomagajte pri prevajanju aplikacije</string>
<string name="version_history">Zgodovina različic</string>
<string name="settings_brown_theme">Rjava</string>
<string name="settings_grey_theme">Siva</string>
<string name="settings_green_theme">Zelena</string>
<string name="settings_sky_blue_theme">Sinje modra</string>
<string name="settings_blue_theme">Modra</string>
<string name="settings_violet_theme">Vijolična</string>
<string name="settings_magenta_theme">Magenta</string>
<string name="settings_pink_theme">Roza</string>
<string name="settings_theme_color">Barva teme</string>
<string name="settings_system_locale">Sistem</string>
<string name="settings_locale">Jezik</string>
<string name="barcodeImageDescriptionWithType">Slika črtne kode tipa <xliff:g>%s</xliff:g></string>
<string name="swipeToSwitchImages">Povlecite ali dolgo pritisnite da zamenjate slike</string>
<string name="sort_by">Razvrsti po</string>
<string name="reverse">Obratno</string>
<string name="sort_by_balance">Stanje</string>
<string name="sort_by_expiry">Potek</string>
<string name="sort_by_most_recently_used">Nazadnje uporabljene</string>
<string name="sort_by_name">Ime</string>
<string name="sort">Razvrsti</string>
<string name="license">Licence</string>
<string name="on_github">na GitHubu</string>
<string name="rate_this_app">Ocenite aplikacijo</string>
<string name="report_error">Prijavite napako</string>
<string name="on_google_play">na Trgovini Google Play</string>
<string name="and_data_usage">in uporaba podatkov</string>
<string name="source_repository">Izvorna koda</string>
<string name="points">Točke</string>
<string name="currency">Valuta</string>
<string name="balance">Stanje na računu</string>
<string name="errorReadingImage">Slike ni bilo mogoče prebrati</string>
<string name="noBarcodeFound">Črtna koda ni bila najdena</string>
<string name="balancePoints"><xliff:g>%s</xliff:g> točk</string>
<string name="balanceSentence">Stanje: <xliff:g>%s</xliff:g></string>
<string name="chooseImportType">Uvoz iz?</string>
<string name="importCatima">Izvoz iz aplikacije Catima</string>
<string name="importStocard">Izvoz iz aplikacije Stocard</string>
<string name="importVoucherVault">Izvoz iz aplikacije Voucher Vault</string>
<string name="privacy_policy">Politika zasebnosti</string>
<string name="turn_flashlight_off">Izklop svetilke</string>
<string name="turn_flashlight_on">Vklop svetilke</string>
<string name="passwordRequired">Vnesite geslo</string>
<string name="accept">Sprejmi</string>
<string name="importLoyaltyCardKeychain">Uvoz iz aplikacije Loyalty Card Keychain</string>
<string name="barcodeId">Vsebina črtne kode</string>
<string name="sameAsCardId">Enaka kot številka kartice</string>
<string name="setBarcodeId">Nastavi vsebino črtne kode</string>
<string name="wrongValueForBarcodeType">Ta vrednost ni veljavna pri izbranem tipu čtne kode</string>
<string name="takePhoto">Naredi fotografijo</string>
<string name="intent_import_card_from_url_share_multiple_text">Z vami želim deliti kartice zvestobe</string>
<string name="copy_to_clipboard_multiple_toast">Številke kartic kopirane v odložišče</string>
<string name="importFidme">Uvoz iz aplikacije FidMe</string>
<string name="no">Ne</string>
<string name="yes">Da</string>
<string name="frontImageDescription">Slika sprednje strani</string>
<string name="backImageDescription">Slika zadnje strani</string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> ni veljavno stanje.</string>
<string name="setBackImage">Nastavi sliko sprednje strani</string>
<string name="setFrontImage">Nastavi sliko sprednje strani</string>
<string name="photos">Fotografije</string>
<string name="updateBarcodeQuestionText">Spremenili ste številko kartice. Želite posodobiti tudi črtno kodo na enako vrednost?</string>
<string name="updateBarcodeQuestionTitle">Posodobi črtno kodo?</string>
<string name="removeImage">Odstrani sliko</string>
<string name="unsupportedBarcodeType">Te vrste črtne kode aplikacija ne more prikazati. Morda bo to možno v prihodnosti.</string>
</resources>

View File

@@ -5,8 +5,8 @@
<string name="settings_max_font_size_scale">Max. teckenstorlek</string>
<string name="settings_keep_screen_on">Håll skärmen påslagen</string>
<string name="enterBarcodeInstructions">Ange kortets ID och välj antingen streckkodstyp nedan, eller \"Detta kort har ingen streckkod\".</string>
<string name="importFidmeMessage">Välj den exporterade <i>fidme-export-request-xxxxxx.zip</i> från FidMe som du vill importera och välj streckkodstyper manuellt efteråt,
\neller skapa en från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\".</string>
<string name="importFidmeMessage">Välj den exporterade <i>fidme-export-request-xxxxxx.zip</i> från FidMe som du vill importera och välj streckkodstyper manuellt efteråt.
\nSkapa den från din FidMe-profil först genom att välja \"Data Protection\" och sen trycka på \"Extract my data\".</string>
<string name="importOptionApplicationExplanation">Använd vilken app som helst eller den filhanterare du föredrar för att öppna en fil.</string>
<string name="importOptionApplicationButton">Använd en annan app</string>
<string name="intent_import_card_from_url_share_text">Jag vill dela ett kort med dig</string>
@@ -21,12 +21,12 @@
<item quantity="other"><xliff:g>%d</xliff:g> kort valda</item>
</plurals>
<string name="app_loyalty_card_keychain">Loyalty Card Keychain</string>
<string name="importLoyaltyCardKeychainMessage">Välj den exporterade <i>LoyaltyCardKeychain.csv</i> från Loyalty Card Keychain som du vill importera,
\neller skapa en från Import/Export-menyn i Loyalty Card Keychain först genom att trycka på Exportera.</string>
<string name="importVoucherVaultMessage">Välj den exporterade <i>vouchervault.json</i> från Voucher Vault som du vill importera,
\neller skapa en först genom att trycka på Exportera i Voucher Vault.</string>
<string name="importStocardMessage">Välj den exporterade <i>***-sync.zip</i> från Stocard som du vill importera,
\neller skaffa en först genom att skicka e-post till support@stocardapp.com och be om att få dina data exporterade.</string>
<string name="importLoyaltyCardKeychainMessage">Välj den exporterade <i>LoyaltyCardKeychain.csv</i> från Loyalty Card Keychain som du vill importera.
\nSkapa den från Import/Export-menyn i Loyalty Card Keychain först genom att trycka på Exportera.</string>
<string name="importVoucherVaultMessage">Välj den exporterade <i>vouchervault.json</i> från Voucher Vault som du vill importera.
\nSkapa den först genom att trycka på Exportera i Voucher Vault.</string>
<string name="importStocardMessage">Välj den exporterade <i>***-sync.zip</i> från Stocard som du vill importera.
\nSkaffa den först genom att skicka e-post till support@stocardapp.com och be om att få dina data exporterade.</string>
<string name="enter_group_name">Ange gruppnamn</string>
<string name="groups">Grupper</string>
<plurals name="groupCardCount">
@@ -90,8 +90,8 @@
<string name="debug_version_fmt">Version: <xliff:g id="version">%s</xliff:g></string>
<string name="about_title_fmt">Om <xliff:g id="app_name">%s</xliff:g></string>
<string name="app_copyright_old">Baserad på Loyalty Card Keychain
\ncopyright © 20162020 Branden Archer.</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os.</string>
\ncopyright © 20162020 Branden Archer</string>
<string name="app_copyright_fmt" tools:ignore="PluralsCandidate">Copyright © 2019<xliff:g>%d</xliff:g> Sylvia van Os</string>
<string name="about">Om</string>
<string name="importOptionApplicationTitle">Använd en annan app</string>
<string name="importOptionFilesystemButton">Från filsystemet</string>
@@ -158,7 +158,7 @@
<string name="chooseExpiryDate">Välj förfallodatum</string>
<string name="expiryDate">Förfallodatum</string>
<string name="starImage">Favoritstjärna</string>
<string name="app_license">Copyleftad fri programvara, under GPLv3+-licens.</string>
<string name="app_license">Copyleftad fri programvara, under GPLv3+-licens</string>
<string name="app_resources">Fria tredjepartsresurser: <xliff:g id="app_resources_list">%s</xliff:g></string>
<string name="app_libraries">Fria tredjepartsbibliotek: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="parsingBalanceFailed"><xliff:g>%s</xliff:g> verkar inte vara ett giltigt saldo.</string>
@@ -166,8 +166,8 @@
<string name="balanceSentence">Saldo: <xliff:g>%s</xliff:g></string>
<string name="settings_disable_lockscreen_while_viewing_card">Förhindra skärmlåsning</string>
<string name="lockScreen">Förhindra rotation</string>
<string name="importCatimaMessage">Välj den exporterade <i>catima.zip</i> från Catima som du vill importera,
\neller skapa en från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först.</string>
<string name="importCatimaMessage">Välj den exporterade <i>catima.zip</i> från Catima som du vill importera.
\nSkapa den från Import/Export-menyn i en annan Catima-app genom att trycka på Exportera där först.</string>
<string name="expiryStateSentence">Giltigt till: <xliff:g>%s</xliff:g></string>
<string name="exportSuccessful">Kortdata exporterad</string>
<string name="importSuccessful">Kortdata importerad</string>
@@ -198,4 +198,12 @@
<string name="sort_by_most_recently_used">Senast använda</string>
<string name="sort_by_name">Namn</string>
<string name="sort">Sortera</string>
<string name="license">Licens</string>
<string name="and_data_usage">och dataanvändning</string>
<string name="rate_this_app">Betygsätt den här appen</string>
<string name="on_google_play">på Google Play</string>
<string name="report_error">Rapportera ett fel</string>
<string name="version_history">Versionshistorik</string>
<string name="help_translate_this_app">Hjälp till med översättningen av appen</string>
<string name="on_github">på GitHub</string>
</resources>

View File

@@ -208,4 +208,6 @@
<string name="help_translate_this_app">Bu uygulamayı çevirmeye yardımcı olun</string>
<string name="credits">Emeği Geçenler</string>
<string name="version_history">Sürüm Geçmişi</string>
<string name="exportPassword">Dışa aktarmanızı korumak için bir parola belirleyin (isteğe bağlı)</string>
<string name="exportPasswordHint">Parola girin</string>
</resources>

View File

@@ -196,6 +196,8 @@
<string name="yes">Yes</string>
<string name="no">No</string>
<string name="passwordRequired">Please enter the password</string>
<string name="exportPassword">Set a password to protect your export (optional)</string>
<string name="exportPasswordHint">Enter password</string>
<string name="failedGeneratingShareURL">Could not generate sharable URL. Please report this.</string>
<string name="turn_flashlight_on">Turn flashlight on</string>
<string name="turn_flashlight_off">Turn flashlight off</string>
@@ -243,4 +245,4 @@
<string name="rate_this_app">Rate this app</string>
<string name="on_google_play">on Google Play</string>
<string name="report_error">Report Error</string>
</resources>
</resources>

View File

@@ -334,7 +334,7 @@ public class ImportExportTest
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -354,6 +354,39 @@ public class ImportExportTest
TestHelpers.getEmptyDb(activity);
}
public void multipleCardsExportImportPasswordProtected() throws IOException
{
final int NUM_CARDS = 10;
List<char[]> passwords = Arrays.asList(null, "123456789".toCharArray());
for(char[] password : passwords){
addLoyaltyCards(NUM_CARDS);
ByteArrayOutputStream outData = new ByteArrayOutputStream();
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,password);
assertEquals(ImportExportResult.Success, result);
outStream.close();
TestHelpers.getEmptyDb(activity);
ByteArrayInputStream inData = new ByteArrayInputStream(outData.toByteArray());
// Import the CSV data
result = MultiFormatImporter.importData(activity.getApplicationContext(), db, inData, DataFormat.Catima, password);
assertEquals(ImportExportResult.Success, result);
assertEquals(NUM_CARDS, db.getLoyaltyCardCount());
checkLoyaltyCards();
// Clear the database for the next format under test
TestHelpers.getEmptyDb(activity);
}
}
@Test
public void multipleCardsExportImportSomeStarred() throws IOException
{
@@ -365,7 +398,7 @@ public class ImportExportTest
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -438,7 +471,7 @@ public class ImportExportTest
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -482,7 +515,7 @@ public class ImportExportTest
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export into CSV data
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null);
assertEquals(ImportExportResult.Success, result);
outStream.close();
@@ -513,7 +546,7 @@ public class ImportExportTest
OutputStreamWriter outStream = new OutputStreamWriter(outData);
// Export data to CSV format
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima);
ImportExportResult result = MultiFormatExporter.exportData(activity.getApplicationContext(), db, outData, DataFormat.Catima,null);
assertEquals(ImportExportResult.Success, result);
TestHelpers.getEmptyDb(activity);
@@ -560,8 +593,9 @@ public class ImportExportTest
TestTaskCompleteListener listener = new TestTaskCompleteListener();
// Export to the file
final String password = "123456789";
FileOutputStream fileOutputStream = new FileOutputStream(exportFile);
ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream, listener);
ImportExportTask task = new ImportExportTask(activity, DataFormat.Catima, fileOutputStream,password.toCharArray(), listener);
task.execute();
// Actually run the task to completion
@@ -579,7 +613,7 @@ public class ImportExportTest
FileInputStream fileStream = new FileInputStream(exportFile);
task = new ImportExportTask(activity, DataFormat.Catima, fileStream, null, listener);
task = new ImportExportTask(activity, DataFormat.Catima, fileStream, password.toCharArray(), listener);
task.execute();
// Actually run the task to completion
@@ -901,7 +935,7 @@ public class ImportExportTest
// Export everything
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima);
MultiFormatExporter.exportData(activity.getApplicationContext(), db, outputStream, DataFormat.Catima,null);
// Wipe database
TestHelpers.getEmptyDb(activity);

2
bors.toml Normal file
View File

@@ -0,0 +1,2 @@
status = [ 'build' ]
delete_merged_branches = true

View File

@@ -9,8 +9,8 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.2'
classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.0'
classpath 'com.android.tools.build:gradle:7.0.3'
classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

View File

@@ -4,6 +4,7 @@ Copylefted libre software (GPLv3+) card management app.
[![GitHub Version](https://img.shields.io/github/v/release/TheLastProject/Catima.svg?logo=github&label=GitHub)](https://github.com/TheLastProject/Catima/releases)
[![F-Droid Version](https://img.shields.io/f-droid/v/me.hackerchick.catima.svg?logo=f-droid&label=F-Droid)](https://f-droid.org/packages/me.hackerchick.catima/)
[![IzzyOnDroid Version](https://img.shields.io/endpoint?url=https://apt.izzysoft.de/fdroid/api/v1/shield/me.hackerchick.catima)](https://apt.izzysoft.de/fdroid/index/apk/me.hackerchick.catima)
[![Google Play Store Version](https://img.shields.io/endpoint?color=blue&logo=google-play&url=https%3A%2F%2Fplayshields.herokuapp.com%2Fplay%3Fi%3Dme.hackerchick.catima%26l%3DGoogle%2520Play%26m%3D%24version)](https://play.google.com/store/apps/details?id=me.hackerchick.catima)
![Android CI](https://github.com/TheLastProject/Catima/workflows/Android%20CI/badge.svg)

View File

@@ -0,0 +1 @@
- Подобрено е търсенето, съдържащо знак за интервал

View File

@@ -0,0 +1 @@
- Zlepšení vyhledávání obsahující mezery

View File

@@ -0,0 +1 @@
- Oprava regrese narušující import/export

View File

@@ -0,0 +1 @@
- Oprava nesprávné migrace, která způsobila, že první karta se stala neviditelnou

View File

@@ -0,0 +1 @@
- Improve search with spaces

View File

@@ -0,0 +1 @@
- Fix regression breaking import/export

View File

@@ -0,0 +1 @@
- Fix incorrect migration making first card become invisible

View File

@@ -0,0 +1,3 @@
- Fix swiping between groups not working on an empty group
- Allow password-protecting exports
- Improve usage of space for QR codes

View File

@@ -1 +1 @@
Catima — Den Open Source kortlommen
Catima — for kundekort, billetter og kuponger 🎴

View File

@@ -20,4 +20,3 @@ Med detta essentiella verktyg kan du ersätta värdelös plast med kontanter.
Förenkla ditt liv och din shopping, och förlora aldrig ett papperskvitto, presentkort eller flygbiljett igen.
Ta alla dina belöningar och bonusar med dig, och spara nya efter hand.

View File

@@ -1 +1 @@
Catima — Den Open Source kortplånboken
Catima — Kortplånboken med öppen källkod

View File

@@ -0,0 +1 @@
- Boşluklu aramaları iyileştir

View File

@@ -0,0 +1 @@
- İçe/dışa aktarmayı bozan sorun düzeltildi

View File

@@ -0,0 +1 @@
- İlk kartın görünmez hale gelmesine neden olan yanlış taşıma düzeltildi

View File

@@ -0,0 +1,2 @@
- Gruplar arasında kaydırmanın boş bir grup üzerinde çalışmaması düzeltildi
- Parola korumalı dışa aktarmalara izin ver