Compare commits

..
198 Commits
Author SHA1 Message Date
Markus Fisch 0a11611b8f Advance version number to 1.63.11 2024-09-21 20:20:24 +02:00
Markus Fisch 249e310e43 Simplify asking for a size when sharing/exporting 2024-09-20 12:10:06 +02:00
Sergiy StuparandGitHub 6279c5731a Update Ukrainian translation 2024-09-20 12:09:46 +02:00
bovirusandGitHub df98637951 Update Italian language 2024-09-18 12:09:08 +02:00
solokotandGitHub 08b3558e46 Update Russian translation 2024-09-18 12:08:45 +02:00
Markus Fisch 648ef6fdf8 Update Kotlin coroutines library 2024-09-17 22:38:04 +02:00
Markus Fisch 807f075a51 Update Kotlin version 2024-09-17 22:37:08 +02:00
Markus Fisch 27789beeed Simplify ellipsis regex 2024-09-17 22:31:42 +02:00
Markus Fisch 97bee27827 Replace View casts for generic denotation 2024-09-17 22:29:02 +02:00
Markus Fisch 3fee49301e Only ask for barcode size when exporting/sharing
Because this parameter is just relevant when exporting/sharing
a raster image format.
2024-09-17 22:28:37 +02:00
Markus Fisch 8a6073291b Improve size slider for barcode generation
Reduce size options to popular powers of two.

And add the option to generate a barcode in the smallest
possible size of one pixel per module.
2024-09-17 20:54:07 +02:00
Markus Fisch 47151de4a4 Fix indent in Portuguese (Brazil) translation 2024-09-06 16:19:41 +02:00
Too Late (bot)andGitHub 248c4edca1 Update Portuguese (Brazil) translation 2024-09-06 16:18:21 +02:00
Markus Fisch 2c7386d536 Fix indent in Chinese translation 2024-08-17 18:12:32 +02:00
Too Late (bot)andGitHub e19cad4c87 Update Chinese translation 2024-08-17 18:09:47 +02:00
ZahnstocherandGitHub 585e0f3372 Update parcel tracking URL 2024-07-25 12:04:37 +02:00
Markus Fisch 2b7f611774 Fix showing tooltip on action FAB 2024-07-24 20:21:50 +02:00
Markus Fisch 05b2a0d9c9 Support hyphens in the second level domain
To correctly recognize URLs as WebAction.
2024-07-24 20:08:57 +02:00
Markus Fisch e7287eb088 Update tools version and gradle wrapper 2024-07-24 19:41:43 +02:00
NathanandGitHub 4b45ad3fe7 Update French translation
Added translations for checksum calculation (1.63.8) and screen brightening (1.63.10) features.
2024-07-13 19:58:04 +02:00
Markus Fisch 449d8fdbbd Advance version number to 1.63.10 2024-06-30 19:41:13 +02:00
Markus Fisch f44cff9912 Use type in getParcelableExtra() on Tiramisu+
And ignore the deprecation warning for earlier Android versions.

Also use a scope function to remove the local variable in the
parent context.
2024-06-30 19:06:02 +02:00
ThetaDevandGitHub 24730dfde3 Allow file input from share menu
Updates the handleSendText method to support both types of intents.

Also extends the accepted file types to text/* to also accept VCards
and other text-based files.
2024-06-30 18:54:20 +02:00
Sergiy StuparandGitHub be6539d41f Update Ukrainian translation 2024-06-16 13:41:14 +02:00
bovirusandGitHub 60dd40554e Update Italian language 2024-06-12 09:05:24 +02:00
solokotandGitHub 837119b6ec Update Russian translation 2024-06-12 09:04:57 +02:00
Markus Fisch abe11b82e5 Fix indent in Polish translation 2024-07-11 12:49:33 +02:00
Markus Fisch 4fc1e36d04 Add a menu item to toggle screen brightness
So this setting can be enabled/disabled where it's required, too.
2024-06-11 14:22:22 +02:00
Markus Fisch 54aa15e1be Set maximum brightness when showing a barcode
To make scanning from screen easier.
2024-06-11 14:22:18 +02:00
Too Late (bot)andGitHub 876d8fc7b3 Update Polish translation 2024-06-10 20:31:07 +02:00
Markus Fisch 7bdcdaaa5d Advance version number to 1.63.9 2024-06-02 18:15:53 +02:00
Markus Fisch fd44728e89 Ignore "URL:" before URLs in barcode content
Apparently some people think it's necessary to add an "URL:" prefix
before an actual URL, so let's cut that rubbish.
2024-06-02 15:24:22 +02:00
Markus Fisch 8242520a0b Export/share generated barcode as JPG
On request.

Generally, using a lossless format like PNG makes more sense.
2024-06-02 14:00:27 +02:00
Markus Fisch 2e7e9a942b Fix indent in new translations 2024-06-02 13:51:43 +02:00
Too Late (bot)andGitHub dcc9d5b3ff Update Brazilian translation 2024-06-02 11:54:14 +02:00
Markus Fisch 607aab854c Update build tools 2024-05-27 19:39:46 +02:00
Markus Fisch cc2b2f076b Fix exporting/sharing multiple history items
By their ID.

`?` is only one argument so a list of numbers becomes just one ID,
which cannot work, of course.
2024-05-27 19:37:43 +02:00
Too Late (bot)andGitHub 90e9723de5 Update Chinese translation 2024-05-13 10:38:54 +02:00
Sergiy StuparandGitHub ab6787e60b Update Ukrainian translation 2024-05-12 10:40:14 +02:00
solokotandGitHub 698686a45a Update Russian translation 2024-05-11 15:35:51 +02:00
Markus Fisch 95bdaa1252 Reformat imports with Android Studio
Seems like wildcard imports are back in fashion.
2024-05-11 14:13:39 +02:00
Markus Fisch f0c02e5156 Reformat with Android Studio 2024-05-11 14:13:20 +02:00
Markus Fisch a8c50308d0 Add Ko-fi for donations 2024-05-11 13:20:31 +02:00
bovirusandGitHub 6b359d4c65 Update Italian language 2024-05-10 21:08:07 +02:00
Markus Fisch 863caed387 Advance version number to 1.63.8 2024-05-10 20:56:25 +02:00
Markus Fisch e4f17b9bdf Add an option to show a checksum
For the decoded content. On request of #452.
2024-05-10 20:37:32 +02:00
Markus Fisch c2071d8d81 Treat LF/CR/Tab as printable characters
When encoding "something\nlike\tthüs". This string should be encoded
as text rather than binary, of course.
2024-05-08 19:49:19 +02:00
Markus Fisch 4758c2d337 Update tools and gradle wrapper 2024-05-07 21:57:36 +02:00
Markus Fisch 91336fe15c Encode as ByteArray if text contains non-printable
To support escape sequences containing non-printable characters.
2024-05-07 21:54:57 +02:00
Markus Fisch 2c437f3771 Add Liberapay to README 2024-04-27 15:58:37 +02:00
bovirusandGitHub cb082b20fe Update Italian language 2024-04-21 21:27:57 +02:00
Markus Fisch bce3630686 Advance version number to 1.63.7 2024-04-17 21:48:31 +02:00
Markus Fisch 4feb4d066c Update ZXingCpp for Aztec Runes 2024-04-17 21:24:30 +02:00
Markus Fisch e7d84cd916 Update tools version 2024-04-17 21:22:53 +02:00
Giovanni DonisiandGitHub 84e2917694 Update Italian translation 2024-04-14 13:58:07 +02:00
Markus Fisch b87464ec40 Advance version number to 1.63.6 2024-04-13 14:38:27 +02:00
Markus Fisch 269e0f41a6 Correct spelling mistakes in Spanish translation
Following the recommendations from the linter.
2024-04-13 14:32:27 +02:00
NathanandGitHub aefbc4a296 Update French translation 2024-04-13 14:26:19 +02:00
Sergiy StuparandGitHub c64984dc6a Update Ukrainian translation 2024-03-31 12:49:47 +02:00
Markus Fisch 24c7ad0ba4 Return Codabar start/stop codes
As requested in #445.

The start/stop codes determine if a barcode is complete or if there
is a continuation code to scan.
2024-03-30 12:46:15 +01:00
Markus Fisch 643a935852 Move buildConfig from properties into build.gradle
Apparently setting 'android.defaults.buildfeatures.buildconfig=true'
is deprecated and will be removed in version 9.0 of the Android Gradle
plugin.
2024-03-30 12:46:15 +01:00
solokotandGitHub 4fcb836b53 Update Russian translation 2024-03-26 12:12:30 +01:00
Markus Fisch 48ed5f1a2c Add history shortcut 2024-03-25 21:36:53 +01:00
Markus Fisch 3aa2371eeb Advance version number to 1.63.5 2024-03-24 21:15:31 +01:00
solokotandGitHub 88f92943c0 Update Russian translation 2024-03-24 14:53:36 +01:00
Sergiy StuparandGitHub 39710d4ab9 Update Ukrainian translation 2024-03-24 14:53:03 +01:00
Markus Fisch 93f7cd3cb8 Map old ignore setting to new one
For existing installations that changed this value.
2024-03-23 20:21:08 +01:00
Markus Fisch 69baa3b824 Add an option to ignore any duplicates
As requested in issue #439.
2024-03-23 14:20:42 +01:00
Markus Fisch bb05e38278 Update tools version 2024-03-21 21:23:28 +01:00
KamaleiZestriandGitHub 554f5a5e73 Fix failing send due to invalid bluetooth connection
Try reconnect to socket once before failing.
2024-03-21 21:19:51 +01:00
Markus Fisch 2dcf7772f2 Update tools version and gradle wrapper 2024-03-17 13:52:49 +01:00
Markus Fisch 3c7012e3c4 Advance version number to 1.63.4 2024-03-17 13:35:31 +01:00
Markus Fisch 08e11c3c40 Update ZXingCpp to fix support for old devices 2024-03-16 21:38:51 +01:00
Unknownman820andGitHub 31854dab0c Update Chinese translation 2024-03-16 21:38:04 +01:00
Markus Fisch 4f12c3e270 Advance version number to 1.63.3 2024-03-04 21:06:50 +01:00
Markus Fisch 3ec43dabce Update AndroidX SCAN Intent sample 2024-03-03 18:34:42 +01:00
Markus Fisch 0d4f536f71 Fix returning barcode format in return Intent
The class `BarcodeFormat` is not known to callers, of course.
2024-03-03 18:30:55 +01:00
Markus Fisch b064a293fb Add donation options to the README 2024-02-29 20:25:50 +01:00
Markus Fisch d124c29919 Advance version number to 1.63.2 2024-02-19 22:08:22 +01:00
Markus Fisch 2e89f1530a Add DX_FILM_EDGE barcode format
And add it to the selected barcodes so it's immediately
available for existing installations too.
2024-02-17 13:41:49 +01:00
Markus Fisch ef7e2a4b0d Update build tools 2024-02-17 13:40:28 +01:00
Markus Fisch f680533819 Update ZXingCpp for DX_FILM_EDGE format 2024-02-17 13:21:06 +01:00
Oğuz ErsenandGitHub a8c977c40e Update Turkish translation 2024-01-21 17:31:20 +01:00
Markus Fisch 1e89b22953 Update ZXingCpp to latest version
For QRCode: fix crash reported in #700
2024-01-15 20:14:50 +01:00
Markus Fisch 11f028e0f3 Update Kotlin version 2024-01-15 20:13:37 +01:00
Markus Fisch 1f7f4a23b5 Update tools version 2024-01-15 20:11:50 +01:00
Sergiy StuparandGitHub 41581d07ec Update Ukrainian translation 2024-01-14 20:53:17 +01:00
Markus Fisch dc819a6e1a Advance version number to 1.63.1 2024-01-13 13:47:32 +01:00
Markus Fisch 5b51072f1a Include custom label in json/csv exports/shares 2024-01-13 13:29:45 +01:00
solokotandGitHub 1b10e82cb2 Update Russian translation 2024-01-12 08:55:55 +01:00
Markus Fisch eeae1eb0ad Advance version number to 1.63.0 2024-01-11 20:27:27 +01:00
Markus Fisch 21c29ca373 Set sendScanActive to false by default
Was enabled by default because this setting came after `sendScanUrl`
and I didn't want to annoy users using this feature already.

But it's probably too suspicious to have it enabled by default, even
if it does nothing, of course.
2024-01-11 17:10:22 +01:00
Markus Fisch 8bcb72e91b Use getParcelableExtra(String, Class) on Tiramisu+ 2024-01-11 00:23:15 +01:00
Markus Fisch 8f345fbfbe Remove redundant suppress annotation 2024-01-11 00:14:04 +01:00
Markus Fisch 2c88dbca02 Reformat scanWithinBounds()
Apply autoformat.
2024-01-11 00:12:45 +01:00
Markus Fisch bd1c629c85 Reformat imports
Let Android Studio do its thing.
2024-01-11 00:11:48 +01:00
Markus Fisch f89e6612c4 Replace Enum.values() with Enum.entries
Following the recommendation.
2024-01-11 00:09:27 +01:00
Markus Fisch 7a0cd0ce19 Use isNullOrEmpty instead of checking both 2024-01-11 00:08:22 +01:00
Markus Fisch 8544affa1e Edit scan label in DecodeFragment
Which makes this feature more prominent and also easier to access.
2024-01-10 23:56:44 +01:00
Markus Fisch 48d3588341 Add a button to add generated codes to the history
So generated barcodes can be saved, too.
2024-01-10 23:37:51 +01:00
Markus Fisch 783f6e4892 Refactor edit_scan to edit_label
This action is used to edit the (optional) label of a scan.
2024-01-10 23:03:24 +01:00
Markus Fisch 032cd64daf Avoid asking multiple times for camera permission
Otherwise ActivityCompat.requestPermissions() will trigger onResume()
again and again.
2024-01-11 10:59:29 +01:00
Markus Fisch 96626e6b00 Move origin subtraction out of min()
Simplifies the calculation of the width and height of the crop
section.
2024-01-10 22:38:31 +01:00
Markus Fisch 11ae65ec3e Refactor Bitmap.erect to rotate
The original task of this function was to straighten a picture
lying on its side. However, the function is now used for any rotation.
2024-01-10 22:36:02 +01:00
Markus Fisch 91e3acb647 Disable free rotation by default
This is probably too delicate to use, most barcodes are still
recognized when skewed (a little), and it can be quite an expensive
operation to rotate a very big image. So it's better to disable
this feature by default (for new installations).
2024-01-09 20:25:21 +01:00
Markus Fisch 40c2f5947b Crop imported images in background thread
Because rotating and cropping a big photo can take some time.
2024-01-09 20:03:26 +01:00
Markus Fisch 58b9466cfc Fix margin/error correction for recreated codes
The `margin` argument position was incorrectly used for the
error correction level.
2024-01-09 19:28:50 +01:00
Markus Fisch 12210e1768 Update CameraView library 2024-01-09 12:13:12 +01:00
Sergiy StuparandGitHub ad2ac457c9 Update Ukrainian translation 2024-01-09 12:06:05 +01:00
Markus Fisch 634b6e8d2b Limit duration of error beep to 1s
Since `ToneGenerator.TONE_SUP_ERROR` keeps on playing which
is quite annoying.
2024-01-03 19:21:29 +01:00
CertainBotandGitHub 6dd47f4dd0 Update Spanish translation 2023-12-19 22:00:31 +01:00
Markus Fisch 8426f66cfb Fix indent in settings.gradle
Match this with the rest of the project.
2023-12-18 12:27:34 +01:00
Meen BeeseandGitHub 3dfa84a33e Simplification and clean up of Gradle files
* Some linting suggestions by Android Studio
* Move all repository declarations to settings
2023-12-18 09:41:07 +01:00
Markus Fisch 38f658e253 Advance version number to 1.62.3 2023-12-15 12:18:14 +01:00
Markus Fisch 287d99e2b4 Make clicks select list items when in action mode
Avoids having to do long presses for every item you want to add
to the selection.
2023-12-14 22:57:31 +01:00
Markus Fisch 5cfcde9d4a Update pt-br translation
Thanks to m_s_
2023-12-12 23:05:47 +01:00
Markus Fisch b2730259fc Advance version number to 1.62.2 2023-12-12 21:56:37 +01:00
Markus Fisch 61a2d3023c Add rMQR Code on existing installations
So it's working immediately after an update.
2023-12-12 21:50:28 +01:00
CertainBotandGitHub 239ac7bd1a Update Spanish translation
- New strings translated. Typos ammended.
- Términos nuevos traducidos. Corrección de erratas.
2023-12-11 21:58:35 +01:00
Markus Fisch 4048314cf7 Advance version number to 1.62.1 2023-12-11 20:19:18 +01:00
Markus Fisch 3dbd772847 Add rMQR Code to barcode format resources
To make it selectable, too.
2023-12-11 20:12:23 +01:00
Markus Fisch 3a08465c35 Add rMQR Code list of supported codes in README 2023-12-10 18:24:08 +01:00
Markus Fisch 92e3669ee5 Advance version number to 1.62.0 2023-12-10 15:49:33 +01:00
Markus Fisch 8b297f4768 Ignore plurals warning for qr_version_and_modules
Because a QR Code always has more than one module.
2023-12-10 15:45:13 +01:00
Markus Fisch 42b7f1179b Remove incomplete zh-rTW locales translation
Because this got incomplete and so won't work with the values
array anymore.

Also it's probably a really bad idea to translate locales anyway.
If you pick a wrong one by accident, you'll have a hard time
changing it back to something you can understand.
2023-12-10 15:40:37 +01:00
Markus Fisch 9d6854c282 Suppress false-positive warning about TileService
`TileService#startActivityAndCollapse(Intent)` is only ever run
below UpsideDownCake, but Lint doesn't understand this yet.
2023-12-10 15:37:48 +01:00
Markus Fisch d943b7deff Suppress warning about commit()ing prefs
Because `commit()` is intentional where it's used.
2023-12-10 15:36:10 +01:00
Markus Fisch a138da9d9b Update Kotlin version 2023-12-10 15:35:28 +01:00
Markus Fisch 194338a0d2 Remove "many" quantity from French plural
Lint says this isn't relevant to French.
2023-12-10 15:34:27 +01:00
Markus Fisch 7eb8fdcce1 Add Brave search to and de/fa/tr locales
This was missing from the original commit.
2023-12-10 15:33:21 +01:00
Markus Fisch 2bf1796340 Improve naming of shared wrapper files
And add extensions so it's easier to deal with these files
in other contexts.
2023-12-10 15:14:31 +01:00
Markus Fisch cc42015da2 Wipe share file in HistoryFragment too 2023-12-09 22:20:33 +01:00
Markus Fisch 648c39c439 Rename share file to just "contents"
A better fit when sharing the history in this file.
2023-12-09 22:20:00 +01:00
Markus Fisch 8c25b05cda Remove menu group to make actions fold 2023-12-09 22:16:16 +01:00
Markus Fisch 780bebc9d1 Share history as a file
To make sharing the history via Bluetooth more easily, as Android
converts plain text to HTML there.
2023-12-09 22:01:51 +01:00
Markus Fisch bf7eb7efd5 Update tools version and gradle wrapper
And finally add the `compileOptions` block to make Gradle 8
work, because the Google guys are still unable to fix their bugs.
2023-12-09 16:29:48 +01:00
Markus Fisch d00d08bae3 Update to latest ZXingCpp 2023-12-09 15:13:45 +01:00
Markus Fisch 379256a7fe Share selected scans only from history
If there is a selection. Otherwise use the search filter as before.
2023-11-26 19:54:08 +01:00
Markus Fisch 180339269f Advance version number to 1.61.2 2023-11-22 19:16:16 +01:00
v72807647andGitHub 49af17cba8 Fix quick setting tile failed to launch on Android 14
SDK 34 deprecates startActivityAndCollapse(Intent), making it
throws an UnsupportedOperationException on Android 14 devices
instead of launching the app.

Added new function call for API 34, tested with Android 14 and
Android 9 devices.
2023-11-22 09:24:30 +01:00
Markus Fisch a03a187d2d Escape apostrophes in french translation
Apostrophe characters need to be escaped in XML.
2023-11-20 10:55:29 +01:00
solokotandGitHub 84806e70d7 Update Russian translation 2023-11-20 10:09:02 +01:00
NathanandGitHub 058de5a141 Update french locale 2023-11-18 12:28:07 +01:00
Kryštof ČernýandGitHub d330fbd195 Update CZ translation 2023-11-16 13:45:59 +01:00
Markus Fisch f5bc6f664f Fix Xiaomi MIUI lockscreen barcode shortcut 2023-11-15 22:07:50 +01:00
Markus Fisch 464279807c Advance version number to 1.61.1 2023-11-14 23:10:09 +01:00
Markus Fisch f7e5ef473a Add menu item to share scanned contents as a file
Because when sharing plain text via Bluetooth, Android explicitly
converts anything to HTML, which is not always what we want.

Details here:
https://stackoverflow.com/q/29907030

This feature is also useful to share binary contents more easily.
2023-11-13 20:26:31 +01:00
Markus Fisch ff733ef59e Fix opening recreated barcodes with binary content
Use the raw bytes not only for the recreated image but also
when opening the barcode in BarcodeFragment.
2023-11-10 21:16:05 +01:00
Markus Fisch 35b110a472 Fix key of general format restriction preference
Makes this setting have an effect again.

I somehow forgot to update the keys in the XMLs as well.
2023-11-08 20:41:32 +01:00
Markus Fisch 58eabf4754 Update to SDK 34 2023-11-01 18:12:57 +01:00
Markus Fisch 1f273a48a5 Catch IAE when parsing a WIFI configuration
Because some arguments may be out of range.

For example, SSIDs cannot be longer than 32 characters in some
versions of Android.

See: https://github.com/markusfisch/BinaryEye/issues/402
2023-10-29 13:53:58 +01:00
solokotandGitHub 785a64725d Update Russian translation 2023-10-24 08:56:32 +02:00
Markus Fisch 7a42e1de73 Recreate binary barcodes too
Since this is easily possible now.
2023-10-23 21:11:01 +02:00
7heMechandGitHub 9856ab7b6b Add Bulgarian translation and Brave search engine 2023-10-20 14:14:36 +02:00
Markus Fisch 746ff143d8 Advance version number to 1.61.0 2023-10-13 23:49:38 +02:00
Markus Fisch b0d4d94973 Add test for a VCARD with an explicit TYPE
And make the other tests fail if null was returned.
2023-10-13 21:11:22 +02:00
Markus Fisch c604ad5ef2 Fix type regex for VCARDs
The previous regex captured just the first letter of the type argument
because it was modified to be not greedy.
2023-10-13 21:08:01 +02:00
Markus Fisch 91c2b324ac Refactor pick_file to pick_image_file
And use `pick_file` to pick any file, not just an image.
2023-10-12 22:23:27 +02:00
Markus Fisch df59fd7446 Update Kotlin and coroutines library version 2023-10-12 22:15:19 +02:00
Markus Fisch 449fd1f26c Limit read binary data for encoding
And use just the first 4096 bytes, which is way too optimistic
as there is no barcode format available that can save that much
data.

This is just to avoid an OutOfMemoryError. Maybe it's better to
just show an error message for files that are too big?
2023-10-13 13:16:24 +02:00
Markus Fisch 72d839c6e2 Support encoding binary data from a file
So binary data can finally be re-encoded too.
2023-10-13 12:48:13 +02:00
Markus Fisch ab8c993a81 Add padding for spinners on encode fragment
Enlarges the touch area and makes the spinners easier to use.
2023-10-13 11:47:36 +02:00
Markus Fisch 5f5bd913d6 Move content EditText to the top
As this is probably the most important input field.
2023-10-13 11:47:36 +02:00
Markus Fisch 92fe4dd55f Reformat code with Android Studio
And apply the latest style changes.
2023-10-12 20:32:01 +02:00
Markus Fisch dab95176f0 Remember last selected margin for generation
More convenient.

Maybe we should store these settings for each barcode format.
2023-10-12 20:29:23 +02:00
Markus Fisch 650503ba70 Update camera library to latest version 2023-10-08 20:17:58 +02:00
solokotandGitHub 61078f214e Update Russian translation 2023-10-02 13:33:45 +02:00
Markus Fisch a4b639edfe Add margin parameter for encoding barcodes 2023-09-20 13:46:34 +02:00
Markus Fisch f37878dbb8 Replace toUpperCase() with uppercase()
Because toUpperCase(Locale) is deprecated.
2023-09-19 22:19:35 +02:00
Markus Fisch 10fde7c3d6 Add intent for MIUI fingerprint shortcut
So it's possible to start BinaryEye from the MIUI of Xiaomi devices.
2023-09-19 14:46:34 +02:00
Markus Fisch a098fcb48c Always save and use rawBytes from ZXingCpp
If available.

Because the text member may already be UTF-8 encoded, and this
cannot simply be converted back into a byte array for the hex dump.

So for ContentType.GS1, ContentType.ISO15434 and ContentType.TEXT
there could be inconsistencies between the displayed content and the
hex dump, because the latter was generated from the (already encoded)
content.
2023-09-15 19:08:29 +02:00
m_s_andMarkus Fisch f162977640 Update Brazilian Portuguese translation 2023-09-03 20:18:50 +02:00
Oleg KoretskyandGitHub 66cab58d7b Fix missing Copy button for binary QRs 2023-08-31 13:54:29 +02:00
John VenessandGitHub e99e2d7dcc Update English strings 2023-08-20 11:23:53 +02:00
Sergiy StuparandGitHub 9045a27a5d Update Ukrainian translation 2023-08-14 12:00:14 +02:00
Markus Fisch 9e1208c72b Update ZXing C++ wrapper 2023-08-13 19:09:32 +02:00
Markus Fisch 90410f232a Update Kotlin version 2023-08-13 18:09:29 +02:00
ddarfantasyandGitHub 6769fa7e37 Update zh-CN translation 2023-08-13 17:50:26 +02:00
Markus Fisch 72444f5081 Update ZXing C++ wrapper 2023-07-06 12:40:12 +02:00
Markus Fisch 9a3ca4ffa3 Update ZXing C++ wrapper 2023-05-20 14:24:34 +02:00
Markus Fisch f572923720 Add changelog for latest version for f-droid 2023-05-19 18:57:15 +02:00
Markus Fisch 4971f58f44 Advance version number to 1.60.3 2023-05-19 18:55:49 +02:00
m_s_andMarkus Fisch 0bf24080a8 Update Brazilian Portuguese translation 2023-05-19 18:49:51 +02:00
Markus Fisch 04a21f71ef Update Kotlin version 2023-05-11 20:37:39 +02:00
Unknownman820andGitHub e22a215863 Update Chinese translation 2023-05-04 12:10:51 +02:00
Markus Fisch 881829e7b2 Fix saving custom language
This preference needs to be committed so it is written to disk
immediately.

Otherwise the app will restart before this preference is presisted.
2023-05-03 20:48:40 +02:00
Kryštof ČernýandGitHub 2ad261f3b6 Update Czech localisation 2023-05-01 19:25:05 +02:00
Kryštof ČernýandGitHub e0fdda78b3 Fix library name in en-US/full_description.txt 2023-05-01 19:24:42 +02:00
solokotandGitHub 9c3710c56d Update Russian translation 2023-04-28 12:11:22 +02:00
bovirusandGitHub ddcab46d47 Update Italian language 2023-04-25 21:20:15 +02:00
Markus Fisch 076da26075 Advance version number to 1.60.2 2023-04-25 19:28:27 +02:00
Markus Fisch dbc37714f9 Remember checkbox state for unescaping input 2023-04-24 23:22:00 +02:00
Markus Fisch 50e57eaf25 Expand escape sequences in encoding input
So escape sequences can be used when encoding a barcode.
2023-04-24 23:14:58 +02:00
Markus Fisch 340f7f9d1d Remove lateinit for BT members
And use safe calls (?.) instead of catching the NullPointerException.

If something can be null, we should use the appropriate type for it
to make things explicit.
2023-04-19 21:13:05 +02:00
Unknownman820andGitHub a42bd793bb Update Taiwan translation 2023-04-04 08:56:49 +02:00
KamaleiZestriandGitHub 6e531f5395 Fix crash when not connected to a Bluetooth server 2023-03-29 12:06:20 +02:00
Markus Fisch 79b3fddcf8 Set BT results from return values
So the result variables can be immutable.

And use simpler terms for their names to make this easier to
read and understand.
2023-03-28 21:28:22 +02:00
Markus Fisch 09f3c8f193 Use "when" instead of "if/else"
More Kotlin idiomatic.

Also use full words instead of abbreviations for clarity.
2023-03-28 21:26:37 +02:00
144 changed files with 3322 additions and 1212 deletions
+113
View File
@@ -1,5 +1,118 @@
# Change Log
## 1.63.11
* Update parcel tracking URL
* Update multiple translations
* Only ask for barcode size when exporting/sharing
## 1.63.10
* Use maximum brightness when showing a generated barcode
* Allow file input from share menu
* Update multiple translations
## 1.63.9
* Export/share as JPEG
* Ignore "URL:" before URLs in barcode content
* Fix exporting/sharing multiple history items
* Update multiple translations
## 1.63.8
* Add an option to show a checksum for the decoded content
* Add support for encoding escape sequences for non-printable characters
* Update Italian translation
## 1.63.7
* Update ZXingCpp for Aztec Runes
* Update Italian translation
## 1.63.6
* Add history shortcut
* Return Codabar start/stop codes
* Update French, Russian, Spanish and Ukrainian translations
## 1.63.5
* Add an option to ignore any duplicates
* Fix invalid bluetooth connection
* Update Russian translation
* Update Ukrainian translation
## 1.63.4
* Update Chinese translation
* Improve support for old devices
## 1.63.3
* Fix SCAN Intent
## 1.63.2
* Add DX Film Edge barcode format
* Update Turkish translation
* Update Ukrainian translation
## 1.63.1
* Include scan label in exports/shares
* Update Russian translation
## 1.63.0
* Edit scan label in decoding screen
* Add a button to add generated codes to the history
* Improve scanning from images
* Improve asking for camera permission
* Fix margin for recreated barcodes
* Limit duration of error beep to 1s
* Update Ukrainian translation
* Update Spanish translation
## 1.62.3
* Extend selection with single taps in history listing
* Update Brazilian Portuguese translation
## 1.62.2
* Include rMQR Code for updates
## 1.62.1
* Make rMQR Code selectable
## 1.62.0
* Add support for rMQR (rectangular Micro QR) Code
* Share history as a file
* Only share selected scans from history
## 1.61.2
* Fix quick settings tile for Android 14
* Fix Xiaomi MIUI lockscreen barcode shortcut
* Update French translation
* Update Czech translation
* Update Russian translation
## 1.61.1
* Share scanned contents as a file
* Recreate binary barcodes too
* Add Bulgarian translation and Brave search engine
* Update Russian translation
* Fix general format restriction from preferences
## 1.61.0
* Support encoding binary data
* Add margin parameter for encoding
* Add copying binary data as hex dump
* Fix parsing TYPE argument in VCARDs
* Update Russian translation
* Update Brazilian Portuguese translation
* Update Ukrainian translation
* Update Chinese translation
## 1.60.3
* Fix saving custom language
* Update Brazilian Portuguese translation
* Update Chinese translation
* Update Czech localisation
* Update Russian translation
* Update Italian language
## 1.60.2
* Expand escape sequences in encoding input
* Update Taiwan translation
## 1.60.1
* Support sending scans via bluetooth
* Fix resolving error correction level for recreation
+5
View File
@@ -33,6 +33,11 @@ testurl:
-c android.intent.category.BROWSABLE \
-d 'http://markusfisch.de/BinaryEye?ret=http%3A%2F%2Fmarkusfisch.de%2F%3Fresult%3D{RESULT}'
testxiaomi:
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d 'market://details?id=com.xiaomi.scanner'
install:
adb $(TARGET) install -r app/build/outputs/apk/debug/app-debug.apk
+27 -4
View File
@@ -10,6 +10,23 @@ comes in Material Design and can also generate barcodes.
Binary Eye uses the [ZXing-C++][zxing_cpp] ("Zebra Crossing") barcode
scanning library.
If you find this app useful and wish to support its continued development,
you can [buy me a coffee](https://www.buymeacoffee.com/markusfisch) or
send some Bitcoin decimals to `bc1q2guk2rpll587aymrfadkdtpq32448x5khk5j8z`.
<a href="https://www.buymeacoffee.com/markusfisch" target="_blank"><img
src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png"
alt="Buy Me A Coffee"
style="height: 60px !important;width: 217px !important;"/></a>&nbsp;<a
href="https://liberapay.com/markusfisch/" target="_blank"><img
src="https://liberapay.com/assets/widgets/donate.svg"
alt="Liberapay"
style="height: 60px !important"/></a>&nbsp;<a
href="https://ko-fi.com/markusfisch" target="_blank"><img
src="https://storage.ko-fi.com/cdn/brandasset/kofi_s_tag_dark.png"
alt="Ko-fi"
style="height: 60px !important"/></a>
## Screenshots
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/screencap-scanning.png"
@@ -36,6 +53,7 @@ ZXing can read the following barcode formats:
* [CODE 93][code_93]
* [CODE 128][code_128]
* [DATA MATRIX][data_matrix]
* [DX FILM EDGE][dx_film_edge]
* [EAN 8][ean_8]
* [EAN 13][ean_13]
* [ITF][itf]
@@ -43,6 +61,7 @@ ZXing can read the following barcode formats:
* [PDF417][pdf417]
* [QR CODE][qr_code]
* [Micro QR Code][micro_qr_code]
* [rMQR Code][rmqr_code]
* [RSS 14][rss]
* [RSS EXPANDED][rss]
* [UPC A][upc_a]
@@ -120,10 +139,12 @@ If you're using AndroidX, this would be the new,
[recommended way][intent_result]:
```kotlin
class YourActivity : Activity() {
private val resultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val scan = result.data?.getStringExtra("SCAN_RESULT")
class YourActivity : AppCompatActivity() {
private val resultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
val content = result.data?.getStringExtra("SCAN_RESULT")
}
}
@@ -143,6 +164,7 @@ class YourActivity : Activity() {
[code_93]: https://en.wikipedia.org/wiki/Code_93
[code_128]: https://en.wikipedia.org/wiki/Code_128
[data_matrix]: https://en.wikipedia.org/wiki/Data_Matrix
[dx_film_edge]: https://en.wikipedia.org/wiki/DX_encoding
[ean_8]: https://en.wikipedia.org/wiki/EAN-8
[ean_13]: https://en.wikipedia.org/wiki/International_Article_Number
[itf]: https://en.wikipedia.org/wiki/Interleaved_2_of_5
@@ -150,6 +172,7 @@ class YourActivity : Activity() {
[pdf417]: https://en.wikipedia.org/wiki/PDF417
[qr_code]: https://en.wikipedia.org/wiki/QR_code
[micro_qr_code]: https://en.wikipedia.org/wiki/QR_code#Micro_QR_code
[rmqr_code]: https://www.qrcode.com/en/codes/rmqr.html
[rss]: https://en.wikipedia.org/wiki/GS1_DataBar
[upc_a]: https://en.wikipedia.org/wiki/Universal_Product_Code
[upc_e]: https://en.wikipedia.org/wiki/Universal_Product_Code#UPC-E
+29 -12
View File
@@ -2,14 +2,15 @@ apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
namespace 'de.markusfisch.android.binaryeye'
compileSdkVersion sdk_version
defaultConfig {
minSdkVersion 9
targetSdkVersion sdk_version
namespace "de.markusfisch.android.binaryeye"
compileSdk sdk_version
versionCode 118
versionName '1.60.1'
defaultConfig {
minSdk 9
targetSdk sdk_version
versionCode 139
versionName '1.63.11'
}
signingConfigs {
@@ -41,6 +42,10 @@ android {
}
}
buildFeatures {
buildConfig true
}
bundle {
language {
// To make the app bundle contain all language resources
@@ -52,18 +57,30 @@ android {
enableSplit = false
}
}
compileOptions {
// Required for Gradle 8.
sourceCompatibility = 17
targetCompatibility = 17
}
}
dependencies {
testImplementation 'junit:junit:4.13.2'
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1"
// Support
implementation "com.android.support:appcompat-v7:$support_version"
implementation "com.android.support:design:$support_version"
implementation "com.android.support:preference-v7:$support_version"
implementation "com.android.support:preference-v14:$support_version"
implementation 'com.github.markusfisch:CameraView:1.9.1'
// External
implementation 'com.github.markusfisch:CameraView:1.10.0'
implementation 'com.github.markusfisch:ScalingImageView:1.4.1'
implementation 'com.github.markusfisch:zxing-cpp:v2.0.0.1'
implementation 'com.github.markusfisch:zxing-cpp:v2.2.0.5'
// Testing
testImplementation 'junit:junit:4.13.2'
}
-2
View File
@@ -3,5 +3,3 @@
-dontwarn android.support.v8.**
-keep class android.support.v7.widget.SearchView { *; }
-keep class de.markusfisch.android.zxingcpp.** { *; }
+8 -1
View File
@@ -62,12 +62,19 @@
<intent-filter android:label="@string/compose_barcode">
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="text/*"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.zxing.client.android.SCAN"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="details" android:scheme="market"
android:pathSuffix="id=com.xiaomi.scanner"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
@@ -1,6 +1,6 @@
package de.markusfisch.android.binaryeye.actions.vtype
import java.util.*
import java.util.Locale
object VTypeParser {
private const val BACKSLASH_R_LEGACY =
@@ -39,6 +39,6 @@ data class VTypeProperty(
} ?: this.info.firstOrNull()
companion object {
private val typeRegex = """^(?:TYPE=)(.+?)[:;]?.*$""".toRegex(RegexOption.IGNORE_CASE)
private val typeRegex = """^TYPE=([A-Z_]+)[:;]?.*$""".toRegex(RegexOption.IGNORE_CASE)
}
}
@@ -8,7 +8,7 @@ import android.provider.ContactsContract
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.actions.IntentAction
import de.markusfisch.android.binaryeye.actions.vtype.VTypeParser
import java.util.*
import java.util.Locale
object VCardAction : IntentAction() {
override val iconResId: Int
@@ -45,10 +45,13 @@ object VCardAction : IntentAction() {
val (extraPhoneType, extraPhone) = when (index) {
0 -> ContactsContract.Intents.Insert.PHONE_TYPE to
ContactsContract.Intents.Insert.PHONE
1 -> ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE to
ContactsContract.Intents.Insert.SECONDARY_PHONE
2 -> ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE to
ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE
else -> return@forEachIndexed
}
phoneProperty.firstTypeOrFirstInfo?.also {
@@ -65,10 +68,13 @@ object VCardAction : IntentAction() {
val (extraMailType, extraMail) = when (index) {
0 -> ContactsContract.Intents.Insert.EMAIL_TYPE to
ContactsContract.Intents.Insert.EMAIL
1 -> ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE to
ContactsContract.Intents.Insert.SECONDARY_EMAIL
2 -> ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE to
ContactsContract.Intents.Insert.TERTIARY_EMAIL
else -> return@forEachIndexed
}
mailProperty.firstTypeOrFirstInfo?.also {
@@ -184,7 +190,7 @@ object VCardAction : IntentAction() {
}
private val String.addressType: Int?
get() = when (this.toUpperCase(Locale.US)) {
get() = when (this.uppercase()) {
"HOME" -> ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME
"WORK" -> ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK
"OTHER" -> ContactsContract.CommonDataKinds.StructuredPostal.TYPE_OTHER
@@ -9,7 +9,8 @@ import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.actions.IntentAction
import de.markusfisch.android.binaryeye.actions.vtype.VTypeParser
import java.text.SimpleDateFormat
import java.util.*
import java.util.Date
import java.util.Locale
object VEventAction : IntentAction() {
override val iconResId: Int
@@ -7,7 +7,7 @@ import de.markusfisch.android.binaryeye.content.openUrl
object WebAction : IAction {
private val colloquialRegex =
"^(http[s]*://)*[A-Za-z0-9]{3,}\\.[A-Za-z]{2,}[^ \t\r\n]*$".toRegex()
"^(URL:[ ]*)*(http[s]*://)*[A-Za-z0-9-]{3,}\\.[A-Za-z]{2,}[^ \t\r\n]*$".toRegex()
override val iconResId: Int = R.drawable.ic_action_open
override val titleResId: Int = R.string.open_url
@@ -18,6 +18,9 @@ object WebAction : IAction {
override suspend fun execute(context: Context, data: ByteArray) {
var url = String(data).trim()
if (url.startsWith("URL:")) {
url = url.substring(4).trim()
}
if (!url.startsWith("http") && !url.startsWith("ftp")) {
url = "http://${url}"
}
@@ -22,10 +22,9 @@ object WifiAction : IAction {
context: Context,
data: ByteArray
) = withContext(Dispatchers.IO) {
val wifiConfig = WifiConnector.parse(
String(data)
) ?: return@withContext
val message = WifiConnector.addNetwork(context, wifiConfig)
val message = WifiConnector.parse(String(data))?.let {
WifiConnector.addNetwork(context, it)
} ?: R.string.wifi_config_failed
withContext(Dispatchers.Main) {
context.toast(message)
}
@@ -44,14 +44,21 @@ object WifiConnector {
passwordBlock?.apply {
invoke(parsedData.password)
}
return if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
// WifiConfiguration is deprecated in Android Q but
// because it's only possible in R to query network
// suggestions, we still use the deprecated API on Q.
@Suppress("DEPRECATION")
WifiConfiguration().apply(parsedData)
} else {
WifiNetworkSuggestion.Builder().apply(parsedData)
return try {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
// WifiConfiguration is deprecated in Android Q but
// because it's only possible in R to query network
// suggestions, we still use the deprecated API on Q.
@Suppress("DEPRECATION")
WifiConfiguration().apply(parsedData)
} else {
WifiNetworkSuggestion.Builder().apply(parsedData)
}
} catch (e: IllegalArgumentException) {
// Some arguments may be out of range, e.g. SSIDs cannot
// be longer than 32 characters in some versions of Android.
// See: https://github.com/markusfisch/BinaryEye/issues/402
null
}
}
@@ -169,6 +176,7 @@ object WifiConnector {
"WPA", "WPA2" -> {
data.password?.let { setWpa2Passphrase(it) }
}
"WPA2-EAP" -> {
setWpa2EnterpriseConfig(WifiEnterpriseConfig().apply {
identity = data.identity
@@ -178,9 +186,11 @@ object WifiConnector {
data.phase2Method?.let { phase2Method = it }
})
}
"WPA3" -> {
data.password?.let { setWpa3Passphrase(it) }
}
"WPA3-EAP" -> {
setWpa3EnterpriseConfig(WifiEnterpriseConfig().apply {
identity = data.identity
@@ -240,6 +250,7 @@ object WifiConnector {
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40)
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104)
}
"WPA" -> {
passwordWithQuotes?.let {
preSharedKey = it
@@ -256,6 +267,7 @@ object WifiConnector {
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP)
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP)
}
"WPA2-EAP" -> requireSdk(Build.VERSION_CODES.JELLY_BEAN_MR2) {
passwordWithQuotes?.let {
preSharedKey = it
@@ -314,7 +326,7 @@ private fun String.trimAndTerminate(): String {
// for special chars.
private val escapedRegex = """\\([\\;,":])""".toRegex()
private val String.unescape: String
get() = this.replace(escapedRegex) { escaped ->
get() = replace(escapedRegex) { escaped ->
escaped.groupValues[1]
}
@@ -9,6 +9,7 @@ import android.graphics.Matrix
import android.graphics.Rect
import android.hardware.Camera
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.v7.app.AppCompatActivity
@@ -20,7 +21,12 @@ import android.view.View
import android.widget.SeekBar
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.app.PERMISSION_CAMERA
import de.markusfisch.android.binaryeye.app.applyLocale
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasBluetoothPermission
import de.markusfisch.android.binaryeye.app.hasCameraPermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.bluetooth.sendBluetoothAsync
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.execShareIntent
@@ -34,6 +40,7 @@ import de.markusfisch.android.binaryeye.graphics.setFrameToView
import de.markusfisch.android.binaryeye.media.releaseToneGenerators
import de.markusfisch.android.binaryeye.net.sendAsync
import de.markusfisch.android.binaryeye.net.urlEncode
import de.markusfisch.android.binaryeye.preference.Preferences
import de.markusfisch.android.binaryeye.view.errorFeedback
import de.markusfisch.android.binaryeye.view.initSystemBars
import de.markusfisch.android.binaryeye.view.scanFeedback
@@ -42,11 +49,12 @@ import de.markusfisch.android.binaryeye.widget.DetectorView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.cameraview.widget.CameraView
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer
import de.markusfisch.android.zxingcpp.ZxingCpp.DecodeHints
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
import java.nio.charset.Charset
import java.io.FileInputStream
import java.util.Scanner
import kotlin.math.max
import kotlin.math.min
import kotlin.math.roundToInt
@@ -60,7 +68,7 @@ class CameraActivity : AppCompatActivity() {
private lateinit var zoomBar: SeekBar
private lateinit var flashFab: FloatingActionButton
private var formatsToRead = setOf<String>()
private var formatsToRead = setOf<BarcodeFormat>()
private var frameMetrics = FrameMetrics()
private var decoding = true
private var returnResult = false
@@ -71,6 +79,7 @@ class CameraActivity : AppCompatActivity() {
private var restrictFormat: String? = null
private var ignoreNext: String? = null
private var fallbackBuffer: IntArray? = null
private var requestCameraPermission = true
override fun onRequestPermissionsResult(
requestCode: Int,
@@ -129,7 +138,7 @@ class CameraActivity : AppCompatActivity() {
initDetectorView()
if (intent?.action == Intent.ACTION_SEND &&
intent.type == "text/plain"
intent.type?.startsWith("text/") == true
) {
handleSendText(intent)
}
@@ -153,9 +162,13 @@ class CameraActivity : AppCompatActivity() {
ignoreNext = null
}
setReturnTarget(intent)
if (hasCameraPermission()) {
// Avoid asking multiple times when the user has denied access
// for this session. Otherwise ActivityCompat.requestPermissions()
// will trigger onResume() again and again.
if (hasCameraPermission(requestCameraPermission)) {
openCamera()
}
requestCameraPermission = false
}
private fun updateHints() {
@@ -169,7 +182,7 @@ class CameraActivity : AppCompatActivity() {
} else {
setTitle(R.string.scan_code)
prefs.barcodeFormats
}
}.toFormatSet()
}
private fun setReturnTarget(intent: Intent?) {
@@ -177,6 +190,7 @@ class CameraActivity : AppCompatActivity() {
intent?.action == "com.google.zxing.client.android.SCAN" -> {
returnResult = true
}
intent?.dataString?.isReturnUrl() == true -> {
finishAfterShowingResult = true
returnUrlTemplate = intent.data?.getQueryParameter("ret")
@@ -245,44 +259,52 @@ class CameraActivity : AppCompatActivity() {
createBarcode()
true
}
R.id.history -> {
startActivity(MainActivity.getHistoryIntent(this))
true
}
R.id.pick_file -> {
startActivityForResult(
Intent.createChooser(
Intent(Intent.ACTION_GET_CONTENT).apply {
type = "image/*"
},
getString(R.string.pick_file)
getString(R.string.pick_image_file)
),
PICK_FILE_RESULT_CODE
)
true
}
R.id.switch_camera -> {
switchCamera()
true
}
R.id.bulk_mode -> {
bulkMode = bulkMode xor true
item.isChecked = bulkMode
ignoreNext = null
true
}
R.id.restrict_format -> {
showRestrictionDialog()
true
}
R.id.preferences -> {
startActivity(MainActivity.getPreferencesIntent(this))
true
}
R.id.info -> {
openReadme()
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -328,9 +350,34 @@ class CameraActivity : AppCompatActivity() {
private fun handleSendText(intent: Intent) {
val text = intent.getStringExtra(Intent.EXTRA_TEXT)
if (text?.isEmpty() == false) {
startActivity(MainActivity.getEncodeIntent(this, text, true))
finish()
return
}
// Read text from file.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
@Suppress("DEPRECATION")
intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri?
} else {
intent.getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
}?.let { textUri ->
val file = contentResolver.openFileDescriptor(textUri, "r")
if (file != null) {
val fs = FileInputStream(file.fileDescriptor)
val scn = Scanner(fs).useDelimiter("\\A")
if (scn.hasNext()) {
startActivity(
MainActivity.getEncodeIntent(
this, scn.next(), true
)
)
finish()
}
file.close()
}
}
}
@@ -351,6 +398,7 @@ class CameraActivity : AppCompatActivity() {
progress = zoomBar.progress
return true
}
MotionEvent.ACTION_MOVE -> {
if (prefs.zoomBySwiping) {
v ?: return false
@@ -364,6 +412,7 @@ class CameraActivity : AppCompatActivity() {
return true
}
}
MotionEvent.ACTION_UP -> {
// Stop calling focusTo() as soon as it returns false
// to avoid throwing and catching future exceptions.
@@ -423,11 +472,12 @@ class CameraActivity : AppCompatActivity() {
ignoreNext = null
decoding = true
// These settings can't change while the camera is open.
val decodeHints = DecodeHints(
val options = ReaderOptions(
tryHarder = prefs.tryHarder,
tryRotate = prefs.autoRotate,
tryInvert = true,
tryDownscale = true,
returnCodabarStartEnd = true,
maxNumberOfSymbols = 1
)
var useLocalAverage = false
@@ -440,7 +490,7 @@ class CameraActivity : AppCompatActivity() {
frameRoi.left, frameRoi.top,
frameRoi.width(), frameRoi.height(),
frameMetrics.orientation,
decodeHints.apply {
options.apply {
// By default, ZXing uses LOCAL_AVERAGE, but
// this does not work well with inverted
// barcodes on low-contrast backgrounds.
@@ -449,7 +499,7 @@ class CameraActivity : AppCompatActivity() {
} else {
Binarizer.GLOBAL_HISTOGRAM
}
formats = formatsToRead.joinToString()
formats = formatsToRead
}
)?.let { results ->
val result = results.first()
@@ -590,9 +640,11 @@ class CameraActivity : AppCompatActivity() {
setResult(Activity.RESULT_OK, getReturnIntent(result))
finish()
}
returnUri != null -> execShareIntent(
Intent(Intent.ACTION_VIEW, returnUri)
)
else -> {
showResult(result, bulkMode)
// If this app was invoked via a deep link but without
@@ -604,8 +656,12 @@ class CameraActivity : AppCompatActivity() {
}
}
if (bulkMode) {
if (prefs.ignoreConsecutiveDuplicates) {
ignoreNext = result.text
when (prefs.ignoreDuplicates()) {
Preferences.Companion.IgnoreDuplicates.Consecutive,
Preferences.Companion.IgnoreDuplicates.Any ->
ignoreNext = result.text
else -> Unit
}
if (prefs.showToastInBulkMode) {
toast(result.text)
@@ -627,6 +683,10 @@ class CameraActivity : AppCompatActivity() {
}
}
fun Set<String>.toFormatSet(): Set<BarcodeFormat> = map {
BarcodeFormat.valueOf(it)
}.toSet()
fun Activity.showResult(
result: Result,
bulkMode: Boolean = false,
@@ -652,7 +712,7 @@ fun Activity.showResult(
if (code == null || code < 200 || code > 299) {
errorFeedback()
}
if (body != null && body.isNotEmpty()) {
if (!body.isNullOrEmpty()) {
toast(body)
} else if (code == null || code > 299) {
toast(R.string.background_request_failed)
@@ -665,16 +725,22 @@ fun Activity.showResult(
) {
scan.sendBluetoothAsync(
prefs.sendScanBluetoothHost
) { con, send ->
if (!con) {
toast(R.string.bluetooth_connect_fail)
errorFeedback()
} else if (!send) {
toast(R.string.bluetooth_send_fail)
errorFeedback()
} else {
toast(R.string.bluetooth_send_success)
}
) { connected, sent ->
toast(
when {
!connected -> {
errorFeedback()
R.string.bluetooth_connect_fail
}
!sent -> {
errorFeedback()
R.string.bluetooth_send_fail
}
else -> R.string.bluetooth_send_success
}
)
}
}
if (!bulkMode) {
@@ -686,7 +752,7 @@ fun Activity.showResult(
private fun getReturnIntent(result: Result) = Intent().apply {
putExtra("SCAN_RESULT", result.text)
putExtra("SCAN_RESULT_FORMAT", result.format)
putExtra("SCAN_RESULT_FORMAT", result.format.toString())
putExtra("SCAN_RESULT_ORIENTATION", result.orientation)
putExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL", result.ecLevel)
if (result.rawBytes.isNotEmpty()) {
@@ -704,9 +770,7 @@ private fun completeUrl(urlTemplate: String, result: Result) = Uri.parse(
urlTemplate
.replace("{RESULT}", result.text.urlEncode())
.replace("{RESULT_BYTES}", result.rawBytes.toHexString())
.replace(
"{FORMAT}", result.format.urlEncode()
)
.replace("{FORMAT}", result.format.name.urlEncode())
// And support {CODE} from the old ZXing app, too.
.replace("{CODE}", result.text.urlEncode())
)
@@ -9,7 +9,12 @@ import android.support.v4.app.Fragment
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.app.PERMISSION_LOCATION
import de.markusfisch.android.binaryeye.app.PERMISSION_WRITE
import de.markusfisch.android.binaryeye.app.applyLocale
import de.markusfisch.android.binaryeye.app.permissionGrantedCallback
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.app.setFragment
import de.markusfisch.android.binaryeye.database.Scan
import de.markusfisch.android.binaryeye.fragment.DecodeFragment
import de.markusfisch.android.binaryeye.fragment.EncodeFragment
@@ -83,9 +88,11 @@ class MainActivity : AppCompatActivity() {
intent.hasExtra(ENCODE) -> EncodeFragment.newInstance(
intent.getStringExtra(ENCODE)
)
intent.hasExtra(DECODED) -> DecodeFragment.newInstance(
intent.getParcelableExtra(DECODED)!!
)
intent.hasExtra(DECODED) -> intent.getScanExtra(DECODED)?.let {
DecodeFragment.newInstance(it)
} ?: DecodeFragment()
else -> PreferencesFragment()
}
}
@@ -130,3 +137,12 @@ class MainActivity : AppCompatActivity() {
}
}
}
private fun Intent.getScanExtra(name: String): Scan? = if (
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
) {
@Suppress("DEPRECATION")
getParcelableExtra(name)
} else {
getParcelableExtra(name, Scan::class.java)
}
@@ -7,8 +7,8 @@ import android.graphics.Matrix
import android.graphics.Rect
import android.graphics.RectF
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.Parcelable
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.Menu
@@ -21,15 +21,23 @@ import de.markusfisch.android.binaryeye.graphics.fixTransparency
import de.markusfisch.android.binaryeye.graphics.loadImageUri
import de.markusfisch.android.binaryeye.graphics.mapPosition
import de.markusfisch.android.binaryeye.media.releaseToneGenerators
import de.markusfisch.android.binaryeye.view.*
import de.markusfisch.android.binaryeye.view.colorSystemAndToolBars
import de.markusfisch.android.binaryeye.view.initSystemBars
import de.markusfisch.android.binaryeye.view.recordToolbarHeight
import de.markusfisch.android.binaryeye.view.scanFeedback
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.CropImageView
import de.markusfisch.android.binaryeye.widget.DetectorView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer
import de.markusfisch.android.zxingcpp.ZxingCpp.DecodeHints
import de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.math.max
import kotlin.math.min
import kotlin.math.roundToInt
@@ -38,13 +46,14 @@ class PickActivity : AppCompatActivity() {
private val matrix = Matrix()
private val parentJob = Job()
private val scope = CoroutineScope(Dispatchers.IO + parentJob)
private val decodeHints = DecodeHints(
private val options = ReaderOptions(
tryHarder = true,
tryRotate = true,
tryInvert = true,
tryDownscale = true,
returnCodabarStartEnd = true,
maxNumberOfSymbols = 1,
formats = prefs.barcodeFormats.joinToString()
formats = prefs.barcodeFormats.toFormatSet()
)
private lateinit var cropImageView: CropImageView
@@ -117,35 +126,40 @@ class PickActivity : AppCompatActivity() {
}
private fun scanWithinBounds(bitmap: Bitmap) {
val viewRoi = if (detectorView.roi.width() < 1) {
cropImageView.getBoundsRect()
} else {
detectorView.roi
}
val mappedRect = cropImageView.mappedRect
val cropped = bitmap.crop(
getNormalizedRoi(mappedRect, viewRoi),
cropImageView.imageRotation,
cropImageView.pivotX,
cropImageView.pivotY
) ?: return
val croppedInView = Rect(
max(viewRoi.left, mappedRect.left.roundToInt()),
max(viewRoi.top, mappedRect.top.roundToInt()),
min(viewRoi.right, mappedRect.right.roundToInt()),
min(viewRoi.bottom, mappedRect.bottom.roundToInt())
val viewRoi = Rect(
if (detectorView.roi.width() < 1) {
cropImageView.getBoundsRect()
} else {
detectorView.roi
}
)
matrix.apply {
setScale(
croppedInView.width().toFloat() / cropped.width,
croppedInView.height().toFloat() / cropped.height
)
postTranslate(
croppedInView.left.toFloat(),
croppedInView.top.toFloat()
)
}
val mappedRect = RectF(cropImageView.mappedRect)
val imageRotation = cropImageView.imageRotation
val pivotX = cropImageView.pivotX
val pivotY = cropImageView.pivotY
scope.launch {
val cropped = bitmap.crop(
getNormalizedRoi(mappedRect, viewRoi),
imageRotation,
pivotX,
pivotY
) ?: return@launch
val croppedInView = Rect(
max(viewRoi.left, mappedRect.left.roundToInt()),
max(viewRoi.top, mappedRect.top.roundToInt()),
min(viewRoi.right, mappedRect.right.roundToInt()),
min(viewRoi.bottom, mappedRect.bottom.roundToInt())
)
matrix.apply {
setScale(
croppedInView.width().toFloat() / cropped.width,
croppedInView.height().toFloat() / cropped.height
)
postTranslate(
croppedInView.left.toFloat(),
croppedInView.top.toFloat()
)
}
cropped.decode()?.first()?.let {
withContext(Dispatchers.Main) {
if (isFinishing) {
@@ -171,7 +185,7 @@ class PickActivity : AppCompatActivity() {
0, 0,
width, height,
0,
decodeHints.apply {
options.apply {
binarizer = Binarizer.LOCAL_AVERAGE
}
) ?: ZxingCpp.readBitmap(
@@ -179,7 +193,7 @@ class PickActivity : AppCompatActivity() {
0, 0,
width, height,
0,
decodeHints.apply {
options.apply {
binarizer = Binarizer.GLOBAL_HISTOGRAM
}
)
@@ -205,12 +219,14 @@ class PickActivity : AppCompatActivity() {
rotateClockwise()
true
}
R.id.toggle_free -> {
prefs.freeRotation = prefs.freeRotation xor true
cropImageView.freeRotation = prefs.freeRotation
freeRotationItem.updateFreeRotationIcon()
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -230,9 +246,7 @@ class PickActivity : AppCompatActivity() {
}
private fun loadSentImage(intent: Intent): Bitmap? {
val uri = intent.getParcelableExtra<Parcelable>(
Intent.EXTRA_STREAM
) as? Uri ?: return null
val uri = intent.getUriExtra() ?: return null
return contentResolver.loadImageUri(uri)
}
@@ -262,3 +276,12 @@ private fun getNormalizedRoi(imageRect: RectF, roi: Rect): RectF {
(roi.bottom - imageRect.top) / h
)
}
private fun Intent.getUriExtra(): Uri? = if (
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
) {
@Suppress("DEPRECATION")
getParcelableExtra(Intent.EXTRA_STREAM)
} else {
getParcelableExtra(Intent.EXTRA_STREAM, Uri::class.java)
}
@@ -13,7 +13,7 @@ import de.markusfisch.android.binaryeye.database.Database
import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*
import java.util.Locale
class ScansAdapter(context: Context, cursor: Cursor) :
CursorAdapter(context, cursor, false) {
@@ -99,9 +99,11 @@ class ScansAdapter(context: Context, cursor: Cursor) :
icon = R.drawable.ic_label
name
}
content?.isEmpty() == true -> context.getString(
content.isNullOrEmpty() -> context.getString(
R.string.binary_data
)
else -> content
}
contentView.setCompoundDrawablesWithIntrinsicBounds(
@@ -2,7 +2,7 @@ package de.markusfisch.android.binaryeye.app
import android.content.Context
import android.os.Build
import java.util.*
import java.util.Locale
fun Context.applyLocale(localeName: String) {
if (localeName.isEmpty()) {
@@ -10,9 +10,9 @@ import android.support.v4.content.ContextCompat
var permissionGrantedCallback: (() -> Any)? = null
const val PERMISSION_CAMERA = 1
fun Activity.hasCameraPermission() = hasPermission(
fun Activity.hasCameraPermission(request: Boolean = true) = hasPermission(
Manifest.permission.CAMERA,
PERMISSION_CAMERA
if (request) PERMISSION_CAMERA else 0
)
const val PERMISSION_WRITE = 2
@@ -53,11 +53,13 @@ private fun Activity.hasPermission(
permission
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(permission),
requestCode
)
if (requestCode > 0) {
ActivityCompat.requestPermissions(
this,
arrayOf(permission),
requestCode
)
}
false
} else {
true
@@ -9,27 +9,27 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.IOException
import java.io.OutputStreamWriter
import java.util.*
import java.util.UUID
fun Scan.sendBluetoothAsync(
host: String,
callback: (Boolean, Boolean) -> Unit
) {
CoroutineScope(Dispatchers.IO).launch(Dispatchers.IO) {
var connectResponse = true
var sendResponse = false
if (!isConnected) {
connectResponse = connect(host)
val connected = if (isConnected) {
true
} else {
connect(host, true)
}
if (connectResponse) {
sendResponse = send(content)
val sent = if (connected) {
send(content, host, true)
} else {
false
}
withContext(Dispatchers.Main) {
callback(connectResponse, sendResponse)
callback(connected, sent)
}
}
}
@@ -52,8 +52,8 @@ fun setBluetoothHosts(listPref: ListPreference) {
listPref.callChangeListener(listPref.value)
}
private lateinit var socket: BluetoothSocket
private lateinit var writer: OutputStreamWriter
private var socket: BluetoothSocket? = null
private var writer: OutputStreamWriter? = null
private val blue = BluetoothAdapter.getDefaultAdapter()
private val uuid = UUID.fromString(
@@ -62,22 +62,25 @@ private val uuid = UUID.fromString(
private var isConnected = false
private fun connect(deviceName: String): Boolean = try {
private fun connect(deviceName: String, onceMore: Boolean): Boolean = try {
val device = findByName(deviceName) ?: throw RuntimeException(
"Bluetooth device not found"
)
socket = device.createRfcommSocketToServiceRecord(uuid)
socket.connect()
socket?.connect()
writer = socket?.outputStream?.writer()
isConnected = true
writer = socket.outputStream.writer()
true
} catch (e: Exception) {
close()
if (onceMore)
connect(deviceName, false)
else
close()
false
}
private fun send(message: String): Boolean = try {
writer.apply {
private fun send(message: String, host: String, onceMore: Boolean): Boolean = try {
writer?.apply {
write(message)
write("\n")
flush()
@@ -85,12 +88,27 @@ private fun send(message: String): Boolean = try {
true
} catch (e: Exception) {
close()
false
if (connect(host, false))
send(message, host, false)
else
false
}
private fun close() {
writer.close()
socket.close()
try {
writer?.close()
} catch (e: IOException) {
// Catch exception if writer wasn't initialized.
}
try {
socket?.close()
} catch (e: IOException) {
// Nothing we can do about this but keep
// the app from crashing.
}
writer = null
socket = null
isConnected = false
}
@@ -10,6 +10,8 @@ import de.markusfisch.android.binaryeye.BuildConfig
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.widget.toast
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
fun Context.execShareIntent(intent: Intent): Boolean = if (
!startIntent(intent)
@@ -59,6 +61,44 @@ fun Context.shareText(text: String, mimeType: String = "text/plain") {
})
}
private var lastShareFile: File? = null
fun wipeLastShareFile() {
lastShareFile?.let {
it.delete()
lastShareFile = null
}
}
fun <T> Context.shareAsFile(content: T, fileName: String) {
val (bytes, mimeType) = when (content) {
is ByteArray -> Pair(
content,
"text/plain"
)
is String -> Pair(
content.toByteArray(),
"application/octet-stream"
)
else -> throw IllegalArgumentException(
"Unsupported content text for shareAsFile()"
)
}
wipeLastShareFile()
val file = File(externalCacheDir, fileName)
try {
FileOutputStream(file).use {
it.write(bytes)
}
} catch (e: IOException) {
toast(R.string.error_saving_file)
return
}
lastShareFile = file
shareFile(file, mimeType)
}
fun Context.shareFile(file: File, mimeType: String) {
getUriForFile(file)?.let {
shareUri(it, mimeType)
@@ -32,6 +32,7 @@ private fun exportCsv(
val columns = arrayOf(
Database.SCANS_DATETIME,
Database.SCANS_FORMAT,
Database.SCANS_NAME,
Database.SCANS_CONTENT,
Database.SCANS_ERROR_CORRECTION_LEVEL,
Database.SCANS_VERSION,
@@ -6,6 +6,8 @@ import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.preference.Preferences
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
class Database {
private lateinit var db: SQLiteDatabase
@@ -69,6 +71,29 @@ class Database {
null
}
fun getScansDetailed(ids: LongArray): Cursor? = db.rawQuery(
"""SELECT
$SCANS_ID,
$SCANS_DATETIME,
$SCANS_NAME,
$SCANS_CONTENT,
$SCANS_RAW,
$SCANS_FORMAT,
$SCANS_ERROR_CORRECTION_LEVEL,
$SCANS_VERSION,
$SCANS_SEQUENCE_SIZE,
$SCANS_SEQUENCE_INDEX,
$SCANS_SEQUENCE_ID,
$SCANS_GTIN_COUNTRY,
$SCANS_GTIN_ADD_ON,
$SCANS_GTIN_PRICE,
$SCANS_GTIN_ISSUE_NUMBER
FROM $SCANS
WHERE $SCANS_ID IN (${ids.joinToString(",")})
ORDER BY $SCANS_DATETIME DESC
""".trimMargin(), null
)
fun getScan(id: Long): Scan? = db.rawQuery(
"""SELECT
$SCANS_ID,
@@ -94,7 +119,7 @@ class Database {
Scan(
it.getString(SCANS_CONTENT),
it.getBlob(SCANS_RAW),
it.getString(SCANS_FORMAT),
BarcodeFormat.valueOf(it.getString(SCANS_FORMAT)),
it.getString(SCANS_ERROR_CORRECTION_LEVEL),
it.getString(SCANS_VERSION),
it.getInt(SCANS_SEQUENCE_SIZE),
@@ -105,54 +130,65 @@ class Database {
it.getString(SCANS_GTIN_PRICE),
it.getString(SCANS_GTIN_ISSUE_NUMBER),
it.getString(SCANS_DATETIME),
it.getLong(SCANS_ID)
it.getLong(SCANS_ID),
it.getString(SCANS_NAME),
)
} else {
null
}
}
fun insertScan(scan: Scan): Long = db.insert(
SCANS,
null,
ContentValues().apply {
put(SCANS_DATETIME, scan.dateTime)
val isRaw = scan.raw != null
if (isRaw) {
put(SCANS_CONTENT, "")
put(SCANS_RAW, scan.raw)
} else {
put(SCANS_CONTENT, scan.content)
}
put(SCANS_FORMAT, scan.format)
scan.errorCorrectionLevel?.let {
put(SCANS_ERROR_CORRECTION_LEVEL, it)
}
put(SCANS_VERSION, scan.version)
put(SCANS_SEQUENCE_SIZE, scan.sequenceSize)
put(SCANS_SEQUENCE_INDEX, scan.sequenceIndex)
put(SCANS_SEQUENCE_ID, scan.sequenceId)
scan.country?.let { put(SCANS_GTIN_COUNTRY, it) }
scan.addOn?.let { put(SCANS_GTIN_ADD_ON, it) }
scan.price?.let { put(SCANS_GTIN_PRICE, it) }
scan.issueNumber?.let { put(SCANS_GTIN_ISSUE_NUMBER, it) }
if (prefs.ignoreConsecutiveDuplicates) {
fun insertScan(scan: Scan): Long {
when (prefs.ignoreDuplicates()) {
Preferences.Companion.IgnoreDuplicates.Consecutive -> {
val id = getIdOfLastScan(
get(SCANS_CONTENT) as String,
if (isRaw) get(SCANS_RAW) as ByteArray else null,
scan.content,
scan.raw,
scan.format
)
if (id > 0L) {
return id
}
}
Preferences.Companion.IgnoreDuplicates.Any -> {
val id = getIdOfScanByContent(scan.content, scan.format)
if (id > 0L) {
return id
}
}
else -> Unit
}
)
return db.insert(
SCANS,
null,
ContentValues().apply {
put(SCANS_DATETIME, scan.dateTime)
put(SCANS_CONTENT, scan.content)
if (scan.raw != null) {
put(SCANS_RAW, scan.raw)
}
put(SCANS_FORMAT, scan.format.name)
scan.errorCorrectionLevel?.let {
put(SCANS_ERROR_CORRECTION_LEVEL, it)
}
put(SCANS_VERSION, scan.version)
put(SCANS_SEQUENCE_SIZE, scan.sequenceSize)
put(SCANS_SEQUENCE_INDEX, scan.sequenceIndex)
put(SCANS_SEQUENCE_ID, scan.sequenceId)
scan.country?.let { put(SCANS_GTIN_COUNTRY, it) }
scan.addOn?.let { put(SCANS_GTIN_ADD_ON, it) }
scan.price?.let { put(SCANS_GTIN_PRICE, it) }
scan.issueNumber?.let { put(SCANS_GTIN_ISSUE_NUMBER, it) }
}
)
}
private fun getIdOfLastScan(
content: String,
raw: ByteArray?,
format: String
format: BarcodeFormat
): Long = db.rawQuery(
"""SELECT
$SCANS_ID,
@@ -169,7 +205,7 @@ class Database {
it.getString(SCANS_CONTENT) == content &&
(raw == null || it.getBlob(SCANS_RAW)
?.contentEquals(raw) == true) &&
it.getString(SCANS_FORMAT) == format
it.getString(SCANS_FORMAT) == format.name
) {
it.getLong(SCANS_ID)
} else {
@@ -177,6 +213,25 @@ class Database {
}
} ?: 0L
fun getIdOfScanByContent(
content: String,
format: BarcodeFormat
): Long = db.rawQuery(
"""SELECT
$SCANS_ID
FROM $SCANS
WHERE $SCANS_CONTENT = ?
AND $SCANS_FORMAT = ?
LIMIT 1
""".trimMargin(), arrayOf(content, format.name)
)?.use {
if (it.moveToFirst()) {
it.getLong(SCANS_ID)
} else {
0L
}
} ?: 0L
fun removeScan(id: Long) {
db.delete(SCANS, "$SCANS_ID = ?", arrayOf("$id"))
}
@@ -24,6 +24,7 @@ fun Cursor.exportJson(): String? {
val columns = arrayOf(
Database.SCANS_DATETIME,
Database.SCANS_FORMAT,
Database.SCANS_NAME,
Database.SCANS_CONTENT,
Database.SCANS_ERROR_CORRECTION_LEVEL,
Database.SCANS_VERSION,
@@ -6,14 +6,14 @@ import android.os.Parcel
import android.os.Parcelable
import android.text.format.DateFormat
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import de.markusfisch.android.zxingcpp.ZxingCpp.ContentType
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
data class Scan(
val content: String,
val raw: ByteArray?,
val format: String,
val format: BarcodeFormat,
val errorCorrectionLevel: String? = null,
val version: String? = null,
val sequenceSize: Int = -1,
@@ -24,7 +24,8 @@ data class Scan(
val price: String? = null,
val issueNumber: String? = null,
val dateTime: String = getDateTime(),
var id: Long = 0L
var id: Long = 0L,
val label: String? = null
) : Parcelable {
// Needs to be overwritten manually, as ByteArray is an array and
// this isn't handled well by Kotlin.
@@ -78,7 +79,7 @@ data class Scan(
private constructor(parcel: Parcel) : this(
content = parcel.readString() ?: "",
raw = parcel.readSizedByteArray(),
format = parcel.readString() ?: "",
format = BarcodeFormat.valueOf(parcel.readString() ?: ""),
errorCorrectionLevel = parcel.readString(),
version = parcel.readString(),
sequenceSize = parcel.readInt(),
@@ -89,14 +90,15 @@ data class Scan(
price = parcel.readString(),
issueNumber = parcel.readString(),
dateTime = parcel.readString() ?: "",
id = parcel.readLong()
id = parcel.readLong(),
label = parcel.readString()
)
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.apply {
writeString(content)
writeSizedByteArray(raw)
writeString(format)
writeString(format.name)
writeString(errorCorrectionLevel)
writeString(version)
writeInt(sequenceSize)
@@ -108,6 +110,7 @@ data class Scan(
writeString(issueNumber)
writeString(dateTime)
writeLong(id)
writeString(label)
}
}
@@ -123,23 +126,15 @@ data class Scan(
}
fun Result.toScan(): Scan {
val content: String
val raw: ByteArray?
when (contentType) {
ContentType.GS1,
ContentType.ISO15434,
ContentType.TEXT -> {
content = text
raw = null
}
else -> {
content = ""
raw = rawBytes
}
}
return Scan(
content,
raw,
when (contentType) {
ContentType.GS1,
ContentType.ISO15434,
ContentType.TEXT -> text
else -> ""
},
rawBytes,
format,
ecLevel,
version,
@@ -154,12 +149,12 @@ fun Result.toScan(): Scan {
}
data class Recreation(
val format: Format,
val format: BarcodeFormat,
val ecLevel: Int,
val size: Int,
val margin: Int
) {
fun encode(content: String): Bitmap? = try {
fun <T> encode(content: T): Bitmap? = try {
ZxingCpp.encodeAsBitmap(
content, format, size, size, margin, ecLevel
)
@@ -171,22 +166,18 @@ data class Recreation(
fun Scan.toRecreation(
size: Int = 128,
margin: Int = -1
) = if (content.isEmpty()) {
null
} else {
Recreation(
Format.valueOf(format),
when (errorCorrectionLevel) {
"L" -> 0
"M" -> 4
"Q" -> 6
"H" -> 8
else -> -1
},
size,
margin
)
}
) = Recreation(
format,
when (errorCorrectionLevel) {
"L" -> 0
"M" -> 4
"Q" -> 6
"H" -> 8
else -> -1
},
size,
margin
)
private fun getDateTime(
time: Long = System.currentTimeMillis()
@@ -7,41 +7,62 @@ import android.graphics.Bitmap
import android.os.Build
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.*
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.SeekBar
import android.widget.TextView
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasWritePermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.shareFile
import de.markusfisch.android.binaryeye.content.shareText
import de.markusfisch.android.binaryeye.database.toScan
import de.markusfisch.android.binaryeye.graphics.COLOR_BLACK
import de.markusfisch.android.binaryeye.graphics.COLOR_WHITE
import de.markusfisch.android.binaryeye.io.addSuffixIfNotGiven
import de.markusfisch.android.binaryeye.io.toSaveResult
import de.markusfisch.android.binaryeye.io.writeExternalFile
import de.markusfisch.android.binaryeye.os.getScreenBrightness
import de.markusfisch.android.binaryeye.os.setScreenBrightness
import de.markusfisch.android.binaryeye.view.doOnApplyWindowInsets
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.ConfinedScalingImageView
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.zxingcpp.ZxingCpp
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import kotlinx.coroutines.*
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.OutputStream
import java.util.*
import java.util.Locale
import kotlin.math.max
import kotlin.math.min
class BarcodeFragment : Fragment() {
private enum class FileType {
PNG, SVG, TXT
PNG, JPG, SVG, TXT
}
private val parentJob = Job()
private val scope = CoroutineScope(Dispatchers.IO + parentJob)
private lateinit var barcode: Barcode
private lateinit var barcode: Barcode<*>
private lateinit var addToHistoryItem: MenuItem
private lateinit var brightenScreenItem: MenuItem
private var currentBrightness = -1f;
override fun onCreate(state: Bundle?) {
super.onCreate(state)
@@ -71,7 +92,7 @@ class BarcodeFragment : Fragment() {
bitmap = barcode.bitmap()
} catch (e: Exception) {
var message = e.message
if (message == null || message.isEmpty()) {
if (message.isNullOrEmpty()) {
message = getString(R.string.error_encoding_barcode)
}
message?.let {
@@ -89,7 +110,7 @@ class BarcodeFragment : Fragment() {
// Make sure to invoke this after ScalingImageView.onLayout().
imageView.minWidth = min(
imageView.minWidth / 2f,
barcode.size.toFloat()
max(bitmap.width, bitmap.height).toFloat()
)
}
@@ -101,7 +122,7 @@ class BarcodeFragment : Fragment() {
}
}
(view.findViewById(R.id.inset_layout) as View).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
imageView.doOnApplyWindowInsets { v, insets ->
(v as ConfinedScalingImageView).insets.set(insets)
}
@@ -110,19 +131,36 @@ class BarcodeFragment : Fragment() {
}
private fun Bundle.toBarcode() = Barcode(
getString(CONTENT) ?: throw IllegalArgumentException(
getString(CONTENT_TEXT) ?: getByteArray(CONTENT_RAW) ?: throw IllegalArgumentException(
"content cannot be null"
),
Format.valueOf(
BarcodeFormat.valueOf(
getString(FORMAT) ?: throw IllegalArgumentException(
"format cannot be null"
)
),
getInt(SIZE),
getInt(MARGIN),
getInt(EC_LEVEL),
Colors.values()[getInt(COLORS)]
Colors.entries[getInt(COLORS)]
)
override fun onResume() {
super.onResume()
if (prefs.brightenScreen) {
// Post to make sure brightenScreenItem is initialized.
view?.post {
brightenScreen()
}
}
}
override fun onPause() {
super.onPause()
if (currentBrightness > -1f) {
restoreScreenBrightness()
}
}
override fun onDestroyView() {
super.onDestroyView()
parentJob.cancel()
@@ -130,10 +168,22 @@ class BarcodeFragment : Fragment() {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_barcode, menu)
addToHistoryItem = menu.findItem(R.id.add_to_history)
brightenScreenItem = menu.findItem(R.id.brighten_screen)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.add_to_history -> {
readAndAddToHistory(
barcode.bitmap(),
barcode.format
)
addToHistoryItem.isVisible = false
context.toast(R.string.added_to_history)
true
}
R.id.copy_to_clipboard -> {
context.apply {
copyToClipboard(barcode.text())
@@ -141,12 +191,32 @@ class BarcodeFragment : Fragment() {
}
true
}
R.id.export_to_file -> {
context.pickFileType(R.string.export_as) {
askForFileNameAndSave(it)
context.pickFileType(R.string.export_as) { fileType ->
when (fileType) {
FileType.PNG,
FileType.JPG -> askForSize { size ->
askForFileNameAndSave(fileType, size)
}
else -> askForFileNameAndSave(fileType, 0)
}
}
true
}
R.id.brighten_screen -> {
prefs.brightenScreen = if (currentBrightness > -1f) {
restoreScreenBrightness()
false
} else {
brightenScreen()
true
}
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -155,7 +225,7 @@ class BarcodeFragment : Fragment() {
title: Int,
action: (FileType) -> Unit
) {
val fileTypes = FileType.values()
val fileTypes = FileType.entries.toTypedArray()
AlertDialog.Builder(this)
.setTitle(title)
.setItems(fileTypes.map { it.name }.toTypedArray()) { _, which ->
@@ -166,11 +236,13 @@ class BarcodeFragment : Fragment() {
// Dialogs do not have a parent view.
@SuppressLint("InflateParams")
private fun askForFileNameAndSave(fileType: FileType) {
private fun askForFileNameAndSave(fileType: FileType, bitmapSize: Int) {
val ac = activity ?: return
// Write permission is only required before Android Q.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&
!ac.hasWritePermission { askForFileNameAndSave(fileType) }
!ac.hasWritePermission {
askForFileNameAndSave(fileType, bitmapSize)
}
) {
return
}
@@ -188,19 +260,28 @@ class BarcodeFragment : Fragment() {
addSuffixIfNotGiven(fileName, ".png"),
MIME_PNG
) {
barcode.bitmap().saveAsPng(it)
barcode.bitmap(bitmapSize).saveAsPng(it)
}
FileType.JPG -> saveAs(
addSuffixIfNotGiven(fileName, ".jpg"),
MIME_JPG
) {
barcode.bitmap(bitmapSize).saveAsJpg(it)
}
FileType.SVG -> saveAs(
addSuffixIfNotGiven(fileName, ".svg"),
MIME_SVG
) { outputStream ->
outputStream.write(barcode.svg().toByteArray())
) {
it.write(barcode.svg().toByteArray())
}
FileType.TXT -> saveAs(
addSuffixIfNotGiven(fileName, ".txt"),
MIME_TXT
) { outputStream ->
outputStream.write(barcode.text().toByteArray())
) {
it.write(barcode.text().toByteArray())
}
}
}
@@ -209,6 +290,52 @@ class BarcodeFragment : Fragment() {
.show()
}
// Dialogs do not have a parent view.
@SuppressLint("InflateParams")
private fun askForSize(write: (size: Int) -> Unit) {
val ac = activity ?: return
val view = ac.layoutInflater.inflate(R.layout.dialog_size, null)
val sizeView = view.findViewById<TextView>(R.id.size_display)
val sizeBarView = view.findViewById<SeekBar>(R.id.size_bar)
sizeBarView.initSizeBar(sizeView)
AlertDialog.Builder(ac)
.setView(view)
.setPositiveButton(android.R.string.ok) { _, _ ->
write(getSize(sizeBarView.progress))
}
.setNegativeButton(android.R.string.cancel) { _, _ ->
}
.show()
}
private fun SeekBar.initSizeBar(sizeView: TextView) {
sizeView.updateSize(progress)
setOnSeekBarChangeListener(
object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(
seekBar: SeekBar,
progressValue: Int,
fromUser: Boolean
) {
sizeView.updateSize(progressValue)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
}
)
}
private fun TextView.updateSize(power: Int) {
val size = getSize(power)
text = if (size > 0) {
getString(R.string.size_width_by_height, size, size)
} else {
getString(R.string.size_no_magnification)
}
}
private fun saveAs(
fileName: String,
mimeType: String,
@@ -225,21 +352,34 @@ class BarcodeFragment : Fragment() {
private fun Context.shareAs(fileType: FileType) {
when (fileType) {
FileType.PNG -> share(barcode.bitmap())
FileType.PNG -> askForSize {
share(barcode.bitmap(it), MIME_PNG, "png")
}
FileType.JPG -> askForSize {
share(barcode.bitmap(it), MIME_JPG, "jpg")
}
FileType.SVG -> shareText(barcode.svg(), MIME_SVG)
FileType.TXT -> shareText(barcode.text())
}
}
private fun Context.share(bitmap: Bitmap) {
private fun Context.share(bitmap: Bitmap, mimeType: String, ext: String) {
scope.launch(Dispatchers.IO) {
val file = File(
externalCacheDir,
"shared_barcode.png"
"shared_barcode.$ext"
)
val success = try {
FileOutputStream(file).use {
bitmap.saveAsPng(it)
when (mimeType) {
MIME_PNG -> bitmap.saveAsPng(it)
MIME_JPG -> bitmap.saveAsJpg(it)
else -> throw IllegalArgumentException(
"Invalid mime type"
)
}
}
true
} catch (e: IOException) {
@@ -247,7 +387,7 @@ class BarcodeFragment : Fragment() {
}
withContext(Dispatchers.Main) {
if (success) {
shareFile(file, "image/png")
shareFile(file, mimeType)
} else {
toast(R.string.error_saving_file)
}
@@ -255,27 +395,59 @@ class BarcodeFragment : Fragment() {
}
}
private fun brightenScreen() {
activity?.let {
currentBrightness = it.getScreenBrightness()
it.setScreenBrightness(1f);
brightenScreenItem.isChecked = true
}
}
private fun restoreScreenBrightness() {
if (currentBrightness > -1f) {
activity?.setScreenBrightness(currentBrightness);
currentBrightness = -1f
brightenScreenItem.isChecked = false
}
}
companion object {
private const val CONTENT = "content"
private const val CONTENT_TEXT = "content_text"
private const val CONTENT_RAW = "content_raw"
private const val FORMAT = "format"
private const val SIZE = "size"
private const val MARGIN = "margin"
private const val EC_LEVEL = "ec_level"
private const val COLORS = "colors"
private const val MIME_PNG = "image/png"
private const val MIME_JPG = "image/jpeg"
private const val MIME_SVG = "image/svg+xmg"
private const val MIME_TXT = "text/plain"
fun newInstance(
content: String,
format: Format,
size: Int,
fun <T> newInstance(
content: T,
format: BarcodeFormat,
margin: Int,
ecLevel: Int = -1,
colors: Int = 0
): Fragment {
val args = Bundle()
args.putString(CONTENT, content)
when (content) {
is String -> {
args.putString(CONTENT_TEXT, content)
}
is ByteArray -> {
args.putByteArray(CONTENT_RAW, content)
}
else -> {
throw IllegalArgumentException(
"content must be a String of a ByteArray"
)
}
}
args.putString(FORMAT, format.name)
args.putInt(SIZE, size)
args.putInt(MARGIN, margin)
args.putInt(EC_LEVEL, ecLevel)
args.putInt(COLORS, colors)
val fragment = BarcodeFragment()
@@ -285,28 +457,32 @@ class BarcodeFragment : Fragment() {
}
}
private data class Barcode(
val content: String,
val format: Format,
val size: Int,
private data class Barcode<T>(
val content: T,
val format: BarcodeFormat,
val margin: Int,
val ecLevel: Int,
val colors: Colors
) {
private var _bitmap: Bitmap? = null
fun bitmap(): Bitmap {
val b = _bitmap ?: ZxingCpp.encodeAsBitmap(
content, format, size, size, -1, ecLevel,
val b = _bitmap ?: bitmap(512)
_bitmap = b
return b
}
fun bitmap(size: Int): Bitmap {
return ZxingCpp.encodeAsBitmap(
content, format, size, size, margin, ecLevel,
setColor = colors.foregroundColor(),
unsetColor = colors.backgroundColor()
)
_bitmap = b
return b
}
private var _svg: String? = null
fun svg(): String {
val s = _svg ?: ZxingCpp.encodeAsSvg(
content, format, -1, ecLevel
content, format, margin, ecLevel
)
_svg = s
return s
@@ -315,7 +491,7 @@ private data class Barcode(
private var _text: String? = null
fun text(): String {
val t = _text ?: ZxingCpp.encodeAsText(
content, format, -1, ecLevel,
content, format, margin, ecLevel,
inverted = colors == Colors.BLACK_ON_WHITE
)
_text = t
@@ -332,6 +508,7 @@ private enum class Colors {
fun foregroundColor(): Int = when (this) {
BLACK_ON_WHITE,
BLACK_ON_TRANSPARENT -> COLOR_BLACK
WHITE_ON_BLACK,
WHITE_ON_TRANSPARENT -> COLOR_WHITE
}
@@ -347,6 +524,40 @@ private enum class Colors {
private fun Bitmap.saveAsPng(outputStream: OutputStream, quality: Int = 90) =
compress(Bitmap.CompressFormat.PNG, quality, outputStream)
private fun Bitmap.saveAsJpg(outputStream: OutputStream, quality: Int = 90) =
compress(Bitmap.CompressFormat.JPEG, quality, outputStream)
private val fileNameCharacters = "[^A-Za-z0-9]".toRegex()
private fun encodeFileName(name: String): String =
fileNameCharacters.replace(name, "_").take(16).trim('_').lowercase(Locale.getDefault())
private fun encodeFileName(name: String): String = fileNameCharacters
.replace(name, "_")
.take(16)
.trim('_')
.lowercase(Locale.getDefault())
private fun getSize(step: Int) = when (step) {
0 -> 0
else -> 128 shl (step - 1)
}
private fun readAndAddToHistory(
bitmap: Bitmap,
format: BarcodeFormat
) {
ZxingCpp.readBitmap(
bitmap,
0, 0,
bitmap.width, bitmap.height,
0,
ZxingCpp.ReaderOptions(
tryHarder = true,
tryRotate = true,
tryInvert = true,
tryDownscale = true,
maxNumberOfSymbols = 1,
formats = setOf(format)
)
)?.first {
db.insertScan(it.toScan())
true
}
}
@@ -6,21 +6,38 @@ import android.support.design.widget.FloatingActionButton
import android.support.v4.app.Fragment
import android.text.Editable
import android.text.Html
import android.text.Spannable
import android.text.SpannableString
import android.text.TextWatcher
import android.text.method.LinkMovementMethod
import android.view.*
import android.widget.*
import android.text.style.TypefaceSpan
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.ImageView
import android.widget.TableLayout
import android.widget.TableRow
import android.widget.TextView
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.actions.ActionRegistry
import de.markusfisch.android.binaryeye.actions.IAction
import de.markusfisch.android.binaryeye.actions.wifi.WifiAction
import de.markusfisch.android.binaryeye.actions.wifi.WifiConnector
import de.markusfisch.android.binaryeye.activity.MainActivity
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasLocationPermission
import de.markusfisch.android.binaryeye.app.hasWritePermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.shareAsFile
import de.markusfisch.android.binaryeye.content.shareText
import de.markusfisch.android.binaryeye.content.toHexString
import de.markusfisch.android.binaryeye.content.wipeLastShareFile
import de.markusfisch.android.binaryeye.database.Recreation
import de.markusfisch.android.binaryeye.database.Scan
import de.markusfisch.android.binaryeye.database.toRecreation
@@ -29,7 +46,12 @@ import de.markusfisch.android.binaryeye.io.toSaveResult
import de.markusfisch.android.binaryeye.io.writeExternalFile
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.toast
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.security.MessageDigest
import kotlin.math.roundToInt
class DecodeFragment : Fragment() {
@@ -40,6 +62,7 @@ class DecodeFragment : Fragment() {
private lateinit var hexView: TextView
private lateinit var stampView: TextView
private lateinit var recreationView: ImageView
private lateinit var labelView: EditText
private lateinit var fab: FloatingActionButton
private lateinit var format: String
@@ -56,6 +79,7 @@ class DecodeFragment : Fragment() {
private var originalBytes: ByteArray = ByteArray(0)
private var id = 0L
private var recreation: Recreation? = null
private var label: String? = null
override fun onCreate(state: Bundle?) {
super.onCreate(state)
@@ -86,9 +110,9 @@ class DecodeFragment : Fragment() {
} ?: throw IllegalArgumentException("DecodeFragment needs a Scan")
val originalContent = scan.content
isBinary = scan.raw != null
isBinary = scan.content.isEmpty()
originalBytes = scan.raw ?: originalContent.toByteArray()
format = scan.format
format = scan.format.name
id = scan.id
contentView = view.findViewById(R.id.content)
@@ -98,6 +122,7 @@ class DecodeFragment : Fragment() {
hexView = view.findViewById(R.id.hex)
stampView = view.findViewById(R.id.stamp)
recreationView = view.findViewById(R.id.recreation)
labelView = view.findViewById(R.id.label)
fab = view.findViewById(R.id.open)
initContentAndFab(originalContent)
@@ -112,18 +137,38 @@ class DecodeFragment : Fragment() {
(200f * dp).roundToInt()
)
}
if (id > 0) {
scan.label?.let {
labelView.setText(it)
label = it
}
} else {
labelView.visibility = View.GONE
}
updateViewsAndFab(originalContent, originalBytes)
(view.findViewById(R.id.inset_layout) as View).setPaddingFromWindowInsets()
(view.findViewById(R.id.scroll_view) as View).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
return view
}
override fun onPause() {
super.onPause()
if (id > 0) {
val newLabel = labelView.text.toString().trim()
if (newLabel != (label ?: "")) {
db.renameScan(id, newLabel)
label = newLabel
}
}
}
override fun onDestroy() {
super.onDestroy()
parentJob.cancel()
wipeLastShareFile()
}
private fun initContentAndFab(originalContent: String) {
@@ -176,12 +221,9 @@ class DecodeFragment : Fragment() {
action = ActionRegistry.getAction(bytes)
}
if (prevAction !== action) {
updateFab(action)
fab.setImageResource(action.iconResId)
}
}
private fun updateFab(action: IAction) {
fab.setImageResource(action.iconResId)
// Run this for the initial action too.
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
fab.setOnLongClickListener { v ->
v.context.toast(action.titleResId)
@@ -204,24 +246,33 @@ class DecodeFragment : Fragment() {
}
recreationView.showIf(prefs.showRecreation) { v ->
val r = recreation ?: return@showIf
v.setImageBitmap(r.encode(text))
val content = if (isBinary) bytes else text
v.setImageBitmap(r.encode(content))
v.setOnClickListener {
fragmentManager?.addFragment(
BarcodeFragment.newInstance(
text,
content,
r.format,
r.size,
r.margin,
r.ecLevel
)
)
}
}
dataView.fillDataView(text)
dataView.fillDataView(text, bytes)
stampView.setTrackingLink(bytes, format)
}
private fun TableLayout.fillDataView(text: String) {
val items = LinkedHashMap<Int, String?>()
private fun TableLayout.fillDataView(text: String, bytes: ByteArray) {
val items = LinkedHashMap<Int, CharSequence?>()
when (prefs.showChecksum) {
"CRC4" -> items[R.string.crc4] = String.format("%X", crc4(bytes))
"MD5" -> items[R.string.md5] = bytes.md5().toHexString().fold()
"SHA1" -> items[R.string.sha1] = bytes.sha1().toHexString().fold()
"SHA256" -> items[R.string.sha256] = bytes.sha256().toHexString().fold()
else -> Unit
}
if (action is WifiAction) {
WifiConnector.parseMap(text)?.let { wifiData ->
items.putAll(
@@ -243,7 +294,7 @@ class DecodeFragment : Fragment() {
}
private fun TableLayout.fillMetaView(scan: Scan) {
val items = linkedMapOf(
val items = linkedMapOf<Int, CharSequence?>(
R.string.error_correction_level to scan.errorCorrectionLevel,
R.string.sequence_size to scan.sequenceSize.positiveToString(),
R.string.sequence_index to scan.sequenceIndex.positiveToString(),
@@ -254,7 +305,7 @@ class DecodeFragment : Fragment() {
R.string.gtin_issue_number to scan.issueNumber,
)
if (!scan.version.isNullOrBlank()) {
val versionString = if (scan.format == "QR_CODE") {
val versionString = if (scan.format.name == "QR_CODE") {
getString(
R.string.qr_version_and_modules,
scan.version,
@@ -273,7 +324,7 @@ class DecodeFragment : Fragment() {
}
private fun TableLayout.fill(
items: LinkedHashMap<Int, String?>
items: LinkedHashMap<Int, CharSequence?>
) {
removeAllViews()
visibility = if (items.isEmpty()) View.GONE else {
@@ -299,10 +350,6 @@ class DecodeFragment : Fragment() {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_decode, menu)
if (isBinary) {
menu.findItem(R.id.copy_to_clipboard).isVisible = false
menu.findItem(R.id.create).isVisible = false
}
if (id > 0L) {
menu.findItem(R.id.remove).isVisible = true
}
@@ -318,11 +365,13 @@ class DecodeFragment : Fragment() {
maybeBackOrFinish()
true
}
R.id.copy_to_clipboard -> {
copyToClipboard(textOrHex())
maybeBackOrFinish()
true
}
R.id.share -> {
context?.apply {
shareText(textOrHex())
@@ -330,17 +379,36 @@ class DecodeFragment : Fragment() {
}
true
}
R.id.share_file -> {
context?.apply {
val (data, name) = if (isBinary) {
Pair(originalBytes, "barcode_content.bin")
} else {
Pair(content, "barcode_content.txt")
}
shareAsFile(data, name)
maybeBackOrFinish()
}
true
}
R.id.create -> {
fragmentManager?.addFragment(
EncodeFragment.newInstance(content, format)
EncodeFragment.newInstance(
if (isBinary) originalBytes else content,
format
)
)
true
}
R.id.remove -> {
db.removeScan(id)
backOrFinish()
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -451,7 +519,7 @@ private inline fun <T : View> T.showIf(
}
private val nonAlNum = "[^a-zA-Z0-9]".toRegex()
private val multipleDots = "[…]+".toRegex()
private val multipleDots = "+".toRegex()
private fun String.foldNonAlNum() = replace(nonAlNum, "")
.replace(multipleDots, "")
@@ -547,7 +615,7 @@ private fun generateDpTrackingLink(bytes: ByteArray, format: String): String? {
"%X",
crc4(hexString.toByteArray(Charsets.ISO_8859_1))
)
return "<a href=\"https://www.deutschepost.de/de/s/sendungsverfolgung/verfolgen.html?piececode=$trackingNumber\">Deutsche Post: $trackingNumber</a>"
return "<a href=\"https://www.deutschepost.de/de/s/sendungsverfolgung.html?piececode=$trackingNumber\">Deutsche Post: $trackingNumber</a>"
}
// CRC-4 with polynomial x^4 + x + 1.
@@ -582,3 +650,35 @@ private fun String.fromHtml() = if (
@Suppress("DEPRECATION")
Html.fromHtml(this)
}
private fun ByteArray.md5(): ByteArray = MessageDigest.getInstance("MD5").run {
update(this@md5)
digest()
}
private fun ByteArray.sha1(): ByteArray = MessageDigest.getInstance("SHA-1").run {
update(this@sha1)
digest()
}
private fun ByteArray.sha256(): ByteArray = MessageDigest.getInstance("SHA-256").run {
update(this@sha256)
digest()
}
private fun String.fold(): CharSequence {
val l = length
return if (l > 10) {
val half = l / 2
val s = substring(0, half) + "\n" + substring(half)
SpannableString(s).apply {
setSpan(
TypefaceSpan("monospace"),
0, s.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
} else {
this
}
}
@@ -1,20 +1,36 @@
package de.markusfisch.android.binaryeye.fragment
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.*
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.CheckBox
import android.widget.EditText
import android.widget.SeekBar
import android.widget.Spinner
import android.widget.TextView
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.text.unescape
import de.markusfisch.android.binaryeye.view.hideSoftKeyboard
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
import java.io.InputStream
import kotlin.math.max
import kotlin.math.min
class EncodeFragment : Fragment() {
private lateinit var formatView: Spinner
@@ -22,24 +38,57 @@ class EncodeFragment : Fragment() {
private lateinit var ecSpinner: Spinner
private lateinit var colorsLabel: TextView
private lateinit var colorsSpinner: Spinner
private lateinit var sizeView: TextView
private lateinit var sizeBarView: SeekBar
private lateinit var marginLayout: View
private lateinit var marginView: TextView
private lateinit var marginBarView: SeekBar
private lateinit var contentView: EditText
private lateinit var unescapeCheckBox: CheckBox
private val formats = arrayListOf(
Format.AZTEC,
Format.CODABAR,
Format.CODE_39,
Format.CODE_128,
Format.DATA_MATRIX,
Format.EAN_8,
Format.EAN_13,
Format.ITF,
Format.PDF_417,
Format.QR_CODE,
Format.UPC_A
BarcodeFormat.AZTEC,
BarcodeFormat.CODABAR,
BarcodeFormat.CODE_39,
BarcodeFormat.CODE_128,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.EAN_8,
BarcodeFormat.EAN_13,
BarcodeFormat.ITF,
BarcodeFormat.PDF_417,
BarcodeFormat.QR_CODE,
BarcodeFormat.UPC_A
)
private var minMargin = 0
private var bytes: ByteArray? = null
override fun onActivityResult(
requestCode: Int,
resultCode: Int,
resultData: Intent?
) {
when (requestCode) {
PICK_FILE_RESULT_CODE -> {
if (resultCode == Activity.RESULT_OK &&
resultData != null &&
resultData.data != null
) {
val ac = activity ?: return
ac.hideSoftKeyboard(contentView)
val uri = resultData.data ?: return
bytes = ac.contentResolver?.openInputStream(uri)?.use {
it.readBytesMax(4096)
} ?: return
setEncodeByteArray()
}
}
}
}
override fun onCreate(state: Bundle?) {
super.onCreate(state)
setHasOptionsMenu(true)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -73,9 +122,9 @@ class EncodeFragment : Fragment() {
) {
val format = formats[position]
val arrayId = when (format) {
Format.AZTEC -> R.array.aztec_error_correction_levels
Format.QR_CODE -> R.array.qr_error_correction_levels
Format.PDF_417 -> R.array.pdf417_error_correction_levels
BarcodeFormat.AZTEC -> R.array.aztec_error_correction_levels
BarcodeFormat.QR_CODE -> R.array.qr_error_correction_levels
BarcodeFormat.PDF_417 -> R.array.pdf417_error_correction_levels
else -> 0
}
if (arrayId > 0) {
@@ -89,10 +138,17 @@ class EncodeFragment : Fragment() {
true
} else {
false
}.setVisibility(ecLabel, ecSpinner)
format.canBeInverted().setVisibility(
}.setVisibilityFor(ecLabel, ecSpinner)
format.canBeInverted().setVisibilityFor(
colorsLabel, colorsSpinner
)
when (format) {
BarcodeFormat.AZTEC -> setMarginBar(4, 4)
BarcodeFormat.DATA_MATRIX -> setMarginBar(1, 1)
BarcodeFormat.QR_CODE -> setMarginBar(4, 4)
BarcodeFormat.PDF_417 -> setMarginBar(0, 30)
else -> false
}.setVisibilityFor(marginLayout)
}
override fun onNothingSelected(parentView: AdapterView<*>?) {}
@@ -120,16 +176,23 @@ class EncodeFragment : Fragment() {
colorsLabel = view.findViewById(R.id.colors_label)
colorsSpinner = view.findViewById(R.id.colors)
sizeView = view.findViewById(R.id.size_display)
sizeBarView = view.findViewById(R.id.size_bar)
initSizeBar()
marginLayout = view.findViewById(R.id.margin)
marginView = view.findViewById(R.id.margin_display)
marginBarView = view.findViewById(R.id.margin_bar)
initMarginBar()
contentView = view.findViewById(R.id.content)
unescapeCheckBox = view.findViewById(R.id.unescape)
unescapeCheckBox.isChecked = prefs.expandEscapeSequences
val args = arguments
args?.getString(CONTENT)?.let {
args?.getString(CONTENT_TEXT)?.let {
contentView.setText(it)
}
args?.getByteArray(CONTENT_RAW)?.let {
bytes = it
setEncodeByteArray()
}
val barcodeFormat = args?.getString(FORMAT)
if (barcodeFormat != null) {
@@ -146,30 +209,58 @@ class EncodeFragment : Fragment() {
it.context.encode()
}
(view.findViewById(R.id.inset_layout) as View).setPaddingFromWindowInsets()
(view.findViewById(R.id.scroll_view) as View).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_encode, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.pick_file -> {
startActivityForResult(
Intent.createChooser(
Intent(Intent.ACTION_GET_CONTENT).apply {
type = "*/*"
},
getString(R.string.pick_file)
),
PICK_FILE_RESULT_CODE
)
true
}
else -> super.onOptionsItemSelected(item)
}
}
override fun onPause() {
super.onPause()
prefs.indexOfLastSelectedFormat = formatView.selectedItemPosition
prefs.expandEscapeSequences = unescapeCheckBox.isChecked
prefs.lastMargin = marginBarView.progress
}
private fun Context.encode() {
val content = contentView.text.toString()
if (content.isEmpty()) {
toast(R.string.error_no_content)
return
}
hideSoftKeyboard(contentView)
val content = getContent() ?: return
val format = formats[formatView.selectedItemPosition]
fragmentManager?.addFragment(
BarcodeFragment.newInstance(
content,
format,
getSize(sizeBarView.progress),
when (format) {
BarcodeFormat.AZTEC,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.QR_CODE,
BarcodeFormat.PDF_417 -> marginBarView.progress
else -> -1
},
format.getErrorCorrectionLevel(ecSpinner.selectedItemPosition),
if (format.canBeInverted()) {
colorsSpinner.selectedItemPosition
@@ -178,16 +269,45 @@ class EncodeFragment : Fragment() {
)
}
private fun initSizeBar() {
updateSize(sizeBarView.progress)
sizeBarView.setOnSeekBarChangeListener(
private fun Context.getContent(): Any? {
if (bytes != null) {
return bytes
}
var text = contentView.text.toString()
if (unescapeCheckBox.isChecked) {
try {
text = text.unescape()
} catch (e: IllegalArgumentException) {
toast(e.message ?: "Invalid escape sequence")
return null
}
// Return a ByteArray if there were escape sequences for
// non-printable characters (like `\0`). This means the content
// will be encoded in binary mode, what would be wrong for
// "something\nlike\tthüs".
if (text.any { it.code < 32 && it.code !in setOf(9, 10, 13) }) {
return text.toByteArray()
}
}
if (text.isEmpty()) {
toast(R.string.error_no_content)
return null
}
return text
}
private fun initMarginBar() {
updateMargin(marginBarView.progress)
marginBarView.setOnSeekBarChangeListener(
object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(
seekBar: SeekBar,
progressValue: Int,
fromUser: Boolean
) {
updateSize(progressValue)
if (progressValue >= minMargin) {
updateMargin(progressValue)
}
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
@@ -196,21 +316,54 @@ class EncodeFragment : Fragment() {
})
}
private fun updateSize(power: Int) {
val size = getSize(power)
sizeView.text = getString(R.string.width_by_height, size, size)
private fun updateMargin(margin: Int) {
marginView.text = getString(R.string.margin_size, margin)
}
private fun setMarginBar(minimum: Int, value: Int): Boolean {
minMargin = minimum
marginBarView.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
min = minimum
}
progress = max(
minimum, if (prefs.lastMargin > -1) {
prefs.lastMargin
} else {
value
}
)
}
return true
}
private fun setEncodeByteArray() {
contentView.text = null
contentView.hint = getString(R.string.binary_data)
contentView.isEnabled = false
unescapeCheckBox.isEnabled = false
}
companion object {
private const val CONTENT = "content"
private const val CONTENT_TEXT = "content_text"
private const val CONTENT_RAW = "content_raw"
private const val FORMAT = "format"
private const val PICK_FILE_RESULT_CODE = 1
fun newInstance(
content: String? = null,
fun <T> newInstance(
content: T? = null,
format: String? = null
): Fragment {
val args = Bundle()
content?.let { args.putString(CONTENT, content) }
content?.let {
when (content) {
is String -> args.putString(CONTENT_TEXT, content)
is ByteArray -> args.putByteArray(CONTENT_RAW, content)
else -> throw IllegalArgumentException(
"content must be a String or a ByteArray"
)
}
}
format?.let { args.putString(FORMAT, it) }
val fragment = EncodeFragment()
fragment.arguments = args
@@ -219,45 +372,46 @@ class EncodeFragment : Fragment() {
}
}
private fun Boolean.setVisibility(vararg views: View) {
private fun Boolean.setVisibilityFor(vararg views: View) {
val visibility = if (this) View.VISIBLE else View.GONE
for (view in views) {
view.visibility = visibility
}
}
private fun Format.packEcLevel(packed: Int, level: Int): Int {
private fun BarcodeFormat.packEcLevel(packed: Int, level: Int): Int {
val s = ecLevelShift()
return (level shl s) or (packed and (15 shl s).inv())
}
private fun Format.unpackEcLevel(packed: Int) =
private fun BarcodeFormat.unpackEcLevel(packed: Int) =
(packed shr ecLevelShift()) and 15
private fun Format.ecLevelShift() = when (this) {
Format.AZTEC -> 0
Format.QR_CODE -> 4
Format.PDF_417 -> 8
private fun BarcodeFormat.ecLevelShift() = when (this) {
BarcodeFormat.AZTEC -> 0
BarcodeFormat.QR_CODE -> 4
BarcodeFormat.PDF_417 -> 8
else -> throw IllegalArgumentException("$this does not have error levels")
}
private fun Format.canBeInverted() = when (this) {
Format.AZTEC,
Format.DATA_MATRIX,
Format.QR_CODE -> true
private fun BarcodeFormat.canBeInverted() = when (this) {
BarcodeFormat.AZTEC,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.QR_CODE -> true
else -> false
}
private fun String.toFormat(default: Format = Format.QR_CODE): Format = try {
Format.valueOf(this)
private fun String.toFormat(default: BarcodeFormat = BarcodeFormat.QR_CODE): BarcodeFormat = try {
BarcodeFormat.valueOf(this)
} catch (_: IllegalArgumentException) {
default
}
private fun Format.getErrorCorrectionLevel(position: Int) = when (this) {
Format.AZTEC -> position
Format.QR_CODE -> (position + 1) * 2
Format.PDF_417 -> position
private fun BarcodeFormat.getErrorCorrectionLevel(position: Int) = when (this) {
BarcodeFormat.AZTEC -> position
BarcodeFormat.QR_CODE -> (position + 1) * 2
BarcodeFormat.PDF_417 -> position
else -> 0
}.coerceIn(0, 8)
@@ -272,4 +426,17 @@ private fun Spinner.setEntries(resId: Int) = ArrayAdapter.createFromResource(
adapter = aa
}
private fun getSize(power: Int) = 128 * (power + 1)
private fun InputStream.readBytesMax(max: Int): ByteArray {
var offset = 0
var remaining = min(available(), max)
val result = ByteArray(remaining)
while (remaining > 0) {
val read = read(result, offset, remaining)
if (read < 0) {
break
}
remaining -= read
offset += read
}
return result
}
@@ -15,20 +15,43 @@ import android.support.v7.app.AppCompatActivity
import android.support.v7.view.ActionMode
import android.support.v7.widget.SearchView
import android.support.v7.widget.SwitchCompat
import android.view.*
import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.ListView
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.adapter.ScansAdapter
import de.markusfisch.android.binaryeye.app.*
import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.alertDialog
import de.markusfisch.android.binaryeye.app.db
import de.markusfisch.android.binaryeye.app.hasWritePermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.content.copyToClipboard
import de.markusfisch.android.binaryeye.content.shareAsFile
import de.markusfisch.android.binaryeye.content.shareText
import de.markusfisch.android.binaryeye.database.*
import de.markusfisch.android.binaryeye.content.wipeLastShareFile
import de.markusfisch.android.binaryeye.database.Database
import de.markusfisch.android.binaryeye.database.exportCsv
import de.markusfisch.android.binaryeye.database.exportDatabase
import de.markusfisch.android.binaryeye.database.exportJson
import de.markusfisch.android.binaryeye.database.use
import de.markusfisch.android.binaryeye.io.askForFileName
import de.markusfisch.android.binaryeye.io.toSaveResult
import de.markusfisch.android.binaryeye.view.*
import de.markusfisch.android.binaryeye.view.lockStatusBarColor
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
import de.markusfisch.android.binaryeye.view.unlockStatusBarColor
import de.markusfisch.android.binaryeye.view.useVisibility
import de.markusfisch.android.binaryeye.widget.toast
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
class HistoryFragment : Fragment() {
private lateinit var useHistorySwitch: SwitchCompat
@@ -79,7 +102,8 @@ class HistoryFragment : Fragment() {
closeActionMode()
true
}
R.id.edit_scan -> {
R.id.edit_label -> {
scansAdapter?.forSelection { id, position ->
ac.askForName(
id,
@@ -90,6 +114,7 @@ class HistoryFragment : Fragment() {
closeActionMode()
true
}
R.id.remove_scan -> {
scansAdapter?.getSelectedIds()?.let {
if (it.isNotEmpty()) {
@@ -99,6 +124,7 @@ class HistoryFragment : Fragment() {
closeActionMode()
true
}
else -> false
}
}
@@ -114,6 +140,7 @@ class HistoryFragment : Fragment() {
private var filter: String? = null
private var clearListMenuItem: MenuItem? = null
private var exportHistoryMenuItem: MenuItem? = null
private var shareAsFileMenuItem: MenuItem? = null
override fun onCreate(state: Bundle?) {
super.onCreate(state)
@@ -136,12 +163,16 @@ class HistoryFragment : Fragment() {
useHistorySwitch = view.findViewById(
R.id.use_history
) as SwitchCompat
)
initHistorySwitch(useHistorySwitch)
listView = view.findViewById(R.id.scans)
listView.setOnItemClickListener { _, _, _, id ->
showScan(id)
listView.setOnItemClickListener { _, v, position, id ->
if (actionMode != null) {
scansAdapter?.select(v, id, position)
} else {
showScan(id)
}
}
listView.setOnItemLongClickListener { _, v, position, id ->
scansAdapter?.select(v, id, position)
@@ -156,12 +187,12 @@ class HistoryFragment : Fragment() {
fab = view.findViewById(R.id.share)
fab.setOnClickListener { v ->
v.context.pickListSeparatorAndShare()
v.context.pickListSeparatorAndShare(false)
}
progressView = view.findViewById(R.id.progress_view)
(view.findViewById(R.id.inset_layout) as View).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
listView.setPaddingFromWindowInsets()
update()
@@ -173,6 +204,7 @@ class HistoryFragment : Fragment() {
super.onDestroy()
scansAdapter?.changeCursor(null)
parentJob.cancel()
wipeLastShareFile()
}
override fun onPause() {
@@ -182,10 +214,19 @@ class HistoryFragment : Fragment() {
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.fragment_history, menu)
initSearchView(menu.findItem(R.id.search))
menu.setGroupVisible(R.id.scans_available, scansAdapter?.count != 0)
clearListMenuItem = menu.findItem(R.id.clear)
exportHistoryMenuItem = menu.findItem(R.id.export_history)
val searchMenuItem = menu.findItem(R.id.search)
initSearchView(searchMenuItem)
val visible = scansAdapter?.count != 0
searchMenuItem?.isVisible = visible
exportHistoryMenuItem = menu.findItem(R.id.export_history)?.apply {
isVisible = visible
}
shareAsFileMenuItem = menu.findItem(R.id.share_as_file)?.apply {
isVisible = visible
}
clearListMenuItem = menu.findItem(R.id.clear)?.apply {
isVisible = visible
}
}
private fun initSearchView(item: MenuItem?) {
@@ -221,10 +262,17 @@ class HistoryFragment : Fragment() {
context.askToRemoveScans()
true
}
R.id.export_history -> {
askToExportToFile()
true
}
R.id.share_as_file -> {
context.pickListSeparatorAndShare(true)
true
}
else -> super.onOptionsItemSelected(item)
}
}
@@ -278,6 +326,7 @@ class HistoryFragment : Fragment() {
private fun enableMenuItems(enabled: Boolean) {
clearListMenuItem?.isEnabled = enabled
exportHistoryMenuItem?.isEnabled = enabled
shareAsFileMenuItem?.isEnabled = enabled
}
private fun closeActionMode() {
@@ -407,32 +456,44 @@ class HistoryFragment : Fragment() {
}
}
private fun Context.pickListSeparatorAndShare() {
private fun Context.pickListSeparatorAndShare(asFile: Boolean) {
val separators = resources.getStringArray(
R.array.list_separators_values
)
AlertDialog.Builder(this)
.setTitle(R.string.pick_list_separator)
.setItems(R.array.list_separators_names) { _, which ->
shareScans(separators[which])
shareScans(separators[which], asFile)
}
.show()
}
private fun shareScans(format: String) = scope.launch {
private fun shareScans(format: String, asFile: Boolean) = scope.launch {
progressView.useVisibility {
var text: String? = null
db.getScansDetailed(filter)?.use { cursor ->
val selectedIds = scansAdapter?.getSelectedIds()
if (selectedIds?.isNotEmpty() == true) {
db.getScansDetailed(selectedIds.toLongArray())
} else {
db.getScansDetailed(filter)
}?.use { cursor ->
val details = format.split(":")
text = when (details[0]) {
"text" -> cursor.exportText(details[1])
"csv" -> cursor.exportCsv(details[1])
else -> cursor.exportJson()
when (details[0]) {
"text" -> Pair(cursor.exportText(details[1]), "txt")
"csv" -> Pair(cursor.exportCsv(details[1]), "csv")
else -> Pair(cursor.exportJson(), "json")
}
}
text?.let {
withContext(Dispatchers.Main) {
context.shareText(it)
}?.let { (text, ext) ->
text?.let {
withContext(Dispatchers.Main) {
if (asFile) {
context.shareAsFile(
it,
String.format("scans.%s", ext)
)
} else {
context.shareText(it)
}
}
}
}
}
@@ -7,7 +7,9 @@ import android.os.Build
import android.os.Bundle
import android.support.annotation.RequiresApi
import android.support.v4.app.Fragment
import android.view.*
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView
import de.markusfisch.android.binaryeye.R
@@ -49,7 +51,7 @@ class NetworkSuggestionsFragment : Fragment() {
listView.emptyView = view.findViewById(R.id.no_suggestions)
listView.adapter = suggestionArrayAdapter
listView.setOnScrollListener(systemBarListViewScrollListener)
(view.findViewById(R.id.inset_layout) as View).setPaddingFromWindowInsets()
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
listView.setPaddingFromWindowInsets()
view.findViewById<View>(R.id.remove).setOnClickListener {
@@ -20,19 +20,20 @@ import de.markusfisch.android.binaryeye.activity.SplashActivity
import de.markusfisch.android.binaryeye.app.addFragment
import de.markusfisch.android.binaryeye.app.hasBluetoothPermission
import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.bluetooth.setBluetoothHosts
import de.markusfisch.android.binaryeye.media.beepConfirm
import de.markusfisch.android.binaryeye.preference.UrlPreference
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
import de.markusfisch.android.binaryeye.view.systemBarRecyclerViewScrollListener
import de.markusfisch.android.binaryeye.widget.toast
import de.markusfisch.android.binaryeye.bluetooth.setBluetoothHosts
class PreferencesFragment : PreferenceFragmentCompat() {
private val changeListener = object : OnSharedPreferenceChangeListener {
override fun onSharedPreferenceChanged(
sharedPreferences: SharedPreferences,
key: String
sharedPreferences: SharedPreferences?,
key: String?
) {
key ?: return
val preference = findPreference(key) ?: return
prefs.update()
when (preference.key) {
@@ -41,6 +42,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
beepConfirm()
setSummary(preference)
}
"send_scan_bluetooth" -> {
if (prefs.sendScanBluetooth &&
activity?.hasBluetoothPermission() == false
@@ -49,6 +51,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
}
setSummary(preference)
}
else -> setSummary(preference)
}
}
@@ -166,9 +169,11 @@ class PreferencesFragment : PreferenceFragmentCompat() {
is UrlPreference -> {
preference.setSummary(preference.getUrl())
}
is ListPreference -> {
preference.setSummary(preference.entry)
}
is MultiSelectListPreference -> {
preference.setSummary(
preference.values.joinToString(", ") {
@@ -176,6 +181,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
}
)
}
is PreferenceGroup -> {
setSummaries(preference)
}
@@ -9,6 +9,7 @@ import de.markusfisch.android.binaryeye.app.prefs
import de.markusfisch.android.binaryeye.database.Scan
import de.markusfisch.android.binaryeye.net.sendAsync
import de.markusfisch.android.binaryeye.preference.UrlPreference
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
class UrlDialogFragment : PreferenceDialogFragmentCompat() {
private var urlView: TextView? = null
@@ -50,7 +51,7 @@ class UrlDialogFragment : PreferenceDialogFragmentCompat() {
Scan(
"test",
null,
"none"
BarcodeFormat.NONE
).sendAsync(url, prefs.sendScanType) { code, body ->
textView.text = when {
code != null -> "$code"
@@ -55,17 +55,17 @@ fun Bitmap.crop(
pivotX: Float,
pivotY: Float
) = try {
val erected = erect(rotation, pivotX, pivotY)
val w = erected.width
val h = erected.height
val b = rotate(rotation, pivotX, pivotY)
val w = b.width
val h = b.height
val x = max(0, (rect.left * w).roundToInt())
val y = max(0, (rect.top * h).roundToInt())
Bitmap.createBitmap(
erected,
b,
x,
y,
min(w - x, (rect.right * w).roundToInt() - x),
min(h - y, (rect.bottom * h).roundToInt() - y)
min(w, (rect.right * w).roundToInt()) - x,
min(h, (rect.bottom * h).roundToInt()) - y
)
} catch (e: OutOfMemoryError) {
null
@@ -73,13 +73,11 @@ fun Bitmap.crop(
null
}
private fun Bitmap.erect(
private fun Bitmap.rotate(
rotation: Float,
pivotX: Float,
pivotY: Float
): Bitmap = if (
rotation % 360f != 0f
) {
): Bitmap = if (rotation % 360f != 0f) {
Bitmap.createBitmap(
this,
0,
@@ -54,6 +54,7 @@ fun Matrix.setFrameToView(
uprightWidth = frameMetrics.height
uprightHeight = frameMetrics.width
}
else -> {
uprightWidth = frameMetrics.width
uprightHeight = frameMetrics.height
@@ -61,7 +61,6 @@ private fun Context.openExternalOutputStream(
fileName: String,
mimeType: String
): OutputStream = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
@Suppress("DEPRECATION")
val file = File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS
@@ -22,7 +22,7 @@ fun beepError() {
ToneGenerator.MAX_VOLUME
)
errorToneGenerator = tg
tg.startTone(ToneGenerator.TONE_SUP_ERROR)
tg.startTone(ToneGenerator.TONE_SUP_ERROR, 1000)
}
fun releaseToneGenerators() {
@@ -33,6 +33,7 @@ private fun Scan.send(url: String, type: String): Response {
"1" -> request(
url + "?" + asUrlArguments()
)
"2" -> request(url) { con ->
con.requestMethod = "POST"
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
@@ -41,6 +42,7 @@ private fun Scan.send(url: String, type: String): Response {
close()
}
}
"3" -> request(url) { con ->
con.requestMethod = "POST"
con.setRequestProperty("Content-Type", "application/json")
@@ -49,6 +51,7 @@ private fun Scan.send(url: String, type: String): Response {
close()
}
}
else -> request(
url + content.urlEncode()
)
@@ -66,7 +69,7 @@ private fun Scan.asJson() = JSONObject().apply {
private fun Scan.getMap(): Map<String, String> = mapOf(
"content" to content,
"raw" to raw?.toHexString(),
"format" to format,
"format" to format.name,
"errorCorrectionLevel" to errorCorrectionLevel,
"version" to version,
"sequenceSize" to sequenceSize.toString(),
@@ -0,0 +1,22 @@
package de.markusfisch.android.binaryeye.os
import android.app.Activity
import android.view.WindowManager
fun Activity.getScreenBrightness(): Float {
val layoutParams = window.attributes
return if (layoutParams.screenBrightness == WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE) {
android.provider.Settings.System.getInt(
contentResolver,
android.provider.Settings.System.SCREEN_BRIGHTNESS
) / 255.0f
} else {
layoutParams.screenBrightness
}
}
fun Activity.setScreenBrightness(brightness: Float) {
val layoutParams = window.attributes
layoutParams.screenBrightness = brightness
window.attributes = layoutParams
}
@@ -1,34 +1,37 @@
package de.markusfisch.android.binaryeye.preference
import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
import android.media.ToneGenerator
import android.os.Build
import android.preference.PreferenceManager
import android.support.annotation.RequiresApi
import de.markusfisch.android.zxingcpp.ZxingCpp.Format
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
class Preferences {
lateinit var preferences: SharedPreferences
var barcodeFormats = setOf(
Format.AZTEC.name,
Format.CODABAR.name,
Format.CODE_39.name,
Format.CODE_93.name,
Format.CODE_128.name,
Format.DATA_BAR.name,
Format.DATA_BAR_EXPANDED.name,
Format.DATA_MATRIX.name,
Format.EAN_8.name,
Format.EAN_13.name,
Format.ITF.name,
Format.MAXICODE.name,
Format.PDF_417.name,
Format.QR_CODE.name,
Format.MICRO_QR_CODE.name,
Format.UPC_A.name,
Format.UPC_E.name,
BarcodeFormat.AZTEC.name,
BarcodeFormat.CODABAR.name,
BarcodeFormat.CODE_39.name,
BarcodeFormat.CODE_93.name,
BarcodeFormat.CODE_128.name,
BarcodeFormat.DATA_BAR.name,
BarcodeFormat.DATA_BAR_EXPANDED.name,
BarcodeFormat.DATA_MATRIX.name,
BarcodeFormat.DX_FILM_EDGE.name,
BarcodeFormat.EAN_8.name,
BarcodeFormat.EAN_13.name,
BarcodeFormat.ITF.name,
BarcodeFormat.MAXICODE.name,
BarcodeFormat.PDF_417.name,
BarcodeFormat.QR_CODE.name,
BarcodeFormat.MICRO_QR_CODE.name,
BarcodeFormat.RMQR_CODE.name,
BarcodeFormat.UPC_A.name,
BarcodeFormat.UPC_E.name,
)
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
set(value) {
@@ -105,9 +108,9 @@ class Preferences {
apply(USE_HISTORY, value)
field = value
}
var ignoreConsecutiveDuplicates = true
var ignoreDuplicatesName = "ignore_consecutive_duplicates"
set(value) {
apply(IGNORE_CONSECUTIVE_DUPLICATES, value)
apply(IGNORE_DUPLICATES_NAME, value)
field = value
}
var copyImmediately = false
@@ -130,6 +133,11 @@ class Preferences {
apply(SHOW_HEX_DUMP, value)
field = value
}
var showChecksum = ""
set(value) {
apply(SHOW_CHECKSUM, value)
field = value
}
var showRecreation = true
set(value) {
apply(SHOW_RECREATION, value)
@@ -150,7 +158,7 @@ class Preferences {
apply(OPEN_WITH_URL, value)
field = value
}
var sendScanActive = true
var sendScanActive = false
set(value) {
apply(SEND_SCAN_ACTIVE, value)
field = value
@@ -177,7 +185,9 @@ class Preferences {
}
var customLocale: String = ""
set(value) {
apply(CUSTOM_LOCALE, value)
// Make sure this setting is written immediately because
// the app is about to restart.
commit(CUSTOM_LOCALE, value)
field = value
}
var indexOfLastSelectedFormat: Int = 0
@@ -190,11 +200,26 @@ class Preferences {
apply(INDEX_OF_LAST_SELECTED_EC_LEVEL, value)
field = value
}
var freeRotation = true
var lastMargin: Int = -1
set(value) {
apply(LAST_MARGIN, value)
field = value
}
var freeRotation = false
set(value) {
apply(FREE_ROTATION, value)
field = value
}
var expandEscapeSequences = true
set(value) {
apply(EXPAND_ESCAPE_SEQUENCES, value)
field = value
}
var brightenScreen = false
set(value) {
apply(BRIGHTEN_SCREEN, value)
field = value
}
fun init(context: Context) {
preferences = PreferenceManager.getDefaultSharedPreferences(context)
@@ -204,9 +229,14 @@ class Preferences {
fun update() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
preferences.getStringSet(BARCODE_FORMATS, barcodeFormats)?.let {
barcodeFormats = it
barcodeFormats = addFormatsOnUpdate(
it,
BarcodeFormat.RMQR_CODE,
BarcodeFormat.DX_FILM_EDGE
)
}
}
cropHandleX = preferences.getInt(CROP_HANDLE_X, cropHandleX)
cropHandleY = preferences.getInt(CROP_HANDLE_Y, cropHandleY)
cropHandleOrientation = preferences.getInt(
@@ -235,10 +265,17 @@ class Preferences {
beepToneName = it
}
useHistory = preferences.getBoolean(USE_HISTORY, useHistory)
ignoreConsecutiveDuplicates = preferences.getBoolean(
IGNORE_CONSECUTIVE_DUPLICATES,
ignoreConsecutiveDuplicates
)
// Map old setting to new one if it wasn't on default value.
val ignoreConsecutiveDuplicates = "ignore_consecutive_duplicates"
if (!preferences.getBoolean(ignoreConsecutiveDuplicates, true)) {
preferences.edit().remove(ignoreConsecutiveDuplicates).apply()
ignoreDuplicatesName = "accept_duplicates"
}
preferences.getString(IGNORE_DUPLICATES_NAME, ignoreDuplicatesName)?.also {
ignoreDuplicatesName = it
}
copyImmediately = preferences.getBoolean(
COPY_IMMEDIATELY,
copyImmediately
@@ -249,6 +286,9 @@ class Preferences {
)
showMetaData = preferences.getBoolean(SHOW_META_DATA, showMetaData)
showHexDump = preferences.getBoolean(SHOW_HEX_DUMP, showHexDump)
preferences.getString(SHOW_CHECKSUM, showChecksum)?.also {
showChecksum = it
}
showRecreation = preferences.getBoolean(SHOW_RECREATION, showRecreation)
closeAutomatically = preferences.getBoolean(
CLOSE_AUTOMATICALLY,
@@ -291,7 +331,32 @@ class Preferences {
INDEX_OF_LAST_SELECTED_EC_LEVEL,
indexOfLastSelectedEcLevel
)
lastMargin = preferences.getInt(
LAST_MARGIN,
lastMargin
)
freeRotation = preferences.getBoolean(FREE_ROTATION, freeRotation)
expandEscapeSequences = preferences.getBoolean(
EXPAND_ESCAPE_SEQUENCES,
expandEscapeSequences
)
brightenScreen = preferences.getBoolean(
BRIGHTEN_SCREEN,
brightenScreen
)
}
private fun addFormatsOnUpdate(
restored: Set<String>,
vararg formats: BarcodeFormat
) = restored.toMutableSet().apply {
for (format in formats) {
val name = "${format.name}_added"
if (!preferences.getBoolean(name, false)) {
preferences.edit().putBoolean(name, true).apply()
add(format.name)
}
}
}
fun beepTone() = when (beepToneName) {
@@ -303,6 +368,12 @@ class Preferences {
else -> ToneGenerator.TONE_PROP_BEEP
}
fun ignoreDuplicates() = when (ignoreDuplicatesName) {
"ignore_consecutive_duplicates" -> IgnoreDuplicates.Consecutive
"ignore_any_duplicates" -> IgnoreDuplicates.Any
else -> IgnoreDuplicates.Never
}
private fun put(label: String, value: Boolean) =
preferences.edit().putBoolean(label, value)
@@ -321,12 +392,21 @@ class Preferences {
preferences.edit().putInt(label, value).apply()
}
@SuppressLint("ApplySharedPref")
private fun commit(label: String, value: String) {
preferences.edit().putString(label, value).commit()
}
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
private fun apply(label: String, value: Set<String>) {
preferences.edit().putStringSet(label, value).apply()
}
companion object {
enum class IgnoreDuplicates {
Consecutive, Any, Never
}
private const val BARCODE_FORMATS = "formats"
private const val CROP_HANDLE_X = "crop_handle_x"
private const val CROP_HANDLE_Y = "crop_handle_y"
@@ -342,11 +422,12 @@ class Preferences {
private const val BEEP = "beep"
private const val BEEP_TONE_NAME = "beep_tone_name"
private const val USE_HISTORY = "use_history"
private const val IGNORE_CONSECUTIVE_DUPLICATES = "ignore_consecutive_duplicates"
private const val IGNORE_DUPLICATES_NAME = "ignore_duplicates_name"
private const val OPEN_IMMEDIATELY = "open_immediately"
private const val COPY_IMMEDIATELY = "copy_immediately"
private const val SHOW_META_DATA = "show_meta_data"
private const val SHOW_HEX_DUMP = "show_hex_dump"
private const val SHOW_CHECKSUM = "show_checksum"
private const val SHOW_RECREATION = "show_recreation"
private const val CLOSE_AUTOMATICALLY = "close_automatically"
private const val DEFAULT_SEARCH_URL = "default_search_url"
@@ -359,6 +440,9 @@ class Preferences {
private const val CUSTOM_LOCALE = "custom_locale"
private const val INDEX_OF_LAST_SELECTED_FORMAT = "index_of_last_selected_format"
private const val INDEX_OF_LAST_SELECTED_EC_LEVEL = "index_of_last_selected_ec_level"
private const val LAST_MARGIN = "last_margin"
private const val FREE_ROTATION = "free_rotation"
private const val EXPAND_ESCAPE_SEQUENCES = "expand_escape_sequences"
private const val BRIGHTEN_SCREEN = "brighten_screen"
}
}
@@ -1,5 +1,7 @@
package de.markusfisch.android.binaryeye.service
import android.annotation.SuppressLint
import android.app.PendingIntent
import android.content.Intent
import android.os.Build
import android.service.quicksettings.TileService
@@ -12,6 +14,21 @@ class ScanTileService : TileService() {
super.onClick()
val intent = Intent(applicationContext, CameraActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivityAndCollapse(intent)
// TileService#startActivityAndCollapse(Intent) is only ever run
// below UpsideDownCake, but Lint doesn't understand this yet.
@SuppressLint("StartActivityAndCollapseDeprecated")
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
@Suppress("DEPRECATION")
startActivityAndCollapse(intent)
} else {
startActivityAndCollapse(
PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_IMMUTABLE
)
)
}
}
}
@@ -0,0 +1,76 @@
package de.markusfisch.android.binaryeye.text
/**
* Copyright (c) 2000, Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// This code is based on Google's own implementation:
// http://www.java2s.com/example/android-utility-method/string-escape/javascriptunescape-string-s-dc359.html
fun String.unescape(): String {
val len = length
var i = 0
fun String.expand() = when (val ec = get(i++)) {
'n' -> '\n'
'r' -> '\r'
't' -> '\t'
'b' -> '\b'
'\\', '\"', '\'', '<', '>', '|' -> ec
'0', '1', '2', '3', '4', '5', '6', '7' -> {
val limit = if (ec < '4') 3 else 2
var l = 1
--i // Back to index of first digit.
while (l < limit &&
i + l < len &&
get(i + l) in '0'..'7'
) {
++l
}
val from = i
i += l
substring(from, i).toInt(8).toChar()
}
'x', 'u' -> {
val l = if (ec == 'u') 4 else 2
val hexCode = try {
substring(i, i + l)
} catch (_: IndexOutOfBoundsException) {
throw IllegalArgumentException(
"Invalid unicode sequence [${substring(i)}] at index $i"
)
}
val unicodeValue = try {
hexCode.toInt(16)
} catch (_: NumberFormatException) {
throw IllegalArgumentException(
"Invalid unicode sequence [$hexCode] at index $i"
)
}
i += l
unicodeValue.toChar()
}
else -> throw IllegalArgumentException(
"Unknown escape code [$ec] at index $i"
)
}
val sb = StringBuilder()
while (i < len) {
val ch = get(i++)
sb.append(if (ch == '\\' && i < len) expand() else ch)
}
return sb.toString()
}
@@ -32,6 +32,7 @@ private fun Context.isSilent(): Boolean {
return when (am.ringerMode) {
AudioManager.RINGER_MODE_SILENT,
AudioManager.RINGER_MODE_VIBRATE -> true
else -> false
}
}
@@ -2,7 +2,12 @@ package de.markusfisch.android.binaryeye.widget
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.*
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Path
import android.graphics.Point
import android.graphics.Rect
import android.graphics.Region
import android.os.Build
import android.os.Parcel
import android.os.Parcelable
@@ -162,6 +167,7 @@ class DetectorView : View {
false
}
}
MotionEvent.ACTION_MOVE -> {
if (handleGrabbed) {
handlePos.set(x, y)
@@ -176,6 +182,7 @@ class DetectorView : View {
false
}
}
MotionEvent.ACTION_CANCEL -> {
if (handleGrabbed) {
snap(x, y)
@@ -183,6 +190,7 @@ class DetectorView : View {
}
false
}
MotionEvent.ACTION_UP -> {
if (handleGrabbed) {
if (!handleActive) {
@@ -199,6 +207,7 @@ class DetectorView : View {
}
false
}
else -> super.onTouchEvent(event)
}
}
@@ -0,0 +1,4 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/accent"/>
<foreground android:drawable="@drawable/ic_shortcut_history_foreground"/>
</adaptive-icon>
Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"/>
</vector>
@@ -0,0 +1,3 @@
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M14.54,18.49L14.54,16.51L17.51,16.51L17.51,13.54L19.49,13.54L19.49,16.51L22.46,16.51L22.46,18.49L19.508,18.508L19.49,21.46L17.51,21.46L17.492,18.508L14.54,18.49ZM13.35,14.75L11,12.4L11,7L13,7L13,11.6L14.4,13L13.35,14.75ZM3,10L3,4L5,4L5,6.35C5.85,5.283 6.888,4.458 8.113,3.875C9.338,3.292 10.633,3 12,3C14.5,3 16.625,3.875 18.375,5.625C20.125,7.375 21,9.5 21,12L19,12C19,10.05 18.321,8.396 16.963,7.037C15.604,5.679 13.95,5 12,5C10.85,5 9.775,5.267 8.775,5.8C7.775,6.333 6.933,7.067 6.25,8L9,8L9,10L3,10ZM12,21C9.7,21 7.696,20.237 5.988,18.712C4.279,17.187 3.3,15.283 3.05,13L5.1,13C5.333,14.733 6.104,16.167 7.413,17.3C8.721,18.433 10.25,19 12,19C12.183,19 12.354,18.996 12.513,18.987C12.671,18.979 12.833,18.958 13,18.925L13,20.95C12.833,20.967 12.671,20.979 12.513,20.987C12.354,20.996 12.183,21 12,21Z"/>
</vector>
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M54,72.9C49.17,72.9 44.96,71.3 41.37,68.1C37.78,64.89 35.73,60.9 35.2,56.1L39.51,56.1C40,59.74 41.62,62.75 44.37,65.13C47.11,67.51 50.32,68.7 54,68.7C58.1,68.7 61.57,67.28 64.42,64.42C67.28,61.57 68.7,58.1 68.7,54C68.7,49.9 67.28,46.43 64.42,43.58C61.57,40.72 58.1,39.3 54,39.3C51.58,39.3 49.33,39.86 47.23,40.98C45.13,42.1 43.36,43.64 41.92,45.6L47.7,45.6L47.7,49.8L35.1,49.8L35.1,37.2L39.3,37.2L39.3,42.13C41.08,39.89 43.26,38.16 45.84,36.94C48.41,35.71 51.13,35.1 54,35.1C56.63,35.1 59.08,35.6 61.38,36.59C63.67,37.59 65.67,38.94 67.36,40.64C69.06,42.33 70.41,44.33 71.41,46.62C72.4,48.92 72.9,51.37 72.9,54C72.9,56.63 72.4,59.08 71.41,61.38C70.41,63.67 69.06,65.67 67.36,67.36C65.67,69.06 63.67,70.41 61.38,71.41C59.08,72.4 56.63,72.9 54,72.9ZM59.88,62.82L51.9,54.84L51.9,43.5L56.1,43.5L56.1,53.16L62.82,59.88L59.88,62.82Z"
android:fillColor="#FFFFFF"/>
</vector>
+23
View File
@@ -0,0 +1,23 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/size_display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_marginBottom="8dp"/>
<SeekBar
style="@style/Widget.AppCompat.SeekBar.Discrete"
android:id="@+id/size_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:progress="2"
android:max="4"/>
</LinearLayout>
@@ -13,6 +13,17 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:gravity="start|top"
android:hint="@string/label"
android:imeOptions="flagNoExtractUi"
android:importantForAutofill="no"
android:inputType="text"
tools:ignore="UnusedAttribute"/>
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
+45 -41
View File
@@ -17,11 +17,32 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/format"/>
<Spinner
android:id="@+id/format"
android:text="@string/content"/>
<EditText
tools:targetApi="o"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start|top"
android:typeface="monospace"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine"
android:hint="@string/input_content_here"
android:importantForAutofill="no"/>
<CheckBox
android:id="@+id/unescape"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/unescape"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/format"/>
<Spinner
style="@style/Spinner"
android:id="@+id/format"
android:layout_marginBottom="16dp"/>
<TextView
android:id="@+id/error_correction_label"
@@ -30,9 +51,8 @@
android:layout_marginBottom="8dp"
android:text="@string/error_correction_level"/>
<Spinner
style="@style/Spinner"
android:id="@+id/error_correction_level"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"/>
<TextView
android:id="@+id/colors_label"
@@ -41,47 +61,31 @@
android:layout_marginBottom="8dp"
android:text="@string/colors"/>
<Spinner
style="@style/Spinner"
android:id="@+id/colors"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:entries="@array/colors"/>
<TextView
<LinearLayout
android:id="@+id/margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/size"/>
<TextView
android:id="@+id/size_display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:gravity="center"/>
<SeekBar
style="@style/Widget.AppCompat.SeekBar.Discrete"
android:id="@+id/size_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:progress="4"
android:max="7"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="@string/content"/>
<EditText
tools:targetApi="o"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:gravity="start|top"
android:typeface="monospace"
android:imeOptions="flagNoExtractUi"
android:inputType="textMultiLine"
android:hint="@string/input_content_here"
android:importantForAutofill="no"/>
android:orientation="vertical"
android:visibility="gone">
<TextView
android:id="@+id/margin_display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"/>
<SeekBar
style="@style/Widget.AppCompat.SeekBar.Discrete"
android:id="@+id/margin_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:max="32"/>
</LinearLayout>
</LinearLayout>
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
<android.support.design.widget.CoordinatorLayout
+1 -1
View File
@@ -13,7 +13,7 @@
material:showAsAction="ifRoom"/>
<item
android:id="@+id/pick_file"
android:title="@string/pick_file"
android:title="@string/pick_image_file"
android:icon="@drawable/ic_action_pick_file"
material:showAsAction="ifRoom"/>
<item
@@ -1,6 +1,11 @@
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:material="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add_to_history"
android:title="@string/add_to_history"
android:icon="@drawable/ic_action_history_add"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/copy_to_clipboard"
android:title="@string/copy_to_clipboard"
@@ -11,4 +16,10 @@
android:title="@string/export_to_file"
android:icon="@drawable/ic_action_save"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/brighten_screen"
android:title="@string/brighten_screen"
android:icon="@drawable/ic_action_bright"
android:checkable="true"
material:showAsAction="ifRoom"/>
</menu>
@@ -23,6 +23,11 @@
android:title="@string/share"
android:icon="@drawable/ic_action_share"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/share_file"
android:title="@string/share_file"
android:icon="@drawable/ic_action_share"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/create"
android:title="@string/compose_barcode"
@@ -0,0 +1,9 @@
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:material="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/pick_file"
android:title="@string/pick_file"
android:icon="@drawable/ic_action_pick_file"
material:showAsAction="ifRoom"/>
</menu>
+21 -19
View File
@@ -1,23 +1,25 @@
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:material="http://schemas.android.com/apk/res-auto">
<group android:id="@+id/scans_available"
android:visible="false">
<item
android:id="@+id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search_scan"
material:actionViewClass="android.support.v7.widget.SearchView"
material:showAsAction="collapseActionView|always"/>
<item
android:id="@+id/export_history"
android:icon="@drawable/ic_action_export"
android:title="@string/export_to_file"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/clear"
android:icon="@drawable/ic_action_remove"
android:title="@string/clear_history"
material:showAsAction="ifRoom"/>
</group>
<item
android:id="@+id/search"
android:icon="@drawable/ic_action_search"
android:title="@string/search_scan"
material:actionViewClass="android.support.v7.widget.SearchView"
material:showAsAction="collapseActionView|always"/>
<item
android:id="@+id/export_history"
android:icon="@drawable/ic_action_export"
android:title="@string/export_to_file"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/share_as_file"
android:icon="@drawable/ic_action_share"
android:title="@string/share_file"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/clear"
android:icon="@drawable/ic_action_remove"
android:title="@string/clear_history"
material:showAsAction="ifRoom"/>
</menu>
@@ -7,8 +7,8 @@
android:icon="@drawable/ic_action_copy"
material:showAsAction="ifRoom"/>
<item
android:id="@+id/edit_scan"
android:title="@string/edit_scan"
android:id="@+id/edit_label"
android:title="@string/edit_label"
android:icon="@drawable/ic_action_edit"
material:showAsAction="ifRoom"/>
<item
+209
View File
@@ -0,0 +1,209 @@
<resources>
<string name="camera_error">Няма достъп до камерата, моля, опитайте отново</string>
<string name="scan_code">Сканирайте код</string>
<string name="compose_barcode">Създаване на баркод</string>
<string name="decode_barcode">Декодиране на баркод</string>
<string name="content">Съдържание</string>
<string name="binary_data">(бинарни данни)</string>
<plurals name="barcode_info">
<item quantity="one">%2$d символ, %1$s</item>
<item quantity="other">%2$d символа, %1$s</item>
</plurals>
<string name="error_correction_level">Ниво на коригиране на грешки</string>
<string name="error_correction_level_l" formatted="false">Ниско (~7&#37; корекция)</string>
<string name="error_correction_level_m" formatted="false">Средно (~15&#37; корекция)</string>
<string name="error_correction_level_q" formatted="false">Четвъртично (~25&#37; корекция)</string>
<string name="error_correction_level_h" formatted="false">Високо (~30&#37; корекция)</string>
<string name="label">Label</string>
<string name="colors">Преден и заден план</string>
<string name="colors_black_on_white">Черно на бяло</string>
<string name="colors_white_on_black">Бяло на черно</string>
<string name="colors_black_on_transparent">Черно на прозрачно</string>
<string name="colors_white_on_transparent">Бяло на прозрачно</string>
<string name="sequence_size">Размер на последователността</string>
<string name="sequence_index">Индекс на последователността</string>
<string name="sequence_id">ID на последователността</string>
<string name="gtin_issue_number">Номер на изданието</string>
<string name="gtin_country">Възможна страна на производство</string>
<string name="gtin_price">Предположена цена</string>
<string name="gtin_add_on">UPC EAN разширение</string>
<string name="barcode_version_number">Версия</string>
<string name="qr_version_and_modules">%1$s (%2$d модули)</string>
<string name="toggle_flash">Превключване на светкавицата</string>
<string name="error_flash">Грешка при превключването на светкавицата</string>
<string name="share">Сподели</string>
<string name="share_file">Share as file</string>
<string name="share_as">Сподели като?</string>
<string name="copy_to_clipboard">Копиране в клипборда</string>
<string name="copied_to_clipboard">Копирано в клипборда</string>
<string name="copy_password">Копиране на паролата в клипборда</string>
<string name="copied_password_to_clipboard">Паролата е копирана в клипборда</string>
<string name="open_url">Отворете URL(Линк)</string>
<string name="cannot_resolve_action">Няма приложение което може да отвори това</string>
<string name="pick_search_engine">Изберете търсачка</string>
<string name="format">Формат</string>
<string name="size_width_by_height">Размер в пиксели: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Марж в пиксели: %1$d</string>
<string name="input_content_here">Въведете съдържание тук</string>
<string name="unescape">Разширете последователности за извеждане</string>
<string name="encode">КОДИРАНЕ</string>
<string name="error_no_content">Липсва съдържание</string>
<string name="error_encoding_barcode">Баркодът не може да бъде генериран</string>
<string name="view_barcode">Вижте баркода</string>
<string name="info">Информация</string>
<string name="switch_camera">Превключване на камерата</string>
<string name="bulk_mode">Сканирайте непрекъснато</string>
<string name="bulk_mode_summary">Винаги започвай непрекъснато сканиране.</string>
<string name="bulk_mode_delay">Забавяне между непрекъснатите сканирания</string>
<string name="restrict_format">Ограничаване на формат</string>
<string name="remove_restriction">Премахване на ограничението</string>
<string name="scan_format">Сканиране %s</string>
<string name="quarter_second">Червърт секунда</string>
<string name="half_second">Половин секунда</string>
<string name="a_second">Една секунда</string>
<string name="two_seconds">Две секунди</string>
<string name="five_seconds">Пет секунди</string>
<string name="history">История</string>
<string name="preferences">Настройки</string>
<string name="scan_category">Сканиране</string>
<string name="content_category">Съдържание</string>
<string name="locale_category">Език</string>
<string name="custom_locale">Персонализиран език</string>
<string name="follow_system_settings">Следване на системните настройки</string>
<string name="show_crop_handle">Показване на ограничителя за изрязване</string>
<string name="show_crop_handle_summary">Ограничете сканирането до персонализирана област.</string>
<string name="barcode_formats">Баркодови формати</string>
<string name="zoom_by_swiping">Плъзване нагоре/надолу, за да увеличите</string>
<string name="zoom_by_swiping_summary">Плъзнете нагоре или надолу в екрана на камерата, за да контролирате приближаването на камерата.</string>
<string name="auto_rotate">Разпознаване на вертикални 1D баркодове</string>
<string name="auto_rotate_summary">Автоматично завъртете рамката на камерата, за разпознаване на вертикални 1D баркодове. В зависимост от устройството това може да повлияе на скоростта.</string>
<string name="try_harder">Оптимизиране на четеца за точност</string>
<string name="try_harder_summary">Активирайте тази опция за много трудни за четене кодове. Ще повлияе на скоростта.</string>
<string name="show_toast_in_bulk_mode">Показване на данни в непрекъснат режим</string>
<string name="show_toast_in_bulk_mode_summary">Кратко показване на сканираните данни при непрекъснато сканиране.</string>
<string name="vibrate">Вибриране при сканиране</string>
<string name="vibrate_summary">Активирайте това, ако искате устройството ви да вибрира при разпознаване на код.</string>
<string name="beep">Звуков сигнал при сканиране</string>
<string name="beep_summary">Активирайте това, ако искате вашето устройство да издава звуков сигнал при разпознаване на код.</string>
<string name="beep_tone">Звуков сигнал</string>
<string name="tone_cdma_confirm">CDMA потвърждение</string>
<string name="tone_sup_confirm">Потвърждение на надзорния разговор</string>
<string name="tone_sup_radio_ack">Потвърждение на контролния радиопът на повикване</string>
<string name="tone_prop_ack">Положително признание</string>
<string name="tone_prop_beep">Общ звуков сигнал</string>
<string name="tone_prop_beep2">Общ двоен звуков сигнал</string>
<string name="use_history">Хронология на сканирането</string>
<string name="use_history_summary">Запазва разпознатите кодове на вашето устройство.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Игнориране на дубликатите</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Отваряй внезапно</string>
<string name="open_immediately_summary">Пропуска проверката и внезапно отваря съдържанието. Може да отвори вредно съдържание, ако е активирано.</string>
<string name="copy_immediately">Поставяй в клипборда</string>
<string name="copy_immediately_summary">Автоматично копира сканираното съдържание в клипборда. Моля, имайте предвид, че други приложения може да подслушват вашия клипборд във фонов режим.</string>
<string name="show_meta_data">Показване на метаданни</string>
<string name="show_meta_data_summary">Показване на допълнителни данни за сканирания баркод.</string>
<string name="show_hex_dump">Показване на шестнадесетичен дъмп</string>
<string name="show_hex_dump_summary">Показване на шестнадесетичен дъмп на сканираното съдържание.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Показване на пресъздаден баркод</string>
<string name="show_recreation_summary">Създай и покажи баркод отново от прочетеното съдържание, ако е възможно.</string>
<string name="close_automatically">Върщане се след Копиране/Споделяне</string>
<string name="close_automatically_summary">Автоматично връщане към екрана за сканиране след копиране или споделяне на прочетеното съдържание.</string>
<string name="default_search_engine">Отворяй неизвестни данни в</string>
<string name="always_ask">Винаги питай</string>
<string name="open_with_url">Отворяне на неизвестни данни с URL</string>
<string name="clear_network_suggestions">Премахнете мрежовите предложения</string>
<string name="clear_network_suggestions_summary">Премахване на мрежовите предложения, които преди са били добавени с това приложение.</string>
<string name="really_remove_all_networks">Наистина ли искате да премахнете всички мрежи?</string>
<string name="clear_network_suggestions_success">Предложенията за интернет мрежи са изчистени</string>
<string name="clear_network_suggestions_nothing_to_remove">Нищо за премахване</string>
<string name="send_category">Препращане</string>
<string name="send_scan_active">Препращане на сканиранията</string>
<string name="send_scan_active_summary">Включване на препращането на сканиранията към даден URL адрес.</string>
<string name="send_scan_url">URL(Линк) за препращане</string>
<string name="send_scan_type">Тип заявка</string>
<string name="send_type_get_add_content">GET и просто добавяне на съдържанието</string>
<string name="send_type_get_query_string">GET с пълен низ на заявка</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Отваряне във външен браузър</string>
<string name="test_url">Тествайте URL(Линка)</string>
<string name="send_scan_bluetooth">Препращане на сканиранията с Bluetooth</string>
<string name="send_scan_bluetooth_summary">Активиране на препращане на сканирания към даден Bluetooth хост.</string>
<string name="send_scan_bluetooth_host">Хост</string>
<string name="no_bluetooth_hosts_paired">Няма сдвоени хостове</string>
<string name="bluetooth_connect_fail">Неуспешно свързване с Bluetooth устройство.</string>
<string name="bluetooth_send_fail">Неуспешно изпращане до Bluetooth устройство.</string>
<string name="bluetooth_send_success">Успешно Bluetooth изпращане.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Наистина ли искате да премахнете това сканиране?</string>
<string name="really_remove_all_scans">Наистина ли искате да премахнете всички сканирания?</string>
<string name="really_remove_selected_scans">Наистина ли искате да премахнете избраните сканирания?</string>
<string name="clear_history">Изчистване на историята</string>
<string name="copy_scan">Сопиране на сканирането</string>
<string name="edit_label">Редактиране на етикет</string>
<string name="remove_scan">Премахване на сканиране</string>
<string name="enter_name">Въведете име, за да опишете сканирането</string>
<string name="enter_name_hint">Име на сканирането</string>
<string name="no_barcode_found">Няма намерен баркод</string>
<string name="pick_list_separator">Как бъдат разделени елементите от списъка?</string>
<string name="separator_line_break">Нова линия</string>
<string name="separator_ruler">Лента</string>
<string name="save_as_file_name">Запазване в папка за изтегляния?</string>
<string name="file_name">Име на файл</string>
<string name="error_saving_file">Неуспешно запазване на Файлът</string>
<string name="error_file_exists">Файлът вече съществува</string>
<string name="connect_to_wifi">Свържи се към Wi-Fi</string>
<string name="wifi_config_failed">Неуспешно конфигуриране на Wi-Fi</string>
<string name="wifi_added">Wi-Fi успешно добавен</string>
<string name="sms_send">Изпрати SMS</string>
<string name="sms_error">Неуспешно изпращане на SMS</string>
<string name="tel_dial">Набери номер</string>
<string name="tel_error">Неуспешно набиране на номера</string>
<string name="mail_send">Изпрати писмо</string>
<string name="mail_error">Неуспешно изпращане на имейл</string>
<string name="vcard_add">Добавяне към контактите</string>
<string name="vcard_failed">Неуспешно добавяне към контактите</string>
<string name="vevent_add">Добавяне към календара</string>
<string name="vevent_failed">Неуспешно добавяне към календара</string>
<string name="otpauth_add">Добави 2FA</string>
<string name="search_web">Търси в мрежата</string>
<string name="search_scan">Търсещо сканиране</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Извеждане в файл</string>
<string name="export_as">Извеждане като?</string>
<string name="export_csv_comma">CSV файл със запетаи</string>
<string name="export_csv_semicolon">CSV файл с точки и запетаи</string>
<string name="export_json">JSON файл</string>
<string name="export_database">SQLite база данни</string>
<string name="saved_in_downloads">Запазено в изтеглянията</string>
<string name="rotate_image_cw">Завъртете изображението по часовниковата стрелка</string>
<string name="toggle_free_rotation">Превключване на свободното въртене</string>
<string name="pick_file">Изберете файл</string>
<string name="pick_image_file">Изберете снимка</string>
<string name="pick_code_to_scan">Изберете код за сканиране</string>
<string name="shortcut_decode">Сканирай баркод</string>
<string name="shortcut_encode">Създай баркод</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Настройки</string>
<string name="background_request_failed">Неуспешна заявка в фонов режим</string>
<string name="entry_type">Тип</string>
<string name="wifi_network">Wi-Fi мрежа</string>
<string name="wifi_ssid">Име</string>
<string name="wifi_type">Тип удостоверяване</string>
<string name="wifi_password">Парола</string>
<string name="wifi_hidden">Скрита интернет мрежа</string>
<string name="wifi_eap">EAP метод</string>
<string name="wifi_anonymous_identity">Анонимна идентичност</string>
<string name="wifi_identity">Идентичност</string>
<string name="wifi_phase2">Фаза 2 метод</string>
<string name="network_suggestions">Предложения за интернет мрежа</string>
<string name="remove_suggestion">Премахване на предложението</string>
</resources>
+20 -5
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">মধ্যম (~১৫&#37; ঠিককরণ)</string>
<string name="error_correction_level_q" formatted="false">বেশি (~২৫&#37; ঠিককরণ)</string>
<string name="error_correction_level_h" formatted="false">অনেক বেশি (~৩০&#37; ঠিককরণ)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">আলো</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">ভাগ করো</string>
<string name="share_file">Share as file</string>
<string name="share_as">ভাগ করার মাধ্যম</string>
<string name="copy_to_clipboard">ক্লিপবোর্ডে অনুলিপি</string>
<string name="copied_to_clipboard">ক্লিপবোর্ডে অনুলিপিত</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">খোলার মতো অ্যাপ নেই</string>
<string name="pick_search_engine">একটা সার্চ ইঞ্জিন নাও</string>
<string name="format">ধরণ</string>
<string name="size">পিক্সেলে আকা</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">পিক্সেলে আকা:%1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">এখানে তথ্য দাও</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">সংকেতকরণ</string>
<string name="error_no_content">তথ্য নেই</string>
<string name="error_encoding_barcode">বারকোড বানানো যায়নি</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">ইতিহাস সংরক্ষণ করো।</string>
<string name="use_history_summary">সনাক্তকৃত সংকেত যন্ত্রে সংরক্ষণ করো।</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">দ্বিত্ব উপেক্ষা করো</string>
<string name="ignore_consecutive_duplicates_summary">দুইটা ইতিহাস সংরক্ষণ করবে না।</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">সাথে সাথে খুলো</string>
<string name="open_immediately_summary">না দেখে সাথে সাথে খুলো। সক্রিয় থাকলে ক্ষতিকারক তথ্য খুলতে পারে।</string>
<string name="copy_immediately">ক্লিপবোর্ডে রাখো</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">সনাক্তকৃত বারকোড নিয়ে অতিরিক্ত তথ্য দেখাও।</string>
<string name="show_hex_dump">ষড়(hex) সংকেত দেখাও</string>
<string name="show_hex_dump_summary">পড়া তথ্যের ষড় সংকেত দেখাও</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">অনুলিপি/ভাগ করার পরে পিছনে যাও</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">আসলেই এটা মুছবে?</string>
<string name="really_remove_all_scans">আসলেই সব মুছবে?</string>
<string name="really_remove_selected_scans">আসলেই নির্বাচিত সব মুছবে?</string>
<string name="clear_history">ইতিহাস মুছো</string>
<string name="copy_scan">পাঠোদ্ধার অনুলিপি করো</string>
<string name="edit_scan">চিহ্ন সম্পাদনা করো</string>
<string name="edit_label">চিহ্ন সম্পাদনা করো</string>
<string name="remove_scan">পাঠোদ্ধার মুছো</string>
<string name="enter_name">পাঠোদ্ধার ব্যাখ্যা করতে একটা নাম দাও</string>
<string name="enter_name_hint">পাঠোদ্ধারের নাম</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">২এফএ যোগ করো</string>
<string name="search_web">ওয়েবে খুঁজো</string>
<string name="search_scan">আগেরগুলোতে খুঁজো</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">নথিতে রপ্তানি করো</string>
<string name="export_as">রপ্তানির ধরণ?</string>
<string name="export_csv_comma">কমাসহ সিএসভি(.csv) নথি</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">ডাউনলোডে সংরক্ষিত</string>
<string name="rotate_image_cw">ছবি ঘড়ির দিকে ঘুরাও</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">ছবি নাও</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">ছবি নাও</string>
<string name="pick_code_to_scan">খুঁজার জন্য কোড নাও</string>
<string name="shortcut_decode">বারকোড খুজো</string>
<string name="shortcut_encode">বারকোড বানাও</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">পছন্দসমূহ</string>
<string name="background_request_failed">পটভূমির অনুরোধ ব্যর্থ</string>
<string name="entry_type">Type</string>
+56 -41
View File
@@ -16,23 +16,25 @@
<string name="error_correction_level_m" formatted="false">Střední (~15&#37; korekce)</string>
<string name="error_correction_level_q" formatted="false">Čtvrtinový (~25&#37; korekce)</string>
<string name="error_correction_level_h" formatted="false">Vysoký (~30&#37; korekce)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
<string name="label">Label</string>
<string name="colors">Popředí a pozadí</string>
<string name="colors_black_on_white">Černá na bílé</string>
<string name="colors_white_on_black">Bílá na černé</string>
<string name="colors_black_on_transparent">Černá na průhledné</string>
<string name="colors_white_on_transparent">Bílá na průhledné</string>
<string name="sequence_size">Velikost sekvence</string>
<string name="sequence_index">Index sekvence</string>
<string name="sequence_id">ID sekvence</string>
<string name="gtin_issue_number">Číslo edice</string>
<string name="gtin_country">Možná země původu</string>
<string name="gtin_price">Doporučená cena</string>
<string name="gtin_add_on">rozšíření UPC EAN</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="toggle_flash">Zap/vyp blesk</string>
<string name="barcode_version_number">Verze</string>
<string name="qr_version_and_modules">%1$s (%2$d modulů)</string>
<string name="toggle_flash">Přepnout blesk</string>
<string name="error_flash">Zapnutí/vypnutí blesku selhalo</string>
<string name="share">Sdílet</string>
<string name="share_file">Sdílet jako soubor</string>
<string name="share_as">Sdílet jako</string>
<string name="copy_to_clipboard">Zkopírovat do schránky</string>
<string name="copied_to_clipboard">Zkopírováno do schránky</string>
@@ -42,14 +44,16 @@
<string name="cannot_resolve_action">Nemáte aplikaci, která by toto uměla otevřít</string>
<string name="pick_search_engine">Zvolte vyhledávač</string>
<string name="format">Formát</string>
<string name="size">Velikost v pixelech</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Velikost v pixelech: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Okraje v pixelech: %1$d</string>
<string name="input_content_here">Sem vložte obsah</string>
<string name="unescape">Rozšířit escape sekvence</string>
<string name="encode">ZAKÓDOVAT</string>
<string name="error_no_content">Chybí obsah</string>
<string name="error_encoding_barcode">Nepodařilo se vygenerovat čárový kód</string>
<string name="view_barcode">Zobrazit čárový kód</string>
<string name="info">Info</string>
<string name="info">Informace</string>
<string name="switch_camera">Přepnout kameru</string>
<string name="bulk_mode">Skenovat nepřetržitě</string>
<string name="bulk_mode_summary">Vždy začít v módu nepřetržitého skenování.</string>
@@ -82,19 +86,21 @@
<string name="show_toast_in_bulk_mode_summary">Krátce zobrazit data v módu nepřetržitého skenování.</string>
<string name="vibrate">Zavibrovat při detekování</string>
<string name="vibrate_summary">Zařízení zavibruje, když rozpozná čárový kód.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="beep">Pípnout při rozpoznání</string>
<string name="beep_summary">Povolte, pokud chcete pípnutí při rozpoznání kódu.</string>
<string name="beep_tone">Tón pípnutí</string>
<string name="tone_cdma_confirm">Potvrzení CDMA</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="tone_prop_ack">Kladné potvrzení příjmu</string>
<string name="tone_prop_beep">Obecné pípnutí</string>
<string name="tone_prop_beep2">Dvojité obecné pípnutí</string>
<string name="use_history">Ukládat historii skenování</string>
<string name="use_history_summary">Rozpoznané kódy se uloží do zařízení.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorovat duplikáty</string>
<string name="ignore_consecutive_duplicates_summary">Další skeny stejného kódu se nebudou ukládat.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Otevírat okamžitě</string>
<string name="open_immediately_summary">Přeskočí kontrolu a otevře obsah okamžitě. Může otevřít škodlivý obsah.</string>
<string name="copy_immediately">Vložit do schránky</string>
@@ -103,8 +109,10 @@
<string name="show_meta_data_summary">Zobrazí další data o naskenovaném čárovém kódu.</string>
<string name="show_hex_dump">Zobrazit hex dump</string>
<string name="show_hex_dump_summary">Zobrazí hex dump naskenovaného obsahu.</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Zobrazit zrekonstruovaný kód</string>
<string name="show_recreation_summary">Zrekonstruovat a zobrazit čárový kód z přečteného obrazu, pokud je to možné.</string>
<string name="close_automatically">Vrátit se po zkopírování/sdílení</string>
<string name="close_automatically_summary">Po zkopírovaní či sdílení se automaticky vrátí na skenovací obrazovku.</string>
<string name="default_search_engine">Nerozpoznaná data otevřít v</string>
@@ -114,31 +122,34 @@
<string name="clear_network_suggestions_summary">Smazat všechny sítě, které byly navrženy touto aplikací.</string>
<string name="really_remove_all_networks">Opravdu smazat všechny sítě?</string>
<string name="clear_network_suggestions_success">Navrhované sítě smazány</string>
<string name="clear_network_suggestions_nothing_to_remove">Nic k smazání</string>
<string name="clear_network_suggestions_nothing_to_remove">Nic ke smazání</string>
<string name="send_category">Předávání</string>
<string name="send_scan_active">Předávat skeny</string>
<string name="send_scan_active_summary">Zapnout předávání skenů na danou URL</string>
<string name="send_scan_url">Posílat každý sken na URL</string>
<string name="send_scan_type">Typ requestu pro každý sken</string>
<string name="send_scan_type">Typ požadavku pro každý sken</string>
<string name="send_type_get_add_content">GET a simply add content</string>
<string name="send_type_get_query_string">GET with complete query string</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Otevřít v prohlížeči</string>
<string name="test_url">Otestovat URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="send_scan_bluetooth">Přesměrovat skeny přes Bluetooth</string>
<string name="send_scan_bluetooth_summary">Skeny se přesměrují na daného hostitele Bluetooth.</string>
<string name="send_scan_bluetooth_host">Hostitel</string>
<string name="no_bluetooth_hosts_paired">Není spárován žádný hostitel</string>
<string name="bluetooth_connect_fail">Nelze se připojit k zařízení Bluetooth.</string>
<string name="bluetooth_send_fail">Nelze odesílat na zařízení Bluetooth.</string>
<string name="bluetooth_send_success">Odesílání přes Bluetooth se zdařilo.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Opravdu odstranit sken?</string>
<string name="really_remove_all_scans">Opravdu odstranit všechny skeny?</string>
<string name="really_remove_selected_scans">Opravdu odstranit zvolené skeny?</string>
<string name="clear_history">Vymazat historii</string>
<string name="copy_scan">Zkopírovat sken</string>
<string name="edit_scan">Upravit popisek</string>
<string name="edit_label">Upravit popisek</string>
<string name="remove_scan">Odstranit sken</string>
<string name="enter_name">Napište název popisující sken</string>
<string name="enter_name_hint">Název skenu</string>
@@ -150,9 +161,9 @@
<string name="file_name">Název souboru</string>
<string name="error_saving_file">Soubor se nepodařilo uložit</string>
<string name="error_file_exists">Soubor již existuje</string>
<string name="connect_to_wifi">Připojit k WiFi</string>
<string name="wifi_config_failed">Nepodařilo se nastavit WiFi</string>
<string name="wifi_added">WiFi přidána</string>
<string name="connect_to_wifi">Připojit k Wi-Fi</string>
<string name="wifi_config_failed">Nepodařilo se nastavit Wi-Fi</string>
<string name="wifi_added">Wi-Fi přidána</string>
<string name="sms_send">Poslat SMS</string>
<string name="sms_error">Nepodařilo se poslat SMS</string>
<string name="tel_dial">Vytočit číslo</string>
@@ -166,6 +177,8 @@
<string name="otpauth_add">Přidat 2FA</string>
<string name="search_web">Vyhledat na webu</string>
<string name="search_scan">Vyhledat sken</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportovat do souboru</string>
<string name="export_as">Exportovat jako</string>
<string name="export_csv_comma">CSV oddělené čárkami</string>
@@ -174,11 +187,13 @@
<string name="export_database">SQLite databáze</string>
<string name="saved_in_downloads">Uloženo do složky Stahování</string>
<string name="rotate_image_cw">Otočit obrázek po směru hodinových ručiček</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Vybrat obrázek</string>
<string name="toggle_free_rotation">Přepnout zámek natočení</string>
<string name="pick_file">Vybrat soubor</string>
<string name="pick_image_file">Vybrat obrázek</string>
<string name="pick_code_to_scan">Vyberte kód k naskenování</string>
<string name="shortcut_decode">Skenovat čárový kód</string>
<string name="shortcut_encode">Vytvořit čárový kód</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Nastavení</string>
<string name="background_request_failed">Požadavek na pozadí selhal</string>
<string name="entry_type">Typ</string>
@@ -191,6 +206,6 @@
<string name="wifi_anonymous_identity">Anonymní identita</string>
<string name="wifi_identity">Identita</string>
<string name="wifi_phase2">Ověření Phase 2</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="network_suggestions">Návrhy sítí</string>
<string name="remove_suggestion">Odebrat návrh</string>
</resources>
+20 -5
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; korrigering)</string>
<string name="error_correction_level_q" formatted="false">Kvartil (~25&#37; korrigering)</string>
<string name="error_correction_level_h" formatted="false">Høj (~30&#37; korrigering)</string>
<string name="label">Label</string>
<string name="colors">For- og baggrund</string>
<string name="colors_black_on_white">Sort på hvidt</string>
<string name="colors_white_on_black">Hvid på sort</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">Slå blitz til/fra</string>
<string name="error_flash">Der opstod en fejl ved at slå blitz til/fra</string>
<string name="share">Del</string>
<string name="share_file">Share as file</string>
<string name="share_as">Del som?</string>
<string name="copy_to_clipboard">Kopier til udklipsholder</string>
<string name="copied_to_clipboard">Kopieret til udklipsholder</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">Inge applikation kan åbne det</string>
<string name="pick_search_engine">Vælg en søgemaskine</string>
<string name="format">Format</string>
<string name="size">Størrelse i pixels</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Størrelse i pixels: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Indtast indhold her</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">INDKOD</string>
<string name="error_no_content">Manglende indhold</string>
<string name="error_encoding_barcode">Stregkode kan ikke genereres</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">Generelt dobbelt bip</string>
<string name="use_history">Gem scanningshistorik</string>
<string name="use_history_summary">Gem genkendte koder på din enhed.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorer dubletter</string>
<string name="ignore_consecutive_duplicates_summary">Gem ikke fortløbende dubletter i scanningshistorikken.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Åbn straks</string>
<string name="open_immediately_summary">Spring inspektion over og åbn indholdet med det samme. Kan åbne skadeligt indhold, hvis det er aktiveret.</string>
<string name="copy_immediately">Læg i udklipsholderen</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">Vis yderligere data om den scannede stregkode.</string>
<string name="show_hex_dump">Vis hex-dump</string>
<string name="show_hex_dump_summary">Vis et hex-dump af det scannede indhold.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Vis genskabt stregkode</string>
<string name="show_recreation_summary">Genskab og vis stregkode fra læst indhold, hvis det er muligt.</string>
<string name="close_automatically">Gå tilbage efter Kopier/Del</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Vil du virkelig fjerne scanningen?</string>
<string name="really_remove_all_scans">Vil du virkelig fjerne alle scanninger?</string>
<string name="really_remove_selected_scans">Vil du virkelig fjerne valgte scanninger?</string>
<string name="clear_history">Ryd historik</string>
<string name="copy_scan">Kopier scanning</string>
<string name="edit_scan">Rediger etiket</string>
<string name="edit_label">Rediger etiket</string>
<string name="remove_scan">Fjern scanning</string>
<string name="enter_name">Indtast et navn for at beskrive scanningen</string>
<string name="enter_name_hint">Navn på scanningen</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">Tilføj 2FA</string>
<string name="search_web">Søg på nettet</string>
<string name="search_scan">Søg scanning</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Eksporter til fil</string>
<string name="export_as">Eksporter som?</string>
<string name="export_csv_comma">CSV-fil med kommaer</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">Gemt i downloads</string>
<string name="rotate_image_cw">Roter billedet med uret</string>
<string name="toggle_free_rotation">Slå fri rotation til/fra</string>
<string name="pick_file">Vælg billedfil</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Vælg billedfil</string>
<string name="pick_code_to_scan">Vælg kode til at scanne</string>
<string name="shortcut_decode">Scan en stregkode</string>
<string name="shortcut_encode">Opret en stregkode</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Indstillinger</string>
<string name="background_request_failed">Baggrundsanmodning mislykkedes</string>
<string name="entry_type">Type</string>
@@ -2,6 +2,7 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>Google</item>
<item>Brave Search</item>
<item>DuckDuckGo</item>
<item>Qwant</item>
<item>Bing</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.de/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+21 -6
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; wiederherstellbar)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; wiederherstellbar)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; wiederherstellbar)</string>
<string name="label">Bezeichnung</string>
<string name="colors">Vor und Hintergrund</string>
<string name="colors_black_on_white">Schwarz auf Weiß</string>
<string name="colors_white_on_black">Weiß auf Schwarz</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">Licht an/ausschalten</string>
<string name="error_flash">Fehler beim ein/ausschalten des Lichts</string>
<string name="share">Teilen</string>
<string name="share_file">Als Datei teilen</string>
<string name="share_as">Teilen als?</string>
<string name="copy_to_clipboard">In die Zwischenablage kopieren</string>
<string name="copied_to_clipboard">Inhalt wurde in die Zwischenablage kopiert</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">Keine App kann das öffnen</string>
<string name="pick_search_engine">Suchmaschine auswählen</string>
<string name="format">Format</string>
<string name="size">Größe in Pixel</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Größe in Pixel: %1$d×%2$d</string>
<string name="size_no_magnification">Keine Vergrößerung</string>
<string name="margin_size">Randgröße in Pixel: %1$d</string>
<string name="input_content_here">Gib den Inhalt hier ein</string>
<string name="unescape">Escape-Sequenzen interpretieren</string>
<string name="encode">KODIEREN</string>
<string name="error_no_content">Fehlender Inhalt</string>
<string name="error_encoding_barcode">Barcode kann nicht generiert werden</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Codes speichern</string>
<string name="use_history_summary">Eingelesene Barcodes auf dem Gerät speichern.</string>
<string name="ignore_consecutive_duplicates">Duplikate ignorieren</string>
<string name="ignore_consecutive_duplicates_summary">Aufeinanderfolgende Duplikate werden nicht in der Scan-Historie gespeichert.</string>
<string name="ignore_duplicates">Ignoriere Duplikate</string>
<string name="ignore_consecutive_duplicates">Aufeinanderfolgende Duplikate</string>
<string name="ignore_any_duplicates">Jedes Duplicat</string>
<string name="accept_duplicates">Akzeptiere Duplikate</string>
<string name="open_immediately">Inhalte sofort öffnen</string>
<string name="open_immediately_summary">Inspektion überspringen und Inhalt sofort öffnen. Kann schädliche Inhalte öffnen, wenn aktiviert.</string>
<string name="copy_immediately">Automatisch in Zwischenablage</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">Zusätzliche Daten über den eingelesenen Barcode anzeigen.</string>
<string name="show_hex_dump">Hex Dump anzeigen</string>
<string name="show_hex_dump_summary">Zeigt einen Hexdump des eingelesenen Inhalts an.</string>
<string name="show_checksum">Prüfsumme anzeigen</string>
<string name="no_checksum">Keine Prüfsumme anzeigen</string>
<string name="show_recreation">Wiederhergestellten Barcode anzeigen</string>
<string name="show_recreation_summary">Barcode aus dem gelesenen Inhalt wiederherstellen und anzeigen, wenn möglich.</string>
<string name="close_automatically">Automatisch zurückkehren</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Es kann leider keine Verbindung zum Bluetooth-Gerät hergestellt werden</string>
<string name="bluetooth_send_fail">Senden zum Bluetooth-Gerät fehlgeschlagen</string>
<string name="bluetooth_send_success">Erfolgreich zum Bluetooth-Gerät gesendet</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Bildschrim aufhellen</string>
<string name="brighten_screen_summary">Helligkeit auf Maximum stellen um das Scannen eines Barcodes vom Bildschirm zu verbessern.</string>
<string name="really_remove_scan">Code wirklich entfernen?</string>
<string name="really_remove_all_scans">Alle Codes entfernen?</string>
<string name="really_remove_selected_scans">Alle ausgewählten Codes entfernen?</string>
<string name="clear_history">Gespeicherte Codes löschen</string>
<string name="copy_scan">Code kopieren</string>
<string name="edit_scan">Bezeichnung ändern</string>
<string name="edit_label">Bezeichnung ändern</string>
<string name="remove_scan">Code löschen</string>
<string name="enter_name">Geben Sie eine Bezeichnung für den Code ein</string>
<string name="enter_name_hint">Bezeichung des Codes</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">2FA hinzufügen</string>
<string name="search_web">Suche im Internet</string>
<string name="search_scan">Code suchen</string>
<string name="add_to_history">Zu gespeicherten Codes hinzufügen</string>
<string name="added_to_history">Zu den gespeicherten Codes hinzugefügt</string>
<string name="export_to_file">In Datei exportieren</string>
<string name="export_as">Exportieren als?</string>
<string name="export_csv_comma">CSV Datei mit Kommas</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">In den Downloads gespeichert</string>
<string name="rotate_image_cw">Bild im Uhrzeigersinn rotieren</string>
<string name="toggle_free_rotation">Freie Rotation ein/ausschalten</string>
<string name="pick_file">Bilddatei auswählen</string>
<string name="pick_file">Datei auswählen</string>
<string name="pick_image_file">Bilddatei auswählen</string>
<string name="pick_code_to_scan">Code im Bild auswählen</string>
<string name="shortcut_decode">Barcode lesen</string>
<string name="shortcut_encode">Barcode erstellen</string>
<string name="shortcut_history">Verlauf</string>
<string name="shortcut_preferences">Einstellungen</string>
<string name="background_request_failed">Hintergrundanfrage fehlgeschlagen</string>
<string name="entry_type">Typ</string>
+86 -71
View File
@@ -1,7 +1,7 @@
<resources>
<string name="camera_error">No se puede acceder a la cámara, por favor, inténtelo de nuevo</string>
<string name="scan_code">Escanear código de barras</string>
<string name="compose_barcode">Componer código de barras</string>
<string name="scan_code">Escanear código</string>
<string name="compose_barcode">Componer código</string>
<string name="decode_barcode">Decodificar código de barras</string>
<string name="content">Contenido</string>
<string name="binary_data">(datos binarios)</string>
@@ -14,23 +14,25 @@
<string name="error_correction_level_m" formatted="false">Medio (~15&#37; de correción)</string>
<string name="error_correction_level_q" formatted="false">Cuartil (~25&#37; de correción)</string>
<string name="error_correction_level_h" formatted="false">Alto (~30&#37; de correción)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
<string name="label">Label</string>
<string name="colors">Color frontal y fondo</string>
<string name="colors_black_on_white">Negro sobre blanco</string>
<string name="colors_white_on_black">Blanco sobre negro</string>
<string name="colors_black_on_transparent">Negro sobre transparente</string>
<string name="colors_white_on_transparent">Blanco sobre transparente</string>
<string name="sequence_size">Tamaño secuencia</string>
<string name="sequence_index">Índice secuencia</string>
<string name="sequence_id">ID secuencia</string>
<string name="gtin_issue_number">Número de emisión</string>
<string name="gtin_country">Posible país de fabricación</string>
<string name="gtin_price">Precio sugerido</string>
<string name="gtin_add_on">Extensión UPC EAN</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="qr_version_and_modules">%1$s (%2$d modulos)</string>
<string name="toggle_flash">Activar el flash</string>
<string name="error_flash">Error toggling flash</string>
<string name="error_flash">Error activando flash</string>
<string name="share">Compartir</string>
<string name="share_file">Compartir como archivo</string>
<string name="share_as">¿Compartir como?</string>
<string name="copy_to_clipboard">Copiar al portapapeles</string>
<string name="copied_to_clipboard">Copiado al portapapeles</string>
@@ -38,19 +40,21 @@
<string name="copied_password_to_clipboard">Contraseña copiada al portapapeles</string>
<string name="open_url">Abrir URL</string>
<string name="cannot_resolve_action">Ninguna aplicación puede abrir eso</string>
<string name="pick_search_engine">Elija un motor de búsqueda</string>
<string name="pick_search_engine">Seleccionar motor de búsqueda</string>
<string name="format">Formato</string>
<string name="size">Tamaño en píxeles</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Tamaño en píxeles: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margen en pixeles: %1$d</string>
<string name="input_content_here">Introduzca el contenido aquí</string>
<string name="unescape">Expandir secuencia de escape</string>
<string name="encode">CODIFICAR</string>
<string name="error_no_content">Contenido no disponible</string>
<string name="error_encoding_barcode">No se pudo generar el código de barras</string>
<string name="view_barcode">Ver código de barras</string>
<string name="info">Información</string>
<string name="switch_camera">Cambiar cámara</string>
<string name="bulk_mode">Escanear constantemente</string>
<string name="bulk_mode_summary">Siempre iniciar escaneando constantemente</string>
<string name="bulk_mode">Escaneo continuo</string>
<string name="bulk_mode_summary">Iniciar siempre en modo de escaneo continuo</string>
<string name="bulk_mode_delay">Demora entre escaneos continuos</string>
<string name="restrict_format">Restringir formato</string>
<string name="remove_restriction">Eliminar restricción</string>
@@ -67,55 +71,59 @@
<string name="locale_category">Idioma</string>
<string name="custom_locale">Idioma personalizado</string>
<string name="follow_system_settings">Seguir los ajustes del sistema</string>
<string name="show_crop_handle">Mostrar el delimitador de recorte</string>
<string name="show_crop_handle_summary">Restringir el escaneo a una región personalizable.</string>
<string name="show_crop_handle">Mostrar delimitador de recorte</string>
<string name="show_crop_handle_summary">Permite personalizar la región a escanear.</string>
<string name="barcode_formats">Formatos de códigos de barras</string>
<string name="zoom_by_swiping">Deslice hacia arriba/abajo para ampliar</string>
<string name="zoom_by_swiping_summary">Deslice su dedo hacia arriba o abajo en la pantalla para controlar el aumento de la cámara.</string>
<string name="auto_rotate">Reconocer los códigos de barras 1D verticalmente</string>
<string name="auto_rotate_summary">Rotar automáticamente el marco de la cámara para reconocer los códigos de barras 1D verticales. Dependiendo del dispositivo, esto puede afectar al rendimiento.</string>
<string name="zoom_by_swiping">Ampliar deslizando arriba/abajo</string>
<string name="zoom_by_swiping_summary">Deslice el dedo hacia arriba o abajo sobre la pantalla para controlar el zoom de la cámara.</string>
<string name="auto_rotate">Reconocer códigos 1D verticales</string>
<string name="auto_rotate_summary">Rota automáticamente el marco de la cámara para reconocer los códigos de barras 1D verticales. Dependiendo del dispositivo, podría afectar al rendimiento.</string>
<string name="try_harder">Optimizar la precisión del lector</string>
<string name="try_harder_summary">Active esta opción para códigos muy difíciles de leer. Esto afectará al rendimiento.</string>
<string name="show_toast_in_bulk_mode">Mostrar datos en el modo constante</string>
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente los datos escaneados al escanear constantemente. </string>
<string name="vibrate">Vibrar al detectar</string>
<string name="vibrate_summary">Active esta opción si desea que su dispositivo vibre cuando se reconozca un código.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="vibrate">Vibración al detectar</string>
<string name="vibrate_summary">El dispositivo vibra cuando se reconoce un código.</string>
<string name="beep">Sonido al detectar</string>
<string name="beep_summary">El dispositivo emite un sonido cuando se reconoce un código.</string>
<string name="beep_tone">Sonido</string>
<string name="tone_cdma_confirm">Confirmar CDMA</string>
<string name="tone_sup_confirm">Confirmar llamada de supervisión</string>
<string name="tone_sup_radio_ack">Reconocer ruta de radio de llamada de supervisión</string>
<string name="tone_prop_ack">Reconocimiento positivo</string>
<string name="tone_prop_beep">Sonido general</string>
<string name="tone_prop_beep2">Sonido doble general</string>
<string name="use_history">Guardar historial de escaneo</string>
<string name="use_history_summary">Guardar códigos reconocidos en su dispositivo.</string>
<string name="use_history_summary">Guarda los códigos reconocidos en su dispositivo.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignorar duplicados</string>
<string name="ignore_consecutive_duplicates_summary">No guarde duplicados consecutivos en el historial de escaneo.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Abrir inmediatamente</string>
<string name="open_immediately_summary">Omite la inspección y abre el contenido inmediatamente. Puede abrir contenido dañino si está activado.</string>
<string name="copy_immediately">Poner en el portapapeles</string>
<string name="copy_immediately_summary">Copiar contenido al portapapeles automáticamente. Ten en cuenta que otras aplicaciones pueden husmear en tu portapapeles en segundo plano.</string>
<string name="open_immediately_summary">Omite la inspección y abre el contenido inmediatamente. Podría abrir contenido dañino si está activado.</string>
<string name="copy_immediately">Copiar en el portapapeles</string>
<string name="copy_immediately_summary">Copia automáticamente el contenido al portapapeles. Ten en cuenta que otras aplicaciones pueden husmear en tu portapapeles en segundo plano.</string>
<string name="show_meta_data">Mostrar metadatos</string>
<string name="show_meta_data_summary">Mostrar datos adicionales del código escaneado.</string>
<string name="show_hex_dump">Mostrar dump hexadecimal</string>
<string name="show_hex_dump_summary">Mostrar un dump hexadecimal del contenido escaneado.</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Retroceder luego de Copiar/Compartir</string>
<string name="close_automatically_summary">Regresar automáticamente a la pantalla de escaneo luego de copiar o compartir el contenido leído.</string>
<string name="show_meta_data_summary">Muestra datos adicionales del código escaneado.</string>
<string name="show_hex_dump">Mostrar volcado hexadecimal</string>
<string name="show_hex_dump_summary">Muestra un volcado hexadecimal del contenido escaneado.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Mostrar reconstrucción del código</string>
<string name="show_recreation_summary">Reconstruye y muestra el código de barras desde el contenido leído si es posible.</string>
<string name="close_automatically">Retroceder tras Copiar/Compartir</string>
<string name="close_automatically_summary">Retrocede automáticamente a la pantalla de escaneo después de copiar o compartir el contenido leído.</string>
<string name="default_search_engine">Abrir datos desconocidos en</string>
<string name="always_ask">Preguntar siempre</string>
<string name="open_with_url">Abrir datos desconocidos con la URL</string>
<string name="clear_network_suggestions">Borrar las sugerencias de red</string>
<string name="clear_network_suggestions_summary">Elimina todas las sugerencias de red previamente proporcionadas por esta aplicación.</string>
<string name="open_with_url">Abrir datos desconocidos en la URL</string>
<string name="clear_network_suggestions">Eliminar sugerencias de red</string>
<string name="clear_network_suggestions_summary">Elimina todas las sugerencias de red proporcionadas por esta aplicación.</string>
<string name="really_remove_all_networks">¿Realmente eliminar todas las redes?</string>
<string name="clear_network_suggestions_success">Sugerencias de red eliminadas</string>
<string name="clear_network_suggestions_nothing_to_remove">Nada que eliminar</string>
<string name="send_category">Reenvío</string>
<string name="send_scan_active">Forward scans</string>
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
<string name="send_scan_active">Enviar escaneos</string>
<string name="send_scan_active_summary">Habilita el envío de escaneos a una URL</string>
<string name="send_scan_url">Enviar todo escaneo a la URL</string>
<string name="send_scan_type">Tipo de solicitud para cada escaneo</string>
<string name="send_type_get_add_content">GET y solo añadir contenido</string>
@@ -124,20 +132,23 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Abrir en el navegador</string>
<string name="test_url">URL de prueba</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth">Enviar escaneos con Bluetooth</string>
<string name="send_scan_bluetooth_summary">Habilita el envío de escaneos a un host Bluetooth.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="really_remove_scan">¿Realmente desea borrar el escaneo seleccionado?</string>
<string name="really_remove_all_scans">¿Realmente desea borrar todo lo escaneado?</string>
<string name="really_remove_selected_scans">¿Realmente desea borrar los escaneos seleccionados?</string>
<string name="clear_history">Borrar el historial</string>
<string name="no_bluetooth_hosts_paired">Ningún host emparejado</string>
<string name="bluetooth_connect_fail">No se pudo conectar a un dispositivo bluetooth.</string>
<string name="bluetooth_send_fail">No se pudo enviar a un dispositivo bluetooth.</string>
<string name="bluetooth_send_success">Envío bluetooth completado.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">¿Eliminar el escaneo seleccionado?</string>
<string name="really_remove_all_scans">¿Eliminar todos los escaneos?</string>
<string name="really_remove_selected_scans">¿Eliminar los escaneos seleccionados?</string>
<string name="clear_history">Eliminar el historial</string>
<string name="copy_scan">Copiar escaneo</string>
<string name="edit_scan">Editar etiqueta</string>
<string name="remove_scan">Borrar escaneo</string>
<string name="edit_label">Editar etiqueta</string>
<string name="remove_scan">Eliminar escaneo</string>
<string name="enter_name">Introduzca un nombre para describir el escaneo</string>
<string name="enter_name_hint">Nombre del escaneo</string>
<string name="no_barcode_found">No se encontró ningún código de barras</string>
@@ -152,7 +163,7 @@
<string name="wifi_config_failed">No se pudo configurar el Wifi</string>
<string name="wifi_added">Wifi añadido</string>
<string name="sms_send">Enviar SMS</string>
<string name="sms_error">No se puedo enviar SMS</string>
<string name="sms_error">No se pudo enviar SMS</string>
<string name="tel_dial">Marcar número</string>
<string name="tel_error">No se pudo marcar el número</string>
<string name="mail_send">Enviar correo</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">Añadir 2FA</string>
<string name="search_web">Buscar en la web</string>
<string name="search_scan">Buscar escaneo</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportar a archivo</string>
<string name="export_as">¿Exportar como?</string>
<string name="export_csv_comma">Archivo CSV con comas</string>
@@ -172,15 +185,17 @@
<string name="export_database">Base de datos SQLite</string>
<string name="saved_in_downloads">Guardado en Descargas</string>
<string name="rotate_image_cw">Rotar la imagen en sentido horario</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Seleccionar imagen</string>
<string name="toggle_free_rotation">Activar rotación libre</string>
<string name="pick_file">Seleccionar archivo</string>
<string name="pick_image_file">Seleccionar imagen</string>
<string name="pick_code_to_scan">Seleccione el código a escanear</string>
<string name="shortcut_decode">Escanear un código</string>
<string name="shortcut_encode">Crear un código</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Ajustes</string>
<string name="background_request_failed">Solicitud de fondo fallida</string>
<string name="entry_type">Type</string>
<string name="wifi_network">Red wi-fi</string>
<string name="entry_type">Tipo</string>
<string name="wifi_network">Red WiFi</string>
<string name="wifi_ssid">Nombre</string>
<string name="wifi_type">Tipo de autenticación</string>
<string name="wifi_password">Contraseña</string>
@@ -188,7 +203,7 @@
<string name="wifi_eap">Método EAP</string>
<string name="wifi_anonymous_identity">Identidad anónima</string>
<string name="wifi_identity">Identidad</string>
<string name="wifi_phase2">Phase 2 method</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="wifi_phase2">Método Phase 2</string>
<string name="network_suggestions">Sugerencias de red</string>
<string name="remove_suggestion">Eliminar sugerencia</string>
</resources>
@@ -2,6 +2,7 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>گوگل</item>
<item>Brave Search</item>
<item>داک‌داک‌گو</item>
<item>Qwant</item>
<item>بینگ</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.com/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+20 -5
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">متوسط (⁦~۱۵٪⁩ تصحیح)</string>
<string name="error_correction_level_q" formatted="false">یک‌چهارم (⁦~۲۵٪⁩ تصحیح)</string>
<string name="error_correction_level_h" formatted="false">زیاد (~۳۰٪⁩ تصحیح)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">روشن/خاموش کردن چراغ</string>
<string name="error_flash">خطا هنگام روشن/خاموش کردن چراغ</string>
<string name="share">هم‌رسانی</string>
<string name="share_file">Share as file</string>
<string name="share_as">هم‌رسانی به عنوان؟</string>
<string name="copy_to_clipboard">رونوشت به تخه‌گیره</string>
<string name="copied_to_clipboard">به تخته‌گیره رونوشت شد</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">هیچ برنامه‌ای نمی‌تواند آن را بگشاید</string>
<string name="pick_search_engine">یک موتور جست‌وجو برگزینید</string>
<string name="format">قالب</string>
<string name="size">اندازه به پیکسل</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">اندازه به پیکسل: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">محتویات ورودی را اینجا بنویسید</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">رمزگذاری</string>
<string name="error_no_content">محتویاتی نیست</string>
<string name="error_encoding_barcode">بارکد نمی‌تواند ایجاد شود</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">ذخیرهٔ تاریخچهٔ پویش</string>
<string name="use_history_summary">کدهای شناسایی شده را در همین دستگاه ذخیره می‌کند.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">نادیده گرفتن موارد تکراری</string>
<string name="ignore_consecutive_duplicates_summary">موارد تکراری متوالی را در تاریخچهٔ پویش ذخیره نمی‌کند.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">گشودن بلافاصله</string>
<string name="open_immediately_summary">بازرسی را رها کنید و محتویات را فورا باز کنید. در صورت فعال بودن ممکن است محتوای مضر را باز کند.</string>
<string name="copy_immediately">قرار دادن در تخته‌گیره</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">نمایش داده‌های اضافی در مورد بارکد پویش شده.</string>
<string name="show_hex_dump">نمایش کد هگز استخراج شده</string>
<string name="show_hex_dump_summary">نمایش کد هگز استخراج شده از محتویات پویش شده.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">بازگشت پس از رونوشت یا هم‌رسانی</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">برای برداشتن پویش مطمئنید؟</string>
<string name="really_remove_all_scans">برای برداشتن همهٔ پویش‌ها مطمئنید؟</string>
<string name="really_remove_selected_scans">برای برداشتن پویش‌های برگزیده شده مطمئنید؟</string>
<string name="clear_history">پاک کردن تاریخچه</string>
<string name="copy_scan">رونوشت پویش</string>
<string name="edit_scan">ویرایش عنوان</string>
<string name="edit_label">ویرایش عنوان</string>
<string name="remove_scan">برداشتن پویش</string>
<string name="enter_name">یک نام برای توضیح پویش وارد کنید</string>
<string name="enter_name_hint">نام پویش</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">افزودن احراز هویت چندعاملی(2FA)</string>
<string name="search_web">جست‌وجوی وب</string>
<string name="search_scan">جست‌وجوی پویش</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">برون‌ریزی به پرونده</string>
<string name="export_as">برون‌ریزی به عنوان؟</string>
<string name="export_csv_comma">پروندهٔ سی‌اس‌وی با ویرگول</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">در بارگیری‌ها ذخیره شد</string>
<string name="rotate_image_cw">تصویر را در جهت ساعتگرد بچرخانید</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">پروندهٔ تصویری را برگزینید</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">پروندهٔ تصویری را برگزینید</string>
<string name="pick_code_to_scan">کدی را برای پویش برگزینید</string>
<string name="shortcut_decode">پویش یک بارکد</string>
<string name="shortcut_encode">ایجاد یک بارکد</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">تنظیمات</string>
<string name="background_request_failed">درخواست پس‌زمینه انجام نشد</string>
<string name="entry_type">گونه</string>
+74 -60
View File
@@ -1,13 +1,12 @@
<resources>
<string name="camera_error">Impossible d\'accéder à la caméra, veuillez réessayer</string>
<string name="scan_code">Scanner le code</string>
<string name="scan_code">Scanner un code</string>
<string name="compose_barcode">Créer un code-barres</string>
<string name="decode_barcode">Décoder le code-barres</string>
<string name="content">Contenu</string>
<string name="binary_data">(données binaires)</string>
<plurals name="barcode_info">
<item quantity="one">%2$d caractère, %1$s</item>
<item quantity="many">%2$d caractères, %1$s</item>
<item quantity="other">%2$d caractères, %1$s</item>
</plurals>
<string name="error_correction_level">Niveau de correction d\'erreur</string>
@@ -15,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Moyen (~15% de correction)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25% de correction)</string>
<string name="error_correction_level_h" formatted="false">Élevé (~30% de correction)</string>
<string name="label">Label</string>
<string name="colors">Premier plan et arrière-plan</string>
<string name="colors_black_on_white">Noir sur blanc</string>
<string name="colors_white_on_black">Blanc sur noir</string>
@@ -29,29 +29,32 @@
<string name="gtin_add_on">Extension UPC EAN</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="toggle_flash">Activer le flash</string>
<string name="error_flash">Erreur de basculement du flash</string>
<string name="toggle_flash">Activer/Désactiver le flash</string>
<string name="error_flash">Erreur de changement d\'état du flash</string>
<string name="share">Partager</string>
<string name="share_as">Partager comme ?</string>
<string name="share_file">Partager en tant que fichier</string>
<string name="share_as">Partager en tant que ?</string>
<string name="copy_to_clipboard">Copier dans le presse-papiers</string>
<string name="copied_to_clipboard">Copié dans le presse-papiers</string>
<string name="copy_password">Copier le mot de passe dans le presse-papiers</string>
<string name="copied_password_to_clipboard">Mot de passe copié dans le presse-papiers</string>
<string name="open_url">Ouvrir l\'url</string>
<string name="open_url">Ouvrir l\'URL</string>
<string name="cannot_resolve_action">Aucune application ne peut ouvrir cela</string>
<string name="pick_search_engine">Choisir un moteur de recherche</string>
<string name="format">Format</string>
<string name="size">Taille en pixels</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="input_content_here">Votre contenu ici</string>
<string name="size_width_by_height">Taille en pixels : %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Marge en pixels : %1$d</string>
<string name="input_content_here">Insérer le contenu ici</string>
<string name="unescape">Étendre les caractères d\'échappement</string>
<string name="encode">ENCODER</string>
<string name="error_no_content">Contenu manquant</string>
<string name="error_encoding_barcode">Le code-barres ne peut pas être généré</string>
<string name="view_barcode">Voir le code barre</string>
<string name="info">Info</string>
<string name="switch_camera">Changer de camera</string>
<string name="bulk_mode">Scan continu</string>
<string name="bulk_mode_summary">Démarre toujours en scan continu.</string>
<string name="view_barcode">Voir le code-barres</string>
<string name="info">Informations</string>
<string name="switch_camera">Changer de caméra</string>
<string name="bulk_mode">Scanner en continu</string>
<string name="bulk_mode_summary">Toujours démarrer avec le scan en continu.</string>
<string name="bulk_mode_delay">Délai entre les scans continus</string>
<string name="restrict_format">Restreindre le format</string>
<string name="remove_restriction">Supprimer la restriction</string>
@@ -68,22 +71,22 @@
<string name="locale_category">Langue</string>
<string name="custom_locale">Langue personnalisée</string>
<string name="follow_system_settings">Suivre les réglages du système</string>
<string name="show_crop_handle">Afficher le bouton de rognage</string>
<string name="show_crop_handle_summary">Restreint le scan à une région personnalisée.</string>
<string name="show_crop_handle">Afficher le contrôle du cadrage</string>
<string name="show_crop_handle_summary">Restreindre le scan à une zone personnalisée.</string>
<string name="barcode_formats">Formats de codes-barres</string>
<string name="zoom_by_swiping">Balayage haut/bas pour zoomer</string>
<string name="zoom_by_swiping_summary">Balayez vers le haut ou vers le bas dans l’écran de la caméra pour contrôler le zoom de la caméra.</string>
<string name="zoom_by_swiping_summary">Balayer vers le haut ou vers le bas de l\'écran pour contrôler le niveau de zoom de la caméra.</string>
<string name="auto_rotate">Reconnaître les codes-barres 1D verticaux</string>
<string name="auto_rotate_summary">Tourne automatiquement le cadre de la caméra pour reconnaître les codes-barres 1D verticaux. En fonction de l\'appareil, cela peut affecter les performances.</string>
<string name="auto_rotate_summary">Tourner automatiquement le cadre de la caméra pour reconnaître les codes-barres 1D verticaux. En fonction de l\'appareil, cela peut affecter les performances.</string>
<string name="try_harder">Optimiser la précision du lecteur</string>
<string name="try_harder_summary">Activez cette option pour les codes très difficiles à lire. Affectera les performances.</string>
<string name="try_harder_summary">Activer cette option pour les codes très difficiles à lire. Les performances seront affectées.</string>
<string name="show_toast_in_bulk_mode">Afficher les données en mode continu</string>
<string name="show_toast_in_bulk_mode_summary">Afficher brièvement les données lors d\'un scan en continu.</string>
<string name="vibrate">Vibrer à la détection</string>
<string name="vibrate_summary">Fait vibrer l\'appareil lorsqu\'un code est reconnu.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="vibrate_summary">Faire vibrer l\'appareil lorsqu\'un code est détecté.</string>
<string name="beep">Biper à la détection</string>
<string name="beep_summary">Émettre un son lorsqu\'un code est détecté.</string>
<string name="beep_tone">Tonalité du signal sonore</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
@@ -91,32 +94,36 @@
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Sauvegarder l\'historique des scans</string>
<string name="use_history_summary">Sauvegarde les codes reconnus sur votre appareil.</string>
<string name="ignore_consecutive_duplicates">Ignorer les doublons</string>
<string name="ignore_consecutive_duplicates_summary">Ne sauvegarde pas les doublons dans l\'historique des scans.</string>
<string name="use_history_summary">Sauvegarder les codes reconnus sur votre appareil.</string>
<string name="ignore_duplicates">Ignorer les doublons</string>
<string name="ignore_consecutive_duplicates">Ignorer les doublons consécutifs</string>
<string name="ignore_any_duplicates">Ignorer tous les doublons</string>
<string name="accept_duplicates">Autoriser les doublons</string>
<string name="open_immediately">Ouvrir immédiatement</string>
<string name="open_immediately_summary">Saute l\'inspection et ouvre le contenu immédiatement. Si activé, cela peut ouvrir un contenu nocif.</string>
<string name="copy_immediately">Mettre dans le presse-papiers</string>
<string name="copy_immediately_summary">Copie automatiquement les contenus scannés dans le presse-papiers. Veuillez noter que les autres applications peuvent fouiner dans votre presse-papiers en arrière-plan.</string>
<string name="show_meta_data">Afficher les méta-données</string>
<string name="show_meta_data_summary">Affiche les données supplémentaires sur le code-barres scanné.</string>
<string name="show_hex_dump">Afficher le dump hexa</string>
<string name="show_hex_dump_summary">Affiche le dump hexadécimal du contenu scanné.</string>
<string name="open_immediately_summary">Ignorer l\'inspection et ouvrir le contenu immédiatement. Si cette option est activée, cela peut ouvrir un contenu nocif.</string>
<string name="copy_immediately">Copier dans le presse-papiers</string>
<string name="copy_immediately_summary">Copier automatiquement les contenus scannés dans le presse-papiers. Veuillez noter que d\'autres applications peuvent lire dans votre presse-papiers en arrière-plan.</string>
<string name="show_meta_data">Afficher les métadonnées</string>
<string name="show_meta_data_summary">Afficher des informations supplémentaires sur le code-barres scanné.</string>
<string name="show_hex_dump">Afficher le dump hexadécimal</string>
<string name="show_hex_dump_summary">Afficher le dump hexadécimal du contenu scanné.</string>
<string name="show_checksum">Afficher la somme de contrôle</string>
<string name="no_checksum">Pas de somme de contrôle</string>
<string name="show_recreation">Afficher le code-barres recréé</string>
<string name="show_recreation_summary">Recrée et affiche, si possible, le code-barres à partir du contenu lu.</string>
<string name="show_recreation_summary">Recréer et afficher, si possible, le code-barres à partir du contenu scanné.</string>
<string name="close_automatically">Revenir après une copie/partage</string>
<string name="close_automatically_summary">Revient automatiquement sur l\'écran de scan après avoir copié ou partagé le contenu lu.</string>
<string name="close_automatically_summary">Revenir automatiquement sur l\'écran de scan après avoir copié ou partagé le contenu scanné.</string>
<string name="default_search_engine">Ouvrir les données inconnues dans</string>
<string name="always_ask">Toujours demander</string>
<string name="open_with_url">Ouvrir des données inconnues avec lURL</string>
<string name="open_with_url">Ouvrir les données inconnues avec l\'URL</string>
<string name="clear_network_suggestions">Supprimer les suggestions de réseau</string>
<string name="clear_network_suggestions_summary">Supprime toutes les suggestions de réseau précédemment fournies par cette application.</string>
<string name="really_remove_all_networks">Supprimer vraiment tous les réseaux ?</string>
<string name="clear_network_suggestions_success">Suggestions de réseau supprimées</string>
<string name="clear_network_suggestions_summary">Supprimer toutes les suggestions de réseau précédemment fournies par cette application.</string>
<string name="really_remove_all_networks">Vraiment supprimer tous les réseaux ?</string>
<string name="clear_network_suggestions_success">Suggestion(s) de réseau(x) supprimée(s)</string>
<string name="clear_network_suggestions_nothing_to_remove">Rien à supprimer</string>
<string name="send_category">Transfert</string>
<string name="send_scan_active">Transférer les scans</string>
<string name="send_scan_active_summary">Transfère les scans vers une URL donnée.</string>
<string name="send_scan_active_summary">Transférer les scans vers une URL donnée.</string>
<string name="send_scan_url">URL de transfert</string>
<string name="send_scan_type">Type de requête</string>
<string name="send_type_get_add_content">GET et ajouter simplement le contenu</string>
@@ -125,19 +132,22 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Ouvrir dans un navigateur externe</string>
<string name="test_url">Tester l\'URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="send_scan_bluetooth">Partager les scans par Bluetooth</string>
<string name="send_scan_bluetooth_summary">Partager les scans à un hôte Bluetooth donné.</string>
<string name="send_scan_bluetooth_host">Hôte</string>
<string name="no_bluetooth_hosts_paired">Aucun hôte appairé</string>
<string name="bluetooth_connect_fail">Impossible de se connecter à l\'appareil Bluetooth.</string>
<string name="bluetooth_send_fail">Impossible d\'envoyer à l\'appareil Bluetooth.</string>
<string name="bluetooth_send_success">Envoi Bluetooth réussi.</string>
<string name="generation_category">Génération</string>
<string name="brighten_screen">Augmenter la luminosité de l\'écran</string>
<string name="brighten_screen_summary">Régler la luminosité au maximum pour améliorer la lecture d\'un code-barres à l\'écran.</string>
<string name="really_remove_scan">Supprimer le scan ?</string>
<string name="really_remove_all_scans">Supprimer tous les scans ?</string>
<string name="really_remove_selected_scans">Supprimer les scans sélectionnés ?</string>
<string name="clear_history">Effacer l\'historique</string>
<string name="clear_history">Supprimer l\'historique</string>
<string name="copy_scan">Copier le scan</string>
<string name="edit_scan">Éditer l\'étiquette</string>
<string name="edit_label">Modifier l\'étiquette</string>
<string name="remove_scan">Supprimer le scan</string>
<string name="enter_name">Saisir un nom décrivant le scan</string>
<string name="enter_name_hint">Nom du scan</string>
@@ -149,9 +159,9 @@
<string name="file_name">Nom du fichier</string>
<string name="error_saving_file">Impossible de sauvegarder le fichier</string>
<string name="error_file_exists">Fichier déjà existant</string>
<string name="connect_to_wifi">Connecter au WiFi</string>
<string name="wifi_config_failed">Impossible de configurer le WiFi</string>
<string name="wifi_added">WiFi ajouté</string>
<string name="connect_to_wifi">Connecter au Wi-Fi</string>
<string name="wifi_config_failed">Impossible de configurer le Wi-Fi</string>
<string name="wifi_added">Wi-Fi ajouté</string>
<string name="sms_send">Envoyer SMS</string>
<string name="sms_error">Impossible d\'envoyer le SMS</string>
<string name="tel_dial">Numéro de téléphone</string>
@@ -162,22 +172,26 @@
<string name="vcard_failed">Impossible d\'ajouter aux contacts</string>
<string name="vevent_add">Ajouter à l\'agenda</string>
<string name="vevent_failed">Impossible d\'ajouter à l\'agenda</string>
<string name="otpauth_add">Ajouter 2FA</string>
<string name="otpauth_add">Ajouter l\'authentification à deux facteurs</string>
<string name="search_web">Rechercher sur internet</string>
<string name="search_scan">Rechercher un scan</string>
<string name="export_to_file">Exporter comme fichier</string>
<string name="export_as">Exporter comme ?</string>
<string name="add_to_history">Ajouter à l\'historique</string>
<string name="added_to_history">Ajouté à l\'historique</string>
<string name="export_to_file">Exporter en tant que fichier</string>
<string name="export_as">Exporter en tant que ?</string>
<string name="export_csv_comma">CSV avec virgules</string>
<string name="export_csv_semicolon">CSV avec points-virgules</string>
<string name="export_json">Exporter comme JSON</string>
<string name="export_json">Exporter en tant que JSON</string>
<string name="export_database">Exporter la base de données SQLite</string>
<string name="saved_in_downloads">Sauvegardé dans les Téléchargements</string>
<string name="rotate_image_cw">Tourner l\'image dans le sens horaire</string>
<string name="toggle_free_rotation">Activer la rotation libre</string>
<string name="pick_file">Choisir un fichier image</string>
<string name="pick_code_to_scan">Choisissez le code à scanner</string>
<string name="pick_file">Choisir un fichier</string>
<string name="pick_image_file">Choisir un fichier image</string>
<string name="pick_code_to_scan">Choisir le code à scanner</string>
<string name="shortcut_decode">Scanner un code-barres</string>
<string name="shortcut_encode">Créer un code-barres</string>
<string name="shortcut_history">Historique</string>
<string name="shortcut_preferences">Réglages</string>
<string name="background_request_failed">Échec de la requête d\'arrière-plan</string>
<string name="entry_type">Type</string>
@@ -190,6 +204,6 @@
<string name="wifi_anonymous_identity">Identité anonyme</string>
<string name="wifi_identity">Identité</string>
<string name="wifi_phase2">Méthode de la phase 2</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="network_suggestions">Suggestions de réseaux</string>
<string name="remove_suggestion">Supprimer les suggestions</string>
</resources>
+20 -5
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Közepes (~15&#37; javítás)</string>
<string name="error_correction_level_q" formatted="false">Kvartilis (~25&#37; javítás)</string>
<string name="error_correction_level_h" formatted="false">Magas (~30&#37; javítás)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">Vaku be- vagy kikapcsolása</string>
<string name="error_flash">Hiba a vaku be- vagy kikapcsolásakor</string>
<string name="share">Megosztás</string>
<string name="share_file">Share as file</string>
<string name="share_as">Megosztja másként?</string>
<string name="copy_to_clipboard">Másolás a vágólapra</string>
<string name="copied_to_clipboard">Vágólapra helyezés</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">Nincs alkalmazás, amely meg tudná nyitni azt</string>
<string name="pick_search_engine">Válasszon keresőmotort</string>
<string name="format">Formátum</string>
<string name="size">Méret képpontban</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Méret képpontban: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Itt adja meg a tartalmat</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">KÓDOLÁS</string>
<string name="error_no_content">Hiányzó tartalom</string>
<string name="error_encoding_barcode">A vonalkódot nem lehet előállítani</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Beolvasási előzmények mentése</string>
<string name="use_history_summary">Felismert kódok mentése a saját eszközén.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ne mentsen egymást követő azonos adatokat</string>
<string name="ignore_consecutive_duplicates_summary">Ne mentse az egymást követő azonos adatokat a beolvasási előzményekbe.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Vizsgálat kihagyása és a tartalom azonnali megnyitása</string>
<string name="open_immediately_summary">Vizsgálat kihagyása és a tartalom azonnali megnyitása. Ártalmas tartalmat is megnyithat, ha engedélyezve van.</string>
<string name="copy_immediately">Tartalom automatikus másolása a vágólapra</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">További adatok megjelenítése a beolvasott vonalkódokról.</string>
<string name="show_hex_dump">Hexakiírás megjelenítése</string>
<string name="show_hex_dump_summary">A beolvasott tartalom hexakiírásának megjelenítése.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Ugrás vissza másolás vagy megosztás után</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Valóban eltávolítja a beolvasást?</string>
<string name="really_remove_all_scans">Valóban eltávolítja az összes beolvasását?</string>
<string name="really_remove_selected_scans">Valóban eltávolítja a kijelölt beolvasásokat?</string>
<string name="clear_history">Előzmények törlése</string>
<string name="copy_scan">Beolvasás másolása</string>
<string name="edit_scan">Címke szerkesztése</string>
<string name="edit_label">Címke szerkesztése</string>
<string name="remove_scan">Beolvasás eltávolítása</string>
<string name="enter_name">Adjon meg egy nevet a beolvasás leírásához</string>
<string name="enter_name_hint">A beolvasás neve</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">Kétlépcsős hitelesítés hozzáadása</string>
<string name="search_web">Keresés a weben</string>
<string name="search_scan">Beolvasás keresése</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Exportálás fájlba</string>
<string name="export_as">Exportálja másként?</string>
<string name="export_csv_comma">CSV-fájl vesszővel</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">Elmentve a letöltésekbe</string>
<string name="rotate_image_cw">Kép forgatása jobbra</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Képfájl kiválasztása</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Képfájl kiválasztása</string>
<string name="pick_code_to_scan">Kód kiválasztása a beolvasáshoz</string>
<string name="shortcut_decode">Vonalkód beolvasása</string>
<string name="shortcut_encode">Vonalkód létrehozása</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Beállítások</string>
<string name="background_request_failed">A háttérkérés sikertelen</string>
<string name="entry_type">Típus</string>
+20 -5
View File
@@ -13,6 +13,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; koreksi)</string>
<string name="error_correction_level_q" formatted="false">Kuartil (~25&#37; koreksi)</string>
<string name="error_correction_level_h" formatted="false">Tinggi (~30&#37; koreksi)</string>
<string name="label">Label</string>
<string name="colors">Muka dan latar belakang</string>
<string name="colors_black_on_white">Hitam di atas putih</string>
<string name="colors_white_on_black">Putih di atas hitam</string>
@@ -30,6 +31,7 @@
<string name="toggle_flash">Nyala/matikan blitz</string>
<string name="error_flash">Galat nyala/matikan blitz</string>
<string name="share">Bagikan</string>
<string name="share_file">Share as file</string>
<string name="share_as">Bagikan sebagai?</string>
<string name="copy_to_clipboard">Salin ke clipboard</string>
<string name="copied_to_clipboard">Disalin ke clipboard</string>
@@ -39,9 +41,11 @@
<string name="cannot_resolve_action">Tidak ada aplikasi yang bisa membukanya</string>
<string name="pick_search_engine">Pilih mesin pencari</string>
<string name="format">Format</string>
<string name="size">Ukuran dalam piksel</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Ukuran dalam piksel: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Masukkan konten di sini</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">ENKODE</string>
<string name="error_no_content">Tidak ada konten</string>
<string name="error_encoding_barcode">Barcode tidak bisa dibuat</string>
@@ -90,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Simpan riwayat pemindaian</string>
<string name="use_history_summary">Simpan kode yang berhasil dipindai pada perangkat anda.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Abaikan duplikat</string>
<string name="ignore_consecutive_duplicates_summary">Jangan simpan duplikat yang berturutan di dalam riwayat pemindaian.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Buka segera</string>
<string name="open_immediately_summary">Lewati inspeksi dan segera buka konten. Mungkin membuka konten berbahaya jika diaktifkan.</string>
<string name="copy_immediately">Simpan ke dalam clipboard</string>
@@ -100,6 +106,8 @@
<string name="show_meta_data_summary">Tampilkan data tambahan tentang barcode yang dipindai.</string>
<string name="show_hex_dump">Tampilkan hex dump</string>
<string name="show_hex_dump_summary">Tampilkan hex dump dari konten hasil pemindaian.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Tampilkan barcode yang dibuat ulang</string>
<string name="show_recreation_summary">Buat ulang dan tampilkan barcode dari isi konten jika memungkinkan.</string>
<string name="close_automatically">Kembali setelah Salin/Berbagi</string>
@@ -130,12 +138,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Yakin menghapus pindaian?</string>
<string name="really_remove_all_scans">Yakin menghapus semua pindaian?</string>
<string name="really_remove_selected_scans">Yakin menghapus pindaian yang dipilih?</string>
<string name="clear_history">Hapus riwayat</string>
<string name="copy_scan">Salin pindaian</string>
<string name="edit_scan">Sunting label</string>
<string name="edit_label">Sunting label</string>
<string name="remove_scan">Buang pindaian</string>
<string name="enter_name">Masukkan keterangan pindaian</string>
<string name="enter_name_hint">Nama pindaian</string>
@@ -163,6 +174,8 @@
<string name="otpauth_add">Tambahkan 2FA</string>
<string name="search_web">Cari secara daring</string>
<string name="search_scan">Cari pindaian</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Ekspor ke berkas</string>
<string name="export_as">Ekspor sebagai?</string>
<string name="export_csv_comma">CSV dengan koma</string>
@@ -172,10 +185,12 @@
<string name="saved_in_downloads">Simpan di dalam unduhan</string>
<string name="rotate_image_cw">Putar gambar searah jarum jam</string>
<string name="toggle_free_rotation">Nyala/matikan rotasi bebas</string>
<string name="pick_file">Pilih berkas gambar</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Pilih berkas gambar</string>
<string name="pick_code_to_scan">Pilih kode untuk dipindai</string>
<string name="shortcut_decode">Pindai barcode</string>
<string name="shortcut_encode">Buat barcode</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Pengaturan</string>
<string name="background_request_failed">Permintaan latar belakang gagal</string>
<string name="entry_type">Tipe</string>
+52 -37
View File
@@ -1,6 +1,6 @@
<resources>
<string name="camera_error">Impossibile accedere alla fotocamera. Riprova</string>
<string name="scan_code">Scansiona codice</string>
<string name="scan_code">Scansione codice</string>
<string name="compose_barcode">Crea codice a barre</string>
<string name="decode_barcode">Decodifica codice a barre</string>
<string name="content">Contenuto</string>
@@ -10,10 +10,11 @@
<item quantity="other">%2$d caratteri, %1$s</item>
</plurals>
<string name="error_correction_level">Livello correzione errori</string>
<string name="error_correction_level_l" formatted="false">Basso (correzione del ~7&#37;)</string>
<string name="error_correction_level_m" formatted="false">Medio (correzione del ~15&#37;)</string>
<string name="error_correction_level_q" formatted="false">Quartile (correzione del ~25&#37;)</string>
<string name="error_correction_level_h" formatted="false">Alto (correzione del ~30&#37;)</string>
<string name="error_correction_level_l" formatted="false">Basso (correzione ~7&#37;)</string>
<string name="error_correction_level_m" formatted="false">Medio (correzione ~15&#37;)</string>
<string name="error_correction_level_q" formatted="false">Quartile (correzione ~25&#37;)</string>
<string name="error_correction_level_h" formatted="false">Alto (correzione ~30&#37;)</string>
<string name="label">Etichetta</string>
<string name="colors">Colore primo piano/sfondo</string>
<string name="colors_black_on_white">Nero su bianco</string>
<string name="colors_white_on_black">Bianco su nero</string>
@@ -29,8 +30,9 @@
<string name="barcode_version_number">Versione</string>
<string name="qr_version_and_modules">%1$s (%2$d moduli)</string>
<string name="toggle_flash">Attiva/disattiva flash</string>
<string name="error_flash">Errore durante l\'attivazione/disattivazione del flash</string>
<string name="error_flash">Errore durante attivazione/disattivazione flash</string>
<string name="share">Condividi</string>
<string name="share_file">Condividi come file</string>
<string name="share_as">Condividi come?</string>
<string name="copy_to_clipboard">Copia negli Appunti</string>
<string name="copied_to_clipboard">Copiato negli Appunti</string>
@@ -40,20 +42,22 @@
<string name="cannot_resolve_action">Nessuna app può aprirlo</string>
<string name="pick_search_engine">Scegli motore di ricerca</string>
<string name="format">Formato</string>
<string name="size">Dimensioni (pixel)</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Dimensioni (pixel): %1$d×%2$d</string>
<string name="size_no_magnification">Nessun ingrandimento</string>
<string name="margin_size">Margine (pixel): %1$d</string>
<string name="input_content_here">Inserisci qui il contenuto</string>
<string name="unescape">Espandi sequenze escape</string>
<string name="encode">CODIFICA</string>
<string name="error_no_content">Contenuto mancante</string>
<string name="error_encoding_barcode">Il codice a barre non può essere generato</string>
<string name="view_barcode">Vedi codice a barre</string>
<string name="view_barcode">Visualizza codice a barre</string>
<string name="info">Info</string>
<string name="switch_camera">Cambia fotocamera</string>
<string name="bulk_mode">Scansione continua</string>
<string name="bulk_mode_summary">Avvia sempre la scansione in modo continuo.</string>
<string name="bulk_mode_delay">Ritardo tra scansioni continue</string>
<string name="restrict_format">Limita formato</string>
<string name="remove_restriction">Rimuovi la limitazione</string>
<string name="remove_restriction">Rimuovi limitazione</string>
<string name="scan_format">Scansiona %s</string>
<string name="quarter_second">Un quarto di secondo</string>
<string name="half_second">Mezzo secondo</string>
@@ -61,25 +65,25 @@
<string name="two_seconds">Due secondi</string>
<string name="five_seconds">Cinque secondi</string>
<string name="history">Cronologia</string>
<string name="preferences">Preferenze</string>
<string name="preferences">Impostazioni</string>
<string name="scan_category">Scansione</string>
<string name="content_category">Contenuto</string>
<string name="locale_category">Lingua</string>
<string name="custom_locale">Lingua personalizzata</string>
<string name="follow_system_settings">Usa le impostazioni di sistema</string>
<string name="follow_system_settings">Usa impostazioni di sistema</string>
<string name="show_crop_handle">Visualizza riquadro limite</string>
<string name="show_crop_handle_summary">Limita la scansione ad una regione personalizzata.</string>
<string name="show_crop_handle_summary">Limita scansione ad una regione personalizzata.</string>
<string name="barcode_formats">Formati codici a barre</string>
<string name="zoom_by_swiping">Zoom fotocamera scorrendo su/giù</string>
<string name="zoom_by_swiping_summary">Scorri su o giù per controllare lo zoom della fotocamera.</string>
<string name="auto_rotate">Riconosci codici a barre verticali</string>
<string name="auto_rotate_summary">Ruota automaticamente la fotocamera per riconoscere i codici a barre verticali. In base al dispositivo, potrebbe ridurre le prestazioni.</string>
<string name="try_harder">Ottimizza il lettore per accuratezza</string>
<string name="try_harder">Ottimizza lettore per accuratezza</string>
<string name="try_harder_summary">Attiva questa opzione per codici molto difficili da leggere. Riduce le prestazioni.</string>
<string name="show_toast_in_bulk_mode">Visualizza i dati in modalità continua</string>
<string name="show_toast_in_bulk_mode_summary">Durante la scansione continua vsualizza brevemente i dati scansionati.</string>
<string name="vibrate">Vibra quando rilevato</string>
<string name="vibrate_summary">Attivalo se vuoi che il dispositivo vibri quando viene riconosciuto un codice.</string>
<string name="show_toast_in_bulk_mode">Visualizza dati in modalità continua</string>
<string name="show_toast_in_bulk_mode_summary">Durante la scansione continua visualizza brevemente i dati scansionati.</string>
<string name="vibrate">Vibra al rilevamento</string>
<string name="vibrate_summary">Attiva questa opzione se vuoi che il dispositivo vibri quando viene riconosciuto un codice.</string>
<string name="beep">Beep al rilevamento</string>
<string name="beep_summary">Abilita questa opzione se vuoi che il dispositivo emetta un beep quando viene riconosciuto un codice.</string>
<string name="beep_tone">Tono beep</string>
@@ -90,22 +94,26 @@
<string name="tone_prop_beep">Beep generale</string>
<string name="tone_prop_beep2">Doppio beep generale</string>
<string name="use_history">Salva cronologia scansioni</string>
<string name="use_history_summary">Salva i codici riconosciuti nel dispositivo.</string>
<string name="ignore_consecutive_duplicates">Ignora i duplicati</string>
<string name="ignore_consecutive_duplicates_summary">Non salvare duplicati consecutivi nella cronologia di scansione.</string>
<string name="use_history_summary">Salva nel dispositivo codici riconosciuti.</string>
<string name="ignore_duplicates">Ignora duplicati</string>
<string name="ignore_consecutive_duplicates">Duplicati consecutivi</string>
<string name="ignore_any_duplicates">Qualsiasi duplicato</string>
<string name="accept_duplicates">Accetta duplicati</string>
<string name="open_immediately">Apri subito</string>
<string name="open_immediately_summary">Salta l\'ispezione e apri i contenuti immediatamente. Se abilitato può aprire contenuti dannosi.</string>
<string name="copy_immediately">Copia negli Appunti</string>
<string name="copy_immediately_summary">Copia automaticamente i contenuti scansionati negli Appunti. Nota che altre app potrebbero leggere gli Appunti in secondo piano.</string>
<string name="show_meta_data">Visualizza metadati</string>
<string name="show_meta_data_summary">Visualizza dati aggiuntivi sul codice a barre scansionato.</string>
<string name="show_meta_data_summary">Visualizza dati aggiuntivi codice a barre scansionato.</string>
<string name="show_hex_dump">Visualizza dump esadecimale</string>
<string name="show_hex_dump_summary">Visualizza un dump esadecimale dei contenuti scansionati.</string>
<string name="show_recreation">Visualizza il codice a barre ricreato</string>
<string name="show_recreation_summary">Ricrea e visualizza, se possibile, il codice a barre dal contenuto letto.</string>
<string name="show_checksum">Visualizza checksum</string>
<string name="no_checksum">Nessuna checksum</string>
<string name="show_recreation">Visualizza codice a barre ricreato</string>
<string name="show_recreation_summary">Ricrea e visualizza, se possibile, il codice a barre, dal contenuto letto.</string>
<string name="close_automatically">Vai indietro dopo la copia/condivisione</string>
<string name="close_automatically_summary">Dopo aver copiato o condiviso i contenuti letti torna automaticamente alla schermata di scansione.</string>
<string name="default_search_engine">Apri dati sconosciuti in</string>
<string name="default_search_engine">Apri dati sconosciuti con</string>
<string name="always_ask">Chiedi sempre</string>
<string name="open_with_url">Apri dati sconosciuti con URL</string>
<string name="clear_network_suggestions">Cancella suggerimenti di rete</string>
@@ -118,8 +126,8 @@
<string name="send_scan_active_summary">Abilita per inoltrare le scansioni a un URL specificato</string>
<string name="send_scan_url">URL a cui inoltrare</string>
<string name="send_scan_type">Tipo di richiesta</string>
<string name="send_type_get_add_content">OTTIENI e aggiungi il contenuto</string>
<string name="send_type_get_query_string">OTTIENI con stringa completa della richiesta</string>
<string name="send_type_get_add_content">GET e aggiungi contenuto</string>
<string name="send_type_get_query_string">GET con stringa completa richiesta</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Apri nel browser esterno</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Impossibile connettersi al dispositivo Bluetooth.</string>
<string name="bluetooth_send_fail">Impossibile inviare al dispositivo Bluetooth.</string>
<string name="bluetooth_send_success">Invio via Bluetooth riuscito.</string>
<string name="generation_category">Generazione</string>
<string name="brighten_screen">Schiarisci schermo</string>
<string name="brighten_screen_summary">Imposta luminosità al massimo per migliorare la scansione di un codice a barre dallo schermo.</string>
<string name="really_remove_scan">Vuoi rimuovere la scansione?</string>
<string name="really_remove_all_scans">Vuoi rimuovere tutte le scansioni?</string>
<string name="really_remove_selected_scans">Vuoi rimuovere le scansioni selezionate?</string>
<string name="clear_history">Azzera cronologia</string>
<string name="copy_scan">Copia scansione</string>
<string name="edit_scan">Modifica etichetta</string>
<string name="edit_label">Modifica etichetta</string>
<string name="remove_scan">Rimuovi scansione</string>
<string name="enter_name">Inserisci un nome per descrivere la scansione</string>
<string name="enter_name_hint">Nome scansione</string>
@@ -144,7 +155,7 @@
<string name="pick_list_separator">Come separare elementi della lista?</string>
<string name="separator_line_break">Interruzione di linea</string>
<string name="separator_ruler">Righello</string>
<string name="save_as_file_name">Salva come file nei Download?</string>
<string name="save_as_file_name">Salva come file nei download?</string>
<string name="file_name">Nome file</string>
<string name="error_saving_file">Impossibile salvare il file</string>
<string name="error_file_exists">Il file esiste già</string>
@@ -164,8 +175,10 @@
<string name="otpauth_add">Aggiungi 2FA</string>
<string name="search_web">Cerca nel web</string>
<string name="search_scan">Cerca scansione</string>
<string name="export_to_file">Esporta su file</string>
<string name="export_as">Come esportare?</string>
<string name="add_to_history">Aggiungi alla cronologia</string>
<string name="added_to_history">Aggiunto alla cronologia</string>
<string name="export_to_file">Esporta in un file</string>
<string name="export_as">Esportare come?</string>
<string name="export_csv_comma">CSV con virgole</string>
<string name="export_csv_semicolon">CSV con punti e virgola</string>
<string name="export_json">File JSON</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">Salvato nei download</string>
<string name="rotate_image_cw">Ruota immagine in senso orario</string>
<string name="toggle_free_rotation">Abilita/disabilita rotazione libera</string>
<string name="pick_file">Scegli file immagine</string>
<string name="pick_code_to_scan">Scegli codice da scansionare</string>
<string name="shortcut_decode">Scansiona un codice a barre</string>
<string name="shortcut_encode">Crea un codice a barre</string>
<string name="pick_file">Seleziona file</string>
<string name="pick_image_file">Apri file immagine</string>
<string name="pick_code_to_scan">Seleziona codice da scansionare</string>
<string name="shortcut_decode">Scansiona codice a barre</string>
<string name="shortcut_encode">Crea codice a barre</string>
<string name="shortcut_history">Cronologia</string>
<string name="shortcut_preferences">Impostazioni</string>
<string name="background_request_failed">Richiesta in secondo piano fallita</string>
<string name="entry_type">Tipo</string>
@@ -189,6 +204,6 @@
<string name="wifi_anonymous_identity">Identità anonima</string>
<string name="wifi_identity">Identità</string>
<string name="wifi_phase2">Metodo fase 2</string>
<string name="network_suggestions">Suggerimenti di rete</string>
<string name="remove_suggestion">Cancella suggerimento</string>
<string name="network_suggestions">Suggerimenti rete</string>
<string name="remove_suggestion">Elimina suggerimento</string>
</resources>
+20 -5
View File
@@ -13,6 +13,7 @@
<string name="error_correction_level_m" formatted="false">中 (~15&#37; の正確性)</string>
<string name="error_correction_level_q" formatted="false">高 (~25&#37; の正確性)</string>
<string name="error_correction_level_h" formatted="false">最高 (~30&#37; の正確性)</string>
<string name="label">Label</string>
<string name="colors">背面と前面</string>
<string name="colors_black_on_white">白地に黒色</string>
<string name="colors_white_on_black">黒地に白色</string>
@@ -30,6 +31,7 @@
<string name="toggle_flash">フラッシュの切り替え</string>
<string name="error_flash">フラッシュの切り替えエラー</string>
<string name="share">共有</string>
<string name="share_file">Share as file</string>
<string name="share_as">画像形式を選択</string>
<string name="copy_to_clipboard">クリップボードにコピー</string>
<string name="copied_to_clipboard">クリップボードにコピーされました</string>
@@ -39,9 +41,11 @@
<string name="cannot_resolve_action">開くためのアプリがありません!</string>
<string name="pick_search_engine">検索エンジンを選択</string>
<string name="format">フォーマット</string>
<string name="size">大きさ(ピクセル)</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">大きさ(ピクセル): %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">ここに内容を入力</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">エンコード</string>
<string name="error_no_content">内容が指定されていません</string>
<string name="error_encoding_barcode">バーコードを作成できませんでした</string>
@@ -90,8 +94,10 @@
<string name="tone_prop_beep2">一般的なダブルビープ音</string>
<string name="use_history">スキャン履歴を保存する</string>
<string name="use_history_summary">認識されたバーコードを端末に保存しておきます。</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">重複を破棄する</string>
<string name="ignore_consecutive_duplicates_summary">重複したスキャン履歴を保存しないようにします。</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">すぐにコンテンツを開く</string>
<string name="open_immediately_summary">確認画面なしでコンテンツをすぐに開くようにします。有害なコンテンツを開いてしまうリスクがあります。</string>
<string name="copy_immediately">自動的にクリップボードにコピー</string>
@@ -100,6 +106,8 @@
<string name="show_meta_data_summary">スキャンされたバーコードの追加データを確認できるようにします。</string>
<string name="show_hex_dump">16進数を表示</string>
<string name="show_hex_dump_summary">スキャンされたコンテンツの16進数データを確認できるようにします。</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">再生成したバーコードを表示</string>
<string name="show_recreation_summary">可能であれば、読み取ったコンテンツからバーコードを再生成して表示します。</string>
<string name="close_automatically">コピー/共有後に戻る</string>
@@ -130,12 +138,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">このスキャン履歴を削除しても宜しいですか?</string>
<string name="really_remove_all_scans">全てのスキャン履歴を削除しても宜しいですか?</string>
<string name="really_remove_selected_scans">選択されたスキャン履歴を削除しても宜しいですか?</string>
<string name="clear_history">履歴を消去</string>
<string name="copy_scan">スキャン結果をコピー</string>
<string name="edit_scan">ラベルを編集</string>
<string name="edit_label">ラベルを編集</string>
<string name="remove_scan">スキャン結果を削除</string>
<string name="enter_name">スキャン結果を識別できる名前を入力してください</string>
<string name="enter_name_hint">ここに名前を入力</string>
@@ -163,6 +174,8 @@
<string name="otpauth_add">二段階認証を追加</string>
<string name="search_web">ウェブで検索</string>
<string name="search_scan">スキャン結果を検索</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">ファイルにエクスポート</string>
<string name="export_as">ファイル形式を選択</string>
<string name="export_csv_comma">コンマ区切りのCSVファイル</string>
@@ -172,10 +185,12 @@
<string name="saved_in_downloads">ダウンロードフォルダに保存されました</string>
<string name="rotate_image_cw">時計回りに回転</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">画像を選択して読み込み</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">画像を選択して読み込み</string>
<string name="pick_code_to_scan">スキャンするバーコードを選択</string>
<string name="shortcut_decode">バーコードをスキャン</string>
<string name="shortcut_encode">バーコードを作成</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">設定</string>
<string name="background_request_failed">バックグラウンド要求に失敗しました</string>
<string name="entry_type">種類</string>
+20 -5
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; correction)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; correction)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; correction)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">განათების ჩართვა</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">გაზიარება</string>
<string name="share_file">Share as file</string>
<string name="share_as">Share as?</string>
<string name="copy_to_clipboard">გაცვლის ბუფერში კოპირება</string>
<string name="copied_to_clipboard">კოპირებულია გაცვლის ბუფერში</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">ამ მოქმედებისთვის აპლიკაცია ნაპოვნი არაა</string>
<string name="pick_search_engine">აირჩიეთ საძიებო სისტემა</string>
<string name="format">ფორმატი</string>
<string name="size">ზომა პიქსელებში</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">ზომა პიქსელებში: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">შეიყვანეთ ტექსტი აქ</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">შექმნა"</string>
<string name="error_no_content">მონაცემები არაა</string>
<string name="error_encoding_barcode">შტრიხ-კოდის შექმნა შეუძლებელია</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">სკანირების ისტორიის შენახვა</string>
<string name="use_history_summary">ამოცნობილი შტრიხ-კოდების მოწყობილობაზე შენახვა.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">არ შევინახოთ შემდგომი ასლები</string>
<string name="ignore_consecutive_duplicates_summary">არ შევინახოთ შემდგომი ასლები სკანირების ისტორიაში.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">შემოწმების გამოტოვება და მყისიერი გახსნა</string>
<string name="open_immediately_summary">შემოწმების გამოტოვება და მყისიერი გახსნა. შესაძლოა გამოიწვიოს არასასარგებლო კონტენტის ჩვენება.</string>
<string name="copy_immediately">გაცვლის ბუფერში ავტომატური კოპირება</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">სკანირებულ შტრიხ-კოდებზე დამატებითი ინფორმაციის ჩვენება.</string>
<string name="show_hex_dump">თექვსმეტობითი dump-ის ჩვენება</string>
<string name="show_hex_dump_summary">სკანირებული შტრიხ-კოდის კონტენტის თექვსმეტობითი dump-ის ჩვენება.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Go back after Copy/Share</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">ნამდვილად გსურთ სკანირების წაშლა?</string>
<string name="really_remove_all_scans">ნამდვილად გსურთ ყველაფრის წაშლა?</string>
<string name="really_remove_selected_scans">ნამდვილად გსურთ შერჩეული შტრიხ-კოდების წაშლა?</string>
<string name="clear_history">ისტორიის გასუფთავება</string>
<string name="copy_scan">კოპირება</string>
<string name="edit_scan">რედაქტირება</string>
<string name="edit_label">რედაქტირება</string>
<string name="remove_scan">სკანირების წაშლა</string>
<string name="enter_name">მიანიჭეთ სახელი სკანირებას</string>
<string name="enter_name_hint">სკანირების სახელი</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">დავამატოთ 2FA</string>
<string name="search_web">ქსელში მოძებნა</string>
<string name="search_scan">სკანირების ძიება</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">ექსპორტი ფაილში</string>
<string name="export_as">შესანახი ფაილის ფორმატი</string>
<string name="export_csv_comma">CSV (გამყოფი - მძიმე)</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">შენახულია გადმოწერებში</string>
<string name="rotate_image_cw">გამოსახულების შემობრუნება საათის ისრის მიხედვით</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">აირჩიეთ ფაილი გამოსახულებით</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">აირჩიეთ ფაილი გამოსახულებით</string>
<string name="pick_code_to_scan">აირჩიეთ შტრიხ-კოდი სკანირებისთვის</string>
<string name="shortcut_decode">შტრიხ-კოდის სკანირება</string>
<string name="shortcut_encode">შტრიხ-კოდის შექმნა</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">პარამეტრები</string>
<string name="background_request_failed">ფონური მოთხოვნა ვერ მოხერხდა</string>
<string name="entry_type">Type</string>
+20 -5
View File
@@ -13,6 +13,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; correction)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; correction)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; correction)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -30,6 +31,7 @@
<string name="toggle_flash">Toggle flash</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">Share</string>
<string name="share_file">Share as file</string>
<string name="share_as">Share as?</string>
<string name="copy_to_clipboard">Copy to clipboard</string>
<string name="copied_to_clipboard">Copied to clipboard</string>
@@ -39,9 +41,11 @@
<string name="cannot_resolve_action">No application can open that</string>
<string name="pick_search_engine">Pick a search engine</string>
<string name="format">Format</string>
<string name="size">Size in pixels</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Size in pixels: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Input content here</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">ENCODE</string>
<string name="error_no_content">Missing content</string>
<string name="error_encoding_barcode">Barcode cannot be generated</string>
@@ -90,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Save scan history</string>
<string name="use_history_summary">Save recognized codes on your device.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates_summary">Do not save consecutive duplicates in the scan history.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Open immediately</string>
<string name="open_immediately_summary">Skip inspection and open contents immediately. May open harmful content if enabled.</string>
<string name="copy_immediately">Put into clipboard</string>
@@ -100,6 +106,8 @@
<string name="show_meta_data_summary">Show additional data about the scanned barcode.</string>
<string name="show_hex_dump">Show hex dump</string>
<string name="show_hex_dump_summary">Show a hex dump of the scanned contents.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Go back after Copy/Share</string>
@@ -130,12 +138,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Really remove scan?</string>
<string name="really_remove_all_scans">Really remove all scans?</string>
<string name="really_remove_selected_scans">Really remove selected scans?</string>
<string name="clear_history">Clear history</string>
<string name="copy_scan">Copy scan</string>
<string name="edit_scan">Edit label</string>
<string name="edit_label">Edit label</string>
<string name="remove_scan">Remove scan</string>
<string name="enter_name">Enter a name to describe the scan</string>
<string name="enter_name_hint">Name of the scan</string>
@@ -163,6 +174,8 @@
<string name="otpauth_add">Add 2FA</string>
<string name="search_web">Search the web</string>
<string name="search_scan">Search scan</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Export to file</string>
<string name="export_as">Export as?</string>
<string name="export_csv_comma">CSV file with commas</string>
@@ -172,10 +185,12 @@
<string name="saved_in_downloads">Saved in downloads</string>
<string name="rotate_image_cw">Rotate image clockwise</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Pick image file</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Pick image file</string>
<string name="pick_code_to_scan">Pick code to scan</string>
<string name="shortcut_decode">Scan a barcode</string>
<string name="shortcut_encode">Create a barcode</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Settings</string>
<string name="background_request_failed">Background request failed</string>
<string name="entry_type">Type</string>
+20 -5
View File
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Middelhoog (~15&#37; correction)</string>
<string name="error_correction_level_q" formatted="false">Kwartiel (~25&#37; correction)</string>
<string name="error_correction_level_h" formatted="false">Hoog (~30&#37; correction)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">Zaklamp aan/uit</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">Delen</string>
<string name="share_file">Share as file</string>
<string name="share_as">Delen als?</string>
<string name="copy_to_clipboard">Naar klembord kopiëren</string>
<string name="copied_to_clipboard">Naar klembord gekopieerd</string>
@@ -40,9 +42,11 @@
<string name="cannot_resolve_action">Geen enkele toepassing kan dat openen</string>
<string name="pick_search_engine">Zoekmachine kiezen</string>
<string name="format">Format</string>
<string name="size">Afmeting in pixels</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Afmeting in pixels: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Voer hier de inhoud in</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">Coderen</string>
<string name="error_no_content">Inhoud ontbreekt</string>
<string name="error_encoding_barcode">Kan geen barcode aanmaken</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Scancodes bewaren</string>
<string name="use_history_summary">Bewaar herkende codes op je toestel.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Duplicaten negeren</string>
<string name="ignore_consecutive_duplicates_summary">Bewaar geen opeenvolgende duplicaten in de scangeschiedenis.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Inhoud direct tonen, zonder inspectie</string>
<string name="open_immediately_summary">Sla inspectie over en open meteen de inhoud. Indien geactiveerd, kan schadelijke inhoud worden geopend.</string>
<string name="copy_immediately">Meteen op klembord zetten</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">Toon extra gegevens over de gescande barcode.</string>
<string name="show_hex_dump">Hex-dump tonen</string>
<string name="show_hex_dump_summary">Hex-dump van de gescande inhoud tonen.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Teruggaan na kopiëren/delen</string>
@@ -131,12 +139,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Scan echt verwijderen?</string>
<string name="really_remove_all_scans">Alle scans echt verwijderen?</string>
<string name="really_remove_selected_scans">Geselecteerde scans verwijderen?</string>
<string name="clear_history">Wis opgeslagen codes</string>
<string name="copy_scan">Scan kopiëren</string>
<string name="edit_scan">Label bewerken</string>
<string name="edit_label">Label bewerken</string>
<string name="remove_scan">Scan verwijderen</string>
<string name="enter_name">Naam van de scan</string>
<string name="enter_name_hint">Voer een naam in om de scan te beschrijven</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">2FA toevoegen</string>
<string name="search_web">Zoeken op internet</string>
<string name="search_scan">Scan op internet zoeken</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Uitvoer naar bestand</string>
<string name="export_as">Exporteren als?</string>
<string name="export_csv_comma">CSV bestand met komma\'s</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">Opgeslagen in downloads</string>
<string name="rotate_image_cw">Afbeelding rechtsom draaien</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Beeldbestand kiezen</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Beeldbestand kiezen</string>
<string name="pick_code_to_scan">Kies code om te scannen</string>
<string name="shortcut_decode">Een barcode scannen</string>
<string name="shortcut_encode">Een barcode aanmaken</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Voorkeuren</string>
<string name="background_request_failed">Achtergrondverzoek mislukt</string>
<string name="entry_type">Type</string>
+60 -45
View File
@@ -1,24 +1,29 @@
<resources>
<string name="open_url">Otwórz url</string>
<string name="open_url">Otwórz URL</string>
<string name="content">Zawartość</string>
<string name="copied_to_clipboard">Skopiowano do schowka</string>
<string name="copy_to_clipboard">Skopiuj do schowka</string>
<string name="info">Informacje</string>
<string name="vcard_add">Dodaj do kontaktów</string>
<string name="vevent_add">Dodaj do kalendarza</string>
<string name="shortcut_history">Historia</string>
<string name="shortcut_preferences">Ustawienia</string>
<string name="share">Udostępnij</string>
<string name="share_file">Udostępnij jako plik</string>
<string name="share_as">Udostępnij jako?</string>
<string name="error_saving_file">Nie można zapisać pliku</string>
<string name="clear_history">Wyczyść historię</string>
<string name="compose_barcode">Utwórz kod kreskowy</string>
<string name="history">Historia</string>
<string name="format">Format</string>
<string name="add_to_history">Dodaj do historii</string>
<string name="added_to_history">Dodano do historii</string>
<string name="export_to_file">Eksportuj do pliku</string>
<string name="file_name">Nazwa pliku</string>
<string name="export_json">Eksportuj jako JSON</string>
<string name="pick_search_engine">Wybierz wyszukiwarkę</string>
<string name="pick_file">Wybierz plik obrazu</string>
<string name="pick_file">Wybierz plik</string>
<string name="pick_image_file">Wybierz plik obrazu</string>
<string name="pick_code_to_scan">Wybierz kod do zeskanowania</string>
<string name="sms_send">Wyślij SMS</string>
<string name="mail_send">Wyślij e-mail</string>
@@ -26,18 +31,19 @@
<string name="separator_ruler">Linijka</string>
<string name="scan_code">Skanuj kod</string>
<string name="error_correction_level">Poziom korekcji błędów</string>
<string name="error_correction_level_l" formatted="false">Niski (~7&#37; korekcji)</string>
<string name="error_correction_level_m" formatted="false">Średni (~15&#37; korekcji)</string>
<string name="error_correction_level_q" formatted="false">Kwartyl (~25&#37; korekcji)</string>
<string name="error_correction_level_h" formatted="false">Wysoki (~30&#37; korekcji)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
<string name="error_correction_level_l" formatted="false">Niski (~7% korekcji)</string>
<string name="error_correction_level_m" formatted="false">Średni (~15% korekcji)</string>
<string name="error_correction_level_q" formatted="false">Kwartyl (~25% korekcji)</string>
<string name="error_correction_level_h" formatted="false">Wysoki (~30% korekcji)</string>
<string name="label">Etykieta</string>
<string name="colors">Przód i tło</string>
<string name="colors_black_on_white">Czarny na białym</string>
<string name="colors_white_on_black">Biały na czarnym</string>
<string name="colors_black_on_transparent">Czarny na przezroczystym</string>
<string name="colors_white_on_transparent">Biały na przezroczystym</string>
<string name="sequence_size">Rozmiar sekwencji</string>
<string name="sequence_index">Indeks sekwencji</string>
<string name="sequence_id">Identyfikator sekwencji</string>
<string name="export_csv_comma">CSV z przecinkami</string>
<string name="export_csv_semicolon">CSV ze średnikami</string>
<string name="shortcut_encode">Stwórz kod kreskowy</string>
@@ -50,29 +56,30 @@
<string name="sms_error">Nie można wysłać SMS-a</string>
<string name="mail_error">Nie można wysłać e-maila</string>
<string name="rotate_image_cw">Obróć obraz zgodnie z ruchem wskazówek zegara</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="edit_scan">Edytuj etykietę</string>
<string name="toggle_free_rotation">Przełącz swobodny obrót</string>
<string name="edit_label">Edytuj etykietę</string>
<string name="enter_name_hint">Nazwa skanu</string>
<string name="camera_error">Nie można uzyskać dostępu do kamery, spróbuj ponownie</string>
<string name="copy_scan">Skopiuj skan</string>
<string name="vevent_failed">Nie można dodać do kalendarza</string>
<string name="wifi_config_failed">Nie można skonfigurować Wi-Fi</string>
<string name="size">Rozmiar w pikselach</string>
<string name="export_as">Eksportuj jako?</string>
<string name="really_remove_all_scans">Czy naprawdę usunąć wszystkie skany?</string>
<string name="really_remove_scan">Czy naprawdę usunąć skan?</string>
<string name="really_remove_selected_scans">Czy naprawdę usunąć wybrane skany?</string>
<string name="binary_data">(dane binarne)</string>
<plurals name="barcode_info">
<item quantity="one">%2$d character, %1$s</item>
<item quantity="few">%2$d characters, %1$s</item>
<item quantity="many">%2$d characters, %1$s</item>
<item quantity="other">%2$d characters, %1$s</item>
<item quantity="one">%2$d znak, %1$s</item>
<item quantity="few">%2$d znaki, %1$s</item>
<item quantity="many">%2$d znaków, %1$s</item>
<item quantity="other">%2$d znaków, %1$s</item>
</plurals>
<string name="show_hex_dump">Pokazuj zrzut szesnastkowy</string>
<string name="show_hex_dump_summary">Pokaż zeskanowaną zawartośc w postaci szesnastkowej</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="show_hex_dump_summary">Pokaż zeskanowaną zawartość w postaci szesnastkowej.</string>
<string name="show_checksum">Pokaż sumę kontrolną</string>
<string name="no_checksum">Brak sumy kontrolnej</string>
<string name="show_recreation">Pokaż odtworzony kod kreskowy</string>
<string name="show_recreation_summary">Jeśli to możliwe, odtwórz i pokaż kod kreskowy z odczytanej zawartości.</string>
<string name="close_automatically">Wróć po skopiowaniu/udostępnieniu</string>
<string name="close_automatically_summary">Automatycznie powracaj do ekranu skanowania po skopiowaniu lub udostępnieniu przeczytanej zawartości.</string>
<string name="show_meta_data">Pokazuj metadane</string>
@@ -81,16 +88,16 @@
<string name="bulk_mode">Skanuj w sposób ciągły</string>
<string name="bulk_mode_summary">Zawsze rozpoczynaj skanowanie w sposób ciągły.</string>
<string name="bulk_mode_delay">Opóźnienie między kolejnymi skanami</string>
<string name="restrict_format">Restrict format</string>
<string name="remove_restriction">Remove restriction</string>
<string name="scan_format">Scan %s</string>
<string name="restrict_format">Ogranicz format</string>
<string name="remove_restriction">Usuń ograniczenie</string>
<string name="scan_format">Skan %s</string>
<string name="quarter_second">Ćwierć sekundy</string>
<string name="half_second">Pół sekundy</string>
<string name="a_second">Sekunda</string>
<string name="two_seconds">Dwie sekundy</string>
<string name="five_seconds">Pięć sekund</string>
<string name="toggle_flash">Przełącz lampę błyskową</string>
<string name="error_flash">Error toggling flash</string>
<string name="error_flash">Błąd przełączania lampy błyskowej</string>
<string name="wifi_added">Wi-Fi dodane</string>
<string name="zoom_by_swiping">Przybliżaj kamerę, przesuwając w górę/dół</string>
<string name="zoom_by_swiping_summary">Przesuń palcem w górę lub w dół na ekranie aparatu, aby sterować powiększeniem aparatu.</string>
@@ -104,15 +111,15 @@
<string name="use_history_summary">Zapisz rozpoznane kody na swoim urządzeniu.</string>
<string name="vibrate">Wibruj po wykryciu</string>
<string name="vibrate_summary">Włącz tę opcję, jeśli chcesz, aby urządzenie wibrowało po rozpoznaniu kodu.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="beep">Sygnał dźwiękowy po wykryciu</string>
<string name="beep_summary">Włącz tę opcję, jeśli chcesz, aby urządzenie emitowało sygnał dźwiękowy po rozpoznaniu kodu.</string>
<string name="beep_tone">Sygnał dźwiękowy</string>
<string name="tone_cdma_confirm">Potwierdzenie CDMA</string>
<string name="tone_sup_confirm">Potwierdzenie odbioru połączenia</string>
<string name="tone_sup_radio_ack">Potwierdzenie ścieżki radiowej nadzoru połączenia</string>
<string name="tone_prop_ack">Pozytywne potwierdzenie</string>
<string name="tone_prop_beep">Ogólny sygnał dźwiękowy</string>
<string name="tone_prop_beep2">Ogólny podwójny sygnał dźwiękowy</string>
<string name="open_immediately">Pomiń kontrolę i natychmiast otwórz zawartość</string>
<string name="open_immediately_summary">Pomiń kontrolę i natychmiast otwórz zawartość. Może otwierać szkodliwą zawartość, jeśli jest włączona.</string>
<string name="copy_immediately">Automatycznie skopiuj zawartość do schowka</string>
@@ -123,8 +130,10 @@
<string name="search_web">Szukaj w sieci</string>
<string name="search_scan">Szukaj skanu</string>
<string name="export_database">Eksportuj do bazy danych SQLite</string>
<string name="ignore_duplicates">Ignoruj duplikaty</string>
<string name="ignore_consecutive_duplicates">Nie zapisuj kolejnych duplikatów</string>
<string name="ignore_consecutive_duplicates_summary">Nie zapisuj kolejnych duplikatów w historii skanowania.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Akceptuj duplikaty</string>
<string name="default_search_engine">Otwórz nieznane dane w</string>
<string name="always_ask">Zawsze pytaj</string>
<string name="open_with_url">Otwieraj nieznane dane za pomocą adresu URL</string>
@@ -134,8 +143,8 @@
<string name="clear_network_suggestions_success">Sugestie dotyczące sieci zostały usunięte</string>
<string name="clear_network_suggestions_nothing_to_remove">Nie ma nic do usunięcia</string>
<string name="send_category">Przekazywanie</string>
<string name="send_scan_active">Forward scans</string>
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
<string name="send_scan_active">Przekazuj skany</string>
<string name="send_scan_active_summary">Umożliwia przekazywanie skanów na podany adres URL.</string>
<string name="send_scan_url">Wyślij każdy skan na adres URL</string>
<string name="send_scan_type">Rodzaj requestu dla każdego skanu</string>
<string name="send_type_get_add_content">GET i po prostu dodaj zawartość</string>
@@ -144,13 +153,16 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Otwórz w zewnętrznej przeglądarce</string>
<string name="test_url">Testuj URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth">Przekazuj skany za pomocą Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="no_bluetooth_hosts_paired">Brak sparowanych hostów</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="copy_password">Skopiuj hasło do schowka</string>
<string name="copied_password_to_clipboard">Hasło skopiowane do schowka</string>
<string name="gtin_price">Sugerowana cena</string>
@@ -162,7 +174,7 @@
<string name="follow_system_settings">Zgodny z ustawieniami systemu</string>
<string name="decode_barcode">Dekoduj kod kreskowy</string>
<string name="gtin_add_on">Dodatek UPC EAN</string>
<string name="barcode_version_number">Version</string>
<string name="barcode_version_number">Wersja</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="gtin_country">Możliwy kraj produkcji</string>
<string name="encode">ZAKODUJ</string>
@@ -172,8 +184,11 @@
<string name="show_toast_in_bulk_mode">Pokaż dane w trybie ciągłym</string>
<string name="show_toast_in_bulk_mode_summary">Zwięźle pokazuje zeskanowane dane podczas skanowania ciągłego.</string>
<string name="cannot_resolve_action">Żadna aplikacja nie może tego otworzyć</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Rozmiar w pikselach: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margines w pikselach: %1$d</string>
<string name="input_content_here">Wprowadź zawartość tutaj</string>
<string name="unescape">Rozwiń sekwencje ucieczki</string>
<string name="pick_list_separator">Jak oddzielić elementy listy?</string>
<string name="enter_name">Wprowadź nazwę opisującą skan</string>
<string name="auto_rotate">Rozpoznawaj kody kreskowe 1D pionowo</string>
@@ -192,5 +207,5 @@
<string name="wifi_identity">Tożsamość</string>
<string name="wifi_phase2">Metoda fazy 2</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="remove_suggestion">Usuń sugestię</string>
</resources>
+136 -120
View File
@@ -1,184 +1,200 @@
<resources>
<string name="camera_error">Não foi possível acessar a câmera, por favor tente novamente</string>
<string name="scan_code">Aponte ao código</string>
<string name="compose_barcode">Criar código</string>
<string name="decode_barcode">Reconhecer código</string>
<string name="camera_error">Não foi possível acessar a câmera, tente novamente</string>
<string name="scan_code">Escanear código</string>
<string name="compose_barcode">Compor código de barras</string>
<string name="decode_barcode">Decodificar código de barras</string>
<string name="content">Conteúdo</string>
<string name="binary_data">(dados binários)</string>
<string name="binary_data">(dados em binário)</string>
<plurals name="barcode_info">
<item quantity="one">%2$d caractere, %1$s</item>
<item quantity="many">%2$d caracteres, %1$s</item>
<item quantity="other">%2$d caracteres, %1$s</item>
</plurals>
<string name="error_correction_level">Nível de correção de erros</string>
<string name="error_correction_level_l" formatted="false">Baixo (~7&#37; correção)</string>
<string name="error_correction_level_m" formatted="false">Médio (~15&#37; correção)</string>
<string name="error_correction_level_q" formatted="false">Quartil (~25&#37; correção)</string>
<string name="error_correction_level_h" formatted="false">Alto (~30&#37; correção)</string>
<string name="colors">Modo de exibição</string>
<string name="colors_black_on_white">Preto sobre fundo branco</string>
<string name="colors_white_on_black">Branco sobre fundo preto</string>
<string name="colors_black_on_transparent">Preto sobre fundo transparente</string>
<string name="colors_white_on_transparent">Branco sobre fundo transparente</string>
<string name="sequence_size">Tamanho de sequência</string>
<string name="sequence_index">Índice de sequência</string>
<string name="sequence_id">ID de sequência</string>
<string name="gtin_issue_number">Número de emissão</string>
<string name="error_correction_level">Nível de correção de erro</string>
<string name="error_correction_level_l" formatted="false">Baixo (~7% de correção)</string>
<string name="error_correction_level_m" formatted="false">Médio (~15% de correção)</string>
<string name="error_correction_level_q" formatted="false">Quarto (~25% de correção)</string>
<string name="error_correction_level_h" formatted="false">Alto (~30% de correção)</string>
<string name="label">Etiqueta</string>
<string name="colors">Primeiro e segundo plano</string>
<string name="colors_black_on_white">Preto no branco</string>
<string name="colors_white_on_black">Branco no preto</string>
<string name="colors_black_on_transparent">Preto no transparente</string>
<string name="colors_white_on_transparent">Branco no transparente</string>
<string name="sequence_size">Tamanho da sequência</string>
<string name="sequence_index">Índice da sequência</string>
<string name="sequence_id">ID da sequência</string>
<string name="gtin_issue_number">Número do issue</string>
<string name="gtin_country">Possível país de fabricação</string>
<string name="gtin_price">Preço sugerido</string>
<string name="gtin_add_on">Extensão UPC EAN</string>
<string name="barcode_version_number">Versão</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="qr_version_and_modules">%1$s (%2$d módulos)</string>
<string name="toggle_flash">Ligar lanterna</string>
<string name="error_flash">Falha ao ligar a lanterna</string>
<string name="share">Compartilhe</string>
<string name="share_as">Compartilhar em qual formato?</string>
<string name="copy_to_clipboard">Copiar ao clipboard</string>
<string name="copied_to_clipboard">Copiado ao clipboard</string>
<string name="copy_password">Copiar senha ao clipboard</string>
<string name="copied_password_to_clipboard">Senha copiada ao clipboard</string>
<string name="open_url">Abrir a URL</string>
<string name="cannot_resolve_action">Nenhum app consegue abrir isto</string>
<string name="pick_search_engine">Escolha site de busca</string>
<string name="share">Compartilhar</string>
<string name="share_file">Compartilhar como arquivo</string>
<string name="share_as">Compartilhar como?</string>
<string name="copy_to_clipboard">Copiar para a área de transferência</string>
<string name="copied_to_clipboard">Copiado para a área de transferência</string>
<string name="copy_password">Copiar senha para a área de transferência</string>
<string name="copied_password_to_clipboard">Senha copiada para a área de transferência</string>
<string name="open_url">Abrir URL</string>
<string name="cannot_resolve_action">Nenhum app pode abrir isto</string>
<string name="pick_search_engine">Escolha um motor de pesquisa</string>
<string name="format">Formato</string>
<string name="size">Tamanho em píxeis</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Tamanho em pixels: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margem em pixels: %1$d</string>
<string name="input_content_here">Digite algum conteúdo aqui</string>
<string name="unescape">Expandir sequências de escape</string>
<string name="encode">CODIFICAR</string>
<string name="error_no_content">Digite algum conteúdo acima</string>
<string name="error_encoding_barcode">Não foi possível gerar este código</string>
<string name="view_barcode">Ver código</string>
<string name="info">Detalhes</string>
<string name="switch_camera">Alterar câmera</string>
<string name="bulk_mode">Digitalização contínua</string>
<string name="bulk_mode_summary">Sempre executar em modo contínuo.</string>
<string name="bulk_mode_delay">Adiar durante digitalização contínua</string>
<string name="restrict_format">Limitar formato</string>
<string name="remove_restriction">Remover limitação</string>
<string name="scan_format">Escanear %s</string>
<string name="error_no_content">Conteúdo faltando</string>
<string name="error_encoding_barcode">Código de barras não pode ser gerado</string>
<string name="view_barcode">Ver código de barras</string>
<string name="info">Informações</string>
<string name="switch_camera">Trocar câmera</string>
<string name="bulk_mode">Digitalizar continuamente</string>
<string name="bulk_mode_summary">Sempre iniciar digitalizando continuamente.</string>
<string name="bulk_mode_delay">Espera entre digitalizações contínuas</string>
<string name="restrict_format">Restringir formato</string>
<string name="remove_restriction">Remover restrição</string>
<string name="scan_format">Digitalizar %s</string>
<string name="quarter_second">Um quarto de segundo</string>
<string name="half_second">Meio segundo</string>
<string name="a_second">1 segundo</string>
<string name="two_seconds">2 segundos</string>
<string name="five_seconds">5 segundos</string>
<string name="a_second">Um segundo</string>
<string name="two_seconds">Dois segundos</string>
<string name="five_seconds">Cinco segundos</string>
<string name="history">Histórico</string>
<string name="preferences">Preferências</string>
<string name="preferences">Configurações</string>
<string name="scan_category">Digitalização</string>
<string name="content_category">Conteúdo</string>
<string name="locale_category">Idioma</string>
<string name="custom_locale">Idioma da interface</string>
<string name="follow_system_settings">Adaptar do sistema</string>
<string name="custom_locale">Idioma customizado</string>
<string name="follow_system_settings">Seguir configurações do sistema</string>
<string name="show_crop_handle">Mostrar limitador customizável</string>
<string name="show_crop_handle_summary">Permite limitar a uma área específica.</string>
<string name="barcode_formats">Tipo de código</string>
<string name="zoom_by_swiping">Deslize para ajustar zoom</string>
<string name="show_crop_handle_summary">Permite limitar a digitalização à uma área específica.</string>
<string name="barcode_formats">Formatos de código de barras</string>
<string name="zoom_by_swiping">Deslize para ajustar o zoom</string>
<string name="zoom_by_swiping_summary">Deslize para baixo/cima na tela para ajustar zoom da câmera.</string>
<string name="auto_rotate">Reconhecer códigos 1D verticais</string>
<string name="auto_rotate_summary">Girar automaticamente a câmera para reconhecer códigos 1D verticais. Dependendo do dispositivo, isto pode afetar o desempenho.</string>
<string name="auto_rotate">Reconhecer códigos de barras 1D verticais</string>
<string name="auto_rotate_summary">Gire automaticamente a câmera para reconhecer códigos 1D verticais. Dependendo do dispositivo, isto pode afetar o desempenho.</string>
<string name="try_harder">Otimizar leitor para precisão</string>
<string name="try_harder_summary">Ative esta opção para códigos muito difíceis de ler. Isto afetará o desempenho.</string>
<string name="show_toast_in_bulk_mode">Mostrar dados em modo contínuo</string>
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente os dados durante digitalização contínua.</string>
<string name="vibrate">Vibrar ao reconhecer</string>
<string name="vibrate">Vibrar ao detectar</string>
<string name="vibrate_summary">Ative esta opção se quiser que seu dispositivo vibre ao reconhecer um código.</string>
<string name="beep">Bipar ao reconhecer</string>
<string name="beep_summary">Ative esta opção se quiser ouvir um bip ao reconhecer um código.</string>
<string name="beep_tone">Sinal sonoro</string>
<string name="tone_cdma_confirm">Confirmação do CDMA</string>
<string name="tone_sup_confirm">Solicitar confirmação de controle</string>
<string name="tone_sup_radio_ack">Solicitar confirmação do caminho de rádio</string>
<string name="beep">Tocar um \'beep\' ao reconhecer</string>
<string name="beep_summary">Ative esta opção se quiser se quer que seu dispositivo faça um som de \'beep\' ao reconhecer um código.</string>
<string name="beep_tone">Tom do beep</string>
<string name="tone_cdma_confirm">Confirmação CDMA</string>
<string name="tone_sup_confirm">Confirmação de supervisão de chamada</string>
<string name="tone_sup_radio_ack">Reconhecimento de caminho de rádio de supervisão de chamada</string>
<string name="tone_prop_ack">Reconhecimento positivo</string>
<string name="tone_prop_beep">Bip geral</string>
<string name="tone_prop_beep2">Bip duplo geral</string>
<string name="use_history">Ativar histórico de digitalizações</string>
<string name="use_history_summary">Salve códigos reconhecidos no seu dispositivo.</string>
<string name="ignore_consecutive_duplicates">Ignorar duplicações</string>
<string name="ignore_consecutive_duplicates_summary">Não salvar duplicações consecutivas no histórico de digitalizações.</string>
<string name="tone_prop_beep">Beep comum</string>
<string name="tone_prop_beep2">Duplo beep comum</string>
<string name="use_history">Salvar histórico de digitalizações</string>
<string name="use_history_summary">Salve códigos reconhecidos em seu dispositivo.</string>
<string name="ignore_duplicates">Ignorar duplicata</string>
<string name="ignore_consecutive_duplicates">Duplicatas consecutivas</string>
<string name="ignore_any_duplicates">Quaisquer duplicatas</string>
<string name="accept_duplicates">Aceitar duplicatas</string>
<string name="open_immediately">Abrir imediatamente</string>
<string name="open_immediately_summary">Pular a inspeção e abrir um conteúdo no mesmo instante. Quando ativado, pode abrir conteúdo perigoso.</string>
<string name="copy_immediately">Copiar ao clipboard</string>
<string name="copy_immediately_summary">Copiar automaticamente um conteúdo digitalizado ao clipboard. Tem cuidado porque outros apps podem examinar seu clipboard em segundo plano.</string>
<string name="open_immediately_summary">Pular a inspeção e abrir um conteúdo instantaneamente. Pode abrir conteúdo malicioso se ativado.</string>
<string name="copy_immediately">Botar na área de transferência</string>
<string name="copy_immediately_summary">Copiar automaticamente para a área de transferência o conteúdo digitalizado. Note que outros apps podem examinar sua área de transferência em segundo plano.</string>
<string name="show_meta_data">Mostrar metadados</string>
<string name="show_meta_data_summary">Mostrar dados adicionais de código digitalizado.</string>
<string name="show_hex_dump">Mostrar impressão hexadecimal</string>
<string name="show_hex_dump_summary">Mostrar impressão hexadecimal de conteúdo digitalizado.</string>
<string name="show_meta_data_summary">Mostrar dados adicionais sobre o código digitalizado.</string>
<string name="show_hex_dump">Mostrar dump em hex</string>
<string name="show_hex_dump_summary">Mostrar um dump em hex do conteúdo digitalizado.</string>
<string name="show_checksum">Mostrar checksum</string>
<string name="no_checksum">Nenhum checksum</string>
<string name="show_recreation">Mostrar código recriado</string>
<string name="show_recreation_summary">Se possível, recriar e mostrar código de conteúdo lido.</string>
<string name="close_automatically">Voltar após copiar/compartilhar</string>
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar um código examinado.</string>
<string name="show_recreation_summary">Recrie e mostre o código do conteúdo digitalizado quando possível.</string>
<string name="close_automatically">Voltar após Copiar/Compartilhar</string>
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar o conteúdo de uma digitalização.</string>
<string name="default_search_engine">Abrir dados desconhecidos em</string>
<string name="always_ask">Sempre perguntar</string>
<string name="open_with_url">Abrir dados desconhecidos via URL</string>
<string name="clear_network_suggestions">Remover sugestões da rede</string>
<string name="clear_network_suggestions_summary">Remover todas as sugestões da rede que foram anteriormente fornecidas pelo app.</string>
<string name="really_remove_all_networks">Deseja remover todas as redes?</string>
<string name="clear_network_suggestions_success">Sugestões da rede foram removidas</string>
<string name="clear_network_suggestions_nothing_to_remove">Nada para remover</string>
<string name="open_with_url">Abrir dados desconhecidos com URL</string>
<string name="clear_network_suggestions">Excluir sugestões de rede</string>
<string name="clear_network_suggestions_summary">Excluir todas as sugestões de rede que foram anteriormente adicionadas com este app.</string>
<string name="really_remove_all_networks">Deseja excluir todas as redes?</string>
<string name="clear_network_suggestions_success">Sugestões de rede foram excluídas</string>
<string name="clear_network_suggestions_nothing_to_remove">Nada para excluir</string>
<string name="send_category">Encaminhamento</string>
<string name="send_scan_active">Encaminhar conteúdo digitalizado</string>
<string name="send_scan_active_summary">Ative para encaminhar conteúdo digitalizado à URL definida</string>
<string name="send_scan_url">URL à qual encaminhar</string>
<string name="send_scan_active">Encaminhar digitalizações</string>
<string name="send_scan_active_summary">Ative para encaminhar conteúdo digitalizado à URL definida.</string>
<string name="send_scan_url">Defina a URL para qual encaminhar</string>
<string name="send_scan_type">Tipo de solicitação</string>
<string name="send_type_get_add_content">GET e somente adicionar um conteúdo</string>
<string name="send_type_get_add_content">GET e somente adicionar o conteúdo</string>
<string name="send_type_get_query_string">GET com sequência completa de consulta</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Abrir em navegador externo</string>
<string name="test_url">Testar a URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth">Encaminhar digitalizações com Bluetooth</string>
<string name="send_scan_bluetooth_summary">Ative para encaminhar digitalizações a um determinado host Bluetooth.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="really_remove_scan">Deseja remover esta digitalização?</string>
<string name="really_remove_all_scans">Deseja remover todas as digitalizações?</string>
<string name="really_remove_selected_scans">Deseja remover digitalizações selecionados?</string>
<string name="clear_history">Limpar histórico</string>
<string name="no_bluetooth_hosts_paired">Nenhum Host Pareado</string>
<string name="bluetooth_connect_fail">Não foi possível conectar com o dispositivo Bluetooth.</string>
<string name="bluetooth_send_fail">Não foi possível enviar para o dispositivo Bluetooth.</string>
<string name="bluetooth_send_success">Envio Bluetooth com sucesso.</string>
<string name="generation_category">Geração</string>
<string name="brighten_screen">Clarear tela</string>
<string name="brighten_screen_summary">Aumente o brilho do monitor para melhorar a leitura do código de barras.</string>
<string name="really_remove_scan">Deseja excluir esta digitalização?</string>
<string name="really_remove_all_scans">Deseja excluir todas as digitalizações?</string>
<string name="really_remove_selected_scans">Deseja excluir as digitalizações selecionadas?</string>
<string name="clear_history">Apagar histórico</string>
<string name="copy_scan">Copiar digitalização</string>
<string name="edit_scan">Editar identificação</string>
<string name="remove_scan">Remover digitalização</string>
<string name="enter_name">Digite nome para identificar esta digitalização</string>
<string name="edit_label">Editar etiqueta</string>
<string name="remove_scan">Excluir digitalização</string>
<string name="enter_name">Digite um nome para identificar esta digitalização</string>
<string name="enter_name_hint">Nome da digitalização</string>
<string name="no_barcode_found">Nenhum código encontrado</string>
<string name="pick_list_separator">Como separar itens da lista?</string>
<string name="no_barcode_found">Nenhum código de barras encontrado</string>
<string name="pick_list_separator">Como separar os itens da lista?</string>
<string name="separator_line_break">Quebra de linha</string>
<string name="separator_ruler">Régua</string>
<string name="save_as_file_name">Salvar para Downloads?</string>
<string name="save_as_file_name">Salvar na pasta de Downloads?</string>
<string name="file_name">Nome do arquivo</string>
<string name="error_saving_file">Não foi possível salvar este arquivo</string>
<string name="error_saving_file">Não é possível salvar este arquivo</string>
<string name="error_file_exists">Arquivo já existe</string>
<string name="connect_to_wifi">Conectar a WiFi</string>
<string name="wifi_config_failed">Não foi possível configurar WiFi</string>
<string name="wifi_added">WiFi adicionado</string>
<string name="sms_send">Envie SMS</string>
<string name="connect_to_wifi">Conectar à rede Wi-Fi</string>
<string name="wifi_config_failed">Não foi possível configurar a rede Wi-Fi</string>
<string name="wifi_added">Rede Wi-Fi adicionada</string>
<string name="sms_send">Enviar SMS</string>
<string name="sms_error">Não foi possível enviar SMS</string>
<string name="tel_dial">Disque número</string>
<string name="tel_dial">Discar número</string>
<string name="tel_error">Não foi possível discar este número</string>
<string name="mail_send">Envie e-mail</string>
<string name="mail_error">Não foi possível enviar este e-mail</string>
<string name="mail_send">Enviar e-mail</string>
<string name="mail_error">Não foi possível enviar e-mail</string>
<string name="vcard_add">Adicionar aos contatos</string>
<string name="vcard_failed">Não foi possível adicionar aos contatos</string>
<string name="vevent_add">Adicionar ao calendário</string>
<string name="vevent_failed">Não foi possível adicionar ao calendário</string>
<string name="otpauth_add">Adicionar 2FA</string>
<string name="search_web">Buscar na internet</string>
<string name="search_scan">Buscar em digitalizações feitas</string>
<string name="search_web">Buscar na web</string>
<string name="search_scan">Buscar digitalização</string>
<string name="add_to_history">Adicionar ao histórico</string>
<string name="added_to_history">Adicionado ao histórico</string>
<string name="export_to_file">Exportar para arquivo</string>
<string name="export_as">Exportar em qual formato?</string>
<string name="export_as">Exportar como?</string>
<string name="export_csv_comma">Arquivo CSV com vírgulas</string>
<string name="export_csv_semicolon">Arquivo CSV com ponto-e-vírgula</string>
<string name="export_json">Arquivo JSON</string>
<string name="export_database">Base de dados SQLite</string>
<string name="saved_in_downloads">Salvo em Downloads</string>
<string name="saved_in_downloads">Salvo nos Downloads</string>
<string name="rotate_image_cw">Girar a imagem no sentido horário</string>
<string name="toggle_free_rotation">Ativar rotação livre</string>
<string name="pick_file">Escolha imagem</string>
<string name="toggle_free_rotation">Girar livremente</string>
<string name="pick_file">Escolha um arquivo</string>
<string name="pick_image_file">Escolha um arquivo de imagem</string>
<string name="pick_code_to_scan">Escolha código para digitalizar</string>
<string name="shortcut_decode">Escaneie código</string>
<string name="shortcut_encode">Criar código</string>
<string name="shortcut_decode">Digitalizar um código de barras</string>
<string name="shortcut_encode">Criar um código de barras</string>
<string name="shortcut_history">Histórico</string>
<string name="shortcut_preferences">Configurações</string>
<string name="background_request_failed">A solicitação em segundo plano falhou</string>
<string name="background_request_failed">Solicitação em segundo plano falhou</string>
<string name="entry_type">Tipo</string>
<string name="wifi_network">Rede Wi-Fi</string>
<string name="wifi_ssid">Nome</string>
@@ -189,6 +205,6 @@
<string name="wifi_anonymous_identity">Identidade anônima</string>
<string name="wifi_identity">Identidade</string>
<string name="wifi_phase2">Método Phase 2</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="network_suggestions">Sugestões de rede</string>
<string name="remove_suggestion">Apagar sugestão</string>
</resources>
+23 -8
View File
@@ -16,6 +16,7 @@
<string name="error_correction_level_m" formatted="false">Средний (≈15&#37; исправлений)</string>
<string name="error_correction_level_q" formatted="false">Квартиль (≈25&#37; исправлений)</string>
<string name="error_correction_level_h" formatted="false">Высокий (≈30&#37; исправлений)</string>
<string name="label">Метка</string>
<string name="colors">Цвета</string>
<string name="colors_black_on_white">Чёрный на белом</string>
<string name="colors_white_on_black">Белый на чёрном</string>
@@ -33,6 +34,7 @@
<string name="toggle_flash">Включить вспышку</string>
<string name="error_flash">Ошибка при переключении вспышки</string>
<string name="share">Поделиться</string>
<string name="share_file">Поделиться файлом</string>
<string name="share_as">Поделиться как?</string>
<string name="copy_to_clipboard">Скопировать в буфер обмена</string>
<string name="copied_to_clipboard">Скопировано в буфер обмена</string>
@@ -42,9 +44,11 @@
<string name="cannot_resolve_action">Не найдено приложение для этого действия</string>
<string name="pick_search_engine">Выберите поисковую систему</string>
<string name="format">Формат</string>
<string name="size">Размер в пикселях</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Размер в пикселях: %1$d×%2$d</string>
<string name="size_no_magnification">Без увеличения</string>
<string name="margin_size">Отступ в пикселях: %1$d</string>
<string name="input_content_here">Введите текст здесь</string>
<string name="unescape">Раскрывать управляющие последовательности</string>
<string name="encode">Создать</string>
<string name="error_no_content">Нет данных</string>
<string name="error_encoding_barcode">Штрих-код не может быть создан</string>
@@ -93,8 +97,10 @@
<string name="tone_prop_beep2">Обычный двойной сигнал</string>
<string name="use_history">Сохранять историю сканирования</string>
<string name="use_history_summary">Сохранять распознанные штрих-коды на устройстве.</string>
<string name="ignore_consecutive_duplicates">Не хранить дубликаты</string>
<string name="ignore_consecutive_duplicates_summary">Не сохранять повторяющиеся штрих-коды в истории сканирования.</string>
<string name="ignore_duplicates">Действие с дубликатами</string>
<string name="ignore_consecutive_duplicates">Не сохранять последовательные дубликаты</string>
<string name="ignore_any_duplicates">Не сохранять никакие дубликаты</string>
<string name="accept_duplicates">Сохранять дубликаты</string>
<string name="open_immediately">Сразу открывать содержимое</string>
<string name="open_immediately_summary">Пропускать проверку и сразу открыть содержимое. Может привести к открытию небезопасного содержимого.</string>
<string name="copy_immediately">Автокопирование в буфер обмена</string>
@@ -103,11 +109,13 @@
<string name="show_meta_data_summary">Показывать дополнительную информацию о считанных штрих-кодах.</string>
<string name="show_hex_dump">Показывать шестнадцатеричный дамп</string>
<string name="show_hex_dump_summary">Показывать шестнадцатеричный дамп содержимого считанного штрих-кода.</string>
<string name="show_checksum">Показывать контрольную сумму</string>
<string name="no_checksum">Нет контрольной суммы</string>
<string name="show_recreation">Показывать восстановленный штрих-код</string>
<string name="show_recreation_summary">Показывать штрих-код, восстановленный из считанного содержимого.</string>
<string name="close_automatically">Возврат после копирования/обмена</string>
<string name="close_automatically_summary">Автоматически возвращаться к экрану сканирования после копирования или передачу через функцию «Поделиться» считанного содержимого.</string>
<string name="default_search_engine">Поиск неизвестных данных в</string>
<string name="default_search_engine">Поиск неизвестных данных</string>
<string name="always_ask">Всегда спрашивать</string>
<string name="open_with_url">Открывать неизвестные данные по URL</string>
<string name="clear_network_suggestions">Удалить сетевые предложения</string>
@@ -133,12 +141,15 @@
<string name="bluetooth_connect_fail">Невозможно подключиться к bluetooth-устройству.</string>
<string name="bluetooth_send_fail">Невозможно отправить на bluetooth-устройство.</string>
<string name="bluetooth_send_success">Успешно отправлено по bluetooth.</string>
<string name="generation_category">Создание</string>
<string name="brighten_screen">Яркий экран</string>
<string name="brighten_screen_summary">Устанавливать максимальную яркость, чтобы улучшить сканирование штрих-кода с экрана.</string>
<string name="really_remove_scan">Удалить сканирование?</string>
<string name="really_remove_all_scans">Удалить все сканирования?</string>
<string name="really_remove_selected_scans">Удалить выбранные штрих-коды?</string>
<string name="clear_history">Очистить историю</string>
<string name="copy_scan">Копировать</string>
<string name="edit_scan">Редактировать</string>
<string name="edit_label">Редактировать</string>
<string name="remove_scan">Удалить сканирование</string>
<string name="enter_name">Укажите название сканирования</string>
<string name="enter_name_hint">Название сканирования</string>
@@ -166,6 +177,8 @@
<string name="otpauth_add">Добавить 2FA</string>
<string name="search_web">Поиск в сети</string>
<string name="search_scan">Поиск сканирования</string>
<string name="add_to_history">Добавить в историю</string>
<string name="added_to_history">Добавлено в историю</string>
<string name="export_to_file">Экспортировать в файл</string>
<string name="export_as">Формат файла экспорта</string>
<string name="export_csv_comma">CSV (разделитель – запятая)</string>
@@ -175,10 +188,12 @@
<string name="saved_in_downloads">Сохранено в загрузках</string>
<string name="rotate_image_cw">Повернуть изображение по часовой стрелке</string>
<string name="toggle_free_rotation">Переключить свободный поворот</string>
<string name="pick_file">Открыть файл с изображением</string>
<string name="pick_file">Открыть файл</string>
<string name="pick_image_file">Открыть файл с изображением</string>
<string name="pick_code_to_scan">Выберите штрих-код для сканирования</string>
<string name="shortcut_decode">Сканировать штрих-код</string>
<string name="shortcut_encode">Создать штрих-код</string>
<string name="shortcut_history">История</string>
<string name="shortcut_preferences">Настройки</string>
<string name="background_request_failed">Фоновый запрос не выполнен</string>
<string name="entry_type">Тип</string>
@@ -188,7 +203,7 @@
<string name="wifi_password">Пароль</string>
<string name="wifi_hidden">Скрытая сеть</string>
<string name="wifi_eap">Тип EAP</string>
<string name="wifi_anonymous_identity">Аноним</string>
<string name="wifi_anonymous_identity">Анонимно</string>
<string name="wifi_identity">Пользователь</string>
<string name="wifi_phase2">Двухэтапный метод</string>
<string name="network_suggestions">Сетевые предложения</string>
@@ -2,6 +2,7 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>Google</item>
<item>Brave Search</item>
<item>DuckDuckGo</item>
<item>Qwant</item>
<item>Bing</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.com.tr/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+41 -26
View File
@@ -1,7 +1,7 @@
<resources>
<string name="camera_error">Kameraya erişilemiyor, lütfen yeniden deneyin</string>
<string name="scan_code">Kod tara</string>
<string name="compose_barcode">Barkod yarat</string>
<string name="compose_barcode">Barkod oluştur</string>
<string name="decode_barcode">Barkod çöz</string>
<string name="content">İçerik</string>
<string name="binary_data">(ikili veri)</string>
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Orta (~&#37;15 düzeltim)</string>
<string name="error_correction_level_q" formatted="false">Dörtte Bir (~&#37;25 düzeltim)</string>
<string name="error_correction_level_h" formatted="false">Yüksek (~&#37;30 düzeltim)</string>
<string name="label">Etiket</string>
<string name="colors">Ön ve arka plan</string>
<string name="colors_black_on_white">Beyaz üzerine siyah</string>
<string name="colors_white_on_black">Siyah üzerine beyaz</string>
@@ -31,6 +32,7 @@
<string name="toggle_flash">Flaşı aç</string>
<string name="error_flash">Flaş açılırken hata oluştu</string>
<string name="share">Paylaş</string>
<string name="share_file">Dosya olarak paylaş</string>
<string name="share_as">Şöyle paylaş:</string>
<string name="copy_to_clipboard">Panoya kopyala</string>
<string name="copied_to_clipboard">Panoya kopyalandı</string>
@@ -40,12 +42,14 @@
<string name="cannot_resolve_action">Bunu açacak uygulama yok</string>
<string name="pick_search_engine">Arama motoru seç</string>
<string name="format">Biçim</string>
<string name="size">Piksel türünde boyut</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Piksel türünde boyut: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Piksel türünde kenar boşluğu: %1$d</string>
<string name="input_content_here">İçeriği buraya gir</string>
<string name="unescape">Kaçış dizilerini genişlet</string>
<string name="encode">KODLA</string>
<string name="error_no_content">İçerik eksik</string>
<string name="error_encoding_barcode">Barkod yaratılamadı</string>
<string name="error_encoding_barcode">Barkod oluşturulamadı</string>
<string name="view_barcode">Barkodu gör</string>
<string name="info">Bilgi</string>
<string name="switch_camera">Kamerayı değiştir</string>
@@ -80,19 +84,21 @@
<string name="show_toast_in_bulk_mode_summary">Sürekli tarama yaparken taranan verileri kısaca göster.</string>
<string name="vibrate">Tanıyınca titre</string>
<string name="vibrate_summary">Kod tanındığında aygıtınızın titremesini istiyorsanız bunu etkinleştirin.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="beep">Tanıyınca ses çal</string>
<string name="beep_summary">Kod tanındığında aygıtınızın bip sesi çıkarmasını istiyorsanız bunu etkinleştirin.</string>
<string name="beep_tone">Ses tonu</string>
<string name="tone_cdma_confirm">CDMA onaylaması</string>
<string name="tone_sup_confirm">Çağrı denetleme onayı</string>
<string name="tone_sup_radio_ack">Çağrı denetleme radyo yolu onayı</string>
<string name="tone_prop_ack">Olumlu onay</string>
<string name="tone_prop_beep">Genel bip sesi</string>
<string name="tone_prop_beep2">Genel çift bip sesi</string>
<string name="use_history">Tarama geçmişini kaydet</string>
<string name="use_history_summary">Tanınan kodları aygıtınızda saklayın.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Yinelemeleri göz ardı et</string>
<string name="ignore_consecutive_duplicates_summary">Ardışık yinelemeleri tarama geçmişine kaydetme.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Hemen aç</string>
<string name="open_immediately_summary">İncelemeyi atla ve içeriği hemen aç. Eğer etkinse zararlı içerik açılabilir.</string>
<string name="copy_immediately">Panoya koy</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">Taranan barkod ile ilgili ek veriyi göster</string>
<string name="show_hex_dump">Hex yığınını göster</string>
<string name="show_hex_dump_summary">Taranan içeriklerin hex yığınını göster.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Yeniden oluşturulan barkodu göster</string>
<string name="show_recreation_summary">Mümkünse okunan içerikten barkodu yeniden oluştur ve göster.</string>
<string name="close_automatically">Kopyala/Paylaş\'tan sonra geri dön</string>
@@ -124,19 +132,22 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Harici tarayıcıda aç</string>
<string name="test_url">URL\'yi sına</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="send_scan_bluetooth">Taramaları Bluetooth ile ilet</string>
<string name="send_scan_bluetooth_summary">Taramaları belirtilen bir Bluetooth aygıtına iletmeyi etkinleştirin</string>
<string name="send_scan_bluetooth_host">Aygıt</string>
<string name="no_bluetooth_hosts_paired">Eşleştirilen Aygıt Yok</string>
<string name="bluetooth_connect_fail">Bluetooth aygıtına bağlanılamadı.</string>
<string name="bluetooth_send_fail">Bluetooth aygıtına gönderilemedi.</string>
<string name="bluetooth_send_success">Bluetooth aygıtına gönderildi.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Tarama gerçekten silinsin mi?</string>
<string name="really_remove_all_scans">Tüm taramalar gerçekten silinsin mi?</string>
<string name="really_remove_selected_scans">Seçili taramalar gerçekten silinsin mi?</string>
<string name="clear_history">Geçmişi temizle</string>
<string name="copy_scan">Taramayı kopyala</string>
<string name="edit_scan">Etiketi düzenle</string>
<string name="edit_label">Etiketi düzenle</string>
<string name="remove_scan">Taramayı sil</string>
<string name="enter_name">Taramayı açıklayacak ad gir</string>
<string name="enter_name_hint">Taramanın adı</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">2FA\'ya ekle</string>
<string name="search_web">Web\'i ara</string>
<string name="search_scan">Taramayı ara</string>
<string name="add_to_history">Geçmişe ekle</string>
<string name="added_to_history">Geçmişe eklendi</string>
<string name="export_to_file">Dosyaya dışa aktar</string>
<string name="export_as">Ne olarak dışa aktarılsın?</string>
<string name="export_csv_comma">Virgüller ile CSV</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">İndirilenlere kaydedildi</string>
<string name="rotate_image_cw">Görüntüyü saat yönünde döndür</string>
<string name="toggle_free_rotation">Serbest dönüşü değiştir</string>
<string name="pick_file">Görüntü dosyası seç</string>
<string name="pick_file">Dosya seç</string>
<string name="pick_image_file">Görüntü dosyası seç</string>
<string name="pick_code_to_scan">Taranacak kod seç</string>
<string name="shortcut_decode">Barkod tara</string>
<string name="shortcut_encode">Barkod yarat</string>
<string name="shortcut_encode">Barkod oluştur</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Ayarlar</string>
<string name="background_request_failed">Arka plan isteği başarısız</string>
<string name="entry_type">Tür</string>
@@ -189,6 +204,6 @@
<string name="wifi_anonymous_identity">Anonim kimlik</string>
<string name="wifi_identity">Kimlik</string>
<string name="wifi_phase2">2. aşama yöntemi</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="network_suggestions">Ağ önerileri</string>
<string name="remove_suggestion">Öneriyi kaldır</string>
</resources>
+58 -43
View File
@@ -15,23 +15,25 @@
<string name="error_correction_level_m" formatted="false">Середній (~15&#37; виправлення)</string>
<string name="error_correction_level_q" formatted="false">Квартиль (~25&#37; виправлення)</string>
<string name="error_correction_level_h" formatted="false">Високий (~30&#37; виправлення)</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
<string name="colors_black_on_transparent">Black on transparent</string>
<string name="colors_white_on_transparent">White on transparent</string>
<string name="sequence_size">Sequence size</string>
<string name="sequence_index">Sequence index</string>
<string name="sequence_id">Sequence ID</string>
<string name="label">Мітка</string>
<string name="colors">Кольори</string>
<string name="colors_black_on_white">Чорний на білому</string>
<string name="colors_white_on_black">Білий на чорному</string>
<string name="colors_black_on_transparent">Чорний на прозорому</string>
<string name="colors_white_on_transparent">Білий на прозорому</string>
<string name="sequence_size">Розмір послідовності</string>
<string name="sequence_index">Індекс послідовності</string>
<string name="sequence_id">ID послідовності</string>
<string name="gtin_issue_number">Номер випуску</string>
<string name="gtin_country">Можлива країна-виробник</string>
<string name="gtin_price">Рекомендована ціна</string>
<string name="gtin_add_on">Розширення UPC EAN</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="barcode_version_number">Версія</string>
<string name="qr_version_and_modules">%1$s (%2$d модулі)</string>
<string name="toggle_flash">Увімкнути спалах</string>
<string name="error_flash">Error toggling flash</string>
<string name="error_flash">Помилка під час увімкнення спалаху</string>
<string name="share">Поділитися</string>
<string name="share_file">Поділитися файлом</string>
<string name="share_as">Поділитися як?</string>
<string name="copy_to_clipboard">Копіювати у буфер обміну</string>
<string name="copied_to_clipboard">Скопійовано у буфер обміну</string>
@@ -41,9 +43,11 @@
<string name="cannot_resolve_action">Жодey додаток не може цього відкрити</string>
<string name="pick_search_engine">Вибрати пошукову систему</string>
<string name="format">Формат</string>
<string name="size">Розмір у пікселях</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Розмір у пікселях: %1$d×%2$d</string>
<string name="size_no_magnification">Без збільшення</string>
<string name="margin_size">Відступ у пікселях: %1$d</string>
<string name="input_content_here">Введіть вміст сюди</string>
<string name="unescape">Розгорнути спеціальні послідовності</string>
<string name="encode">КОДУВАТИ</string>
<string name="error_no_content">Відсутній вміст</string>
<string name="error_encoding_barcode">Неможливо створити штрих-код</string>
@@ -53,9 +57,9 @@
<string name="bulk_mode">Сканувати безперервно</string>
<string name="bulk_mode_summary">Завжди починати безперервне сканування.</string>
<string name="bulk_mode_delay">Затримка між безперервним скануванням</string>
<string name="restrict_format">Restrict format</string>
<string name="remove_restriction">Remove restriction</string>
<string name="scan_format">Scan %s</string>
<string name="restrict_format">Обмежити формат</string>
<string name="remove_restriction">Скасувати обмеження</string>
<string name="scan_format">Сканувати %s</string>
<string name="quarter_second">Чверть секунди</string>
<string name="half_second">Півсекунди</string>
<string name="a_second">Одна секунда</string>
@@ -81,19 +85,21 @@
<string name="show_toast_in_bulk_mode_summary">Коротко показати відскановані дані під час безперервного сканування.</string>
<string name="vibrate">Вібрувати при виявленні</string>
<string name="vibrate_summary">Увімкніть це, якщо хочете, щоб пристрій вібрував, коли код розпізнано.</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="beep">Звук при виявленні</string>
<string name="beep_summary">Увімкніть це, якщо хочете, щоб пристрій подавав звуковий сигнал, коли код розпізнано.</string>
<string name="beep_tone">Тон звуку</string>
<string name="tone_cdma_confirm">Підтвердження CDMA</string>
<string name="tone_sup_confirm">Підтвердження диспетчерського виклику</string>
<string name="tone_sup_radio_ack">Підтвердження прийому по радіоканалу</string>
<string name="tone_prop_ack">Позитивне підтвердження</string>
<string name="tone_prop_beep">Звичайний сигнал</string>
<string name="tone_prop_beep2">Звичайний подвійний сигнал</string>
<string name="use_history">Зберігати історію сканування</string>
<string name="use_history_summary">Збережіть розпізнані коди на своєму пристрої.</string>
<string name="ignore_consecutive_duplicates">Ігнорувати дублікати</string>
<string name="ignore_consecutive_duplicates_summary">Не зберігати послідовні дублікати в історії сканування.</string>
<string name="ignore_duplicates">Ігнорувати дублікати</string>
<string name="ignore_consecutive_duplicates">Послідовні дублікати</string>
<string name="ignore_any_duplicates">Будь-які дублікати</string>
<string name="accept_duplicates">Приймати дублікати</string>
<string name="open_immediately">Відкривати негайно</string>
<string name="open_immediately_summary">Пропустити перегляд та негайно відкрити вміст. Якщо увімкнено, може відкрити шкідливий вміст.</string>
<string name="copy_immediately">Помістити в буфер обміну</string>
@@ -102,8 +108,10 @@
<string name="show_meta_data_summary">Показувати додаткові дані про відскановані штрих-коди.</string>
<string name="show_hex_dump">Показувати шістнадцятковий дамп</string>
<string name="show_hex_dump_summary">Показувати шістнадцятковий дамп відсканованого вмісту.</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="show_checksum">Показати контрольну суму</string>
<string name="no_checksum">Немає контрольної суми</string>
<string name="show_recreation">Показати відновлений штрих-код</string>
<string name="show_recreation_summary">Відтворити і показати штрих-код із прочитаного вмісту, якщо це можливо.</string>
<string name="close_automatically">Повернутися після копіювання/поширення</string>
<string name="close_automatically_summary">Автоматично повернутися на екран сканування після копіювання або поширення прочитаного вмісту.</string>
<string name="default_search_engine">Відкривати невідомі дані в</string>
@@ -115,8 +123,8 @@
<string name="clear_network_suggestions_success">Мережеві пропозиції очищено</string>
<string name="clear_network_suggestions_nothing_to_remove">Нічого видаляти</string>
<string name="send_category">Пересилання</string>
<string name="send_scan_active">Forward scans</string>
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
<string name="send_scan_active">Пересилати сканування</string>
<string name="send_scan_active_summary">Пересилати скановані дані на вказану URL</string>
<string name="send_scan_url">Надсилати кожне сканування на URL</string>
<string name="send_scan_type">Тип запиту для кожного сканування</string>
<string name="send_type_get_add_content">GET і просто додати контент</string>
@@ -125,19 +133,22 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">Відкрити у зовнішньому браузері</string>
<string name="test_url">Перевірити URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="send_scan_bluetooth">Пересилати сканування через Bluetooth</string>
<string name="send_scan_bluetooth_summary">Пересилати скановані дані на вказаний хост Bluetooth</string>
<string name="send_scan_bluetooth_host">Хост</string>
<string name="no_bluetooth_hosts_paired">Немає сполучених хостів</string>
<string name="bluetooth_connect_fail">Неможливо підключитися до пристрою Bluetooth.</string>
<string name="bluetooth_send_fail">Неможливо надіслати на пристрій Bluetooth.</string>
<string name="bluetooth_send_success">Успішно надіслано через Bluetooth.</string>
<string name="generation_category">Генерація</string>
<string name="brighten_screen">Збільшити яскравість екрана</string>
<string name="brighten_screen_summary">Встановіть яскравість на максимум, щоб покращити сканування штрих-коду з екрана.</string>
<string name="really_remove_scan">Дійсно видалити сканування?</string>
<string name="really_remove_all_scans">Дійсно видалити всі сканування?</string>
<string name="really_remove_selected_scans">Дійсно видалити вибрані сканування?</string>
<string name="clear_history">Очистити історію</string>
<string name="copy_scan">Скопіювати сканування</string>
<string name="edit_scan">Редагувати мітку</string>
<string name="edit_label">Редагувати мітку</string>
<string name="remove_scan">Видалити сканування</string>
<string name="enter_name">Введіть ім\'я щоб описати сканування</string>
<string name="enter_name_hint">Ім\'я сканування</string>
@@ -165,6 +176,8 @@
<string name="otpauth_add">Додати 2FA</string>
<string name="search_web">Шукати в мережі</string>
<string name="search_scan">Шукати сканування</string>
<string name="add_to_history">Додати до історії</string>
<string name="added_to_history">Додано до історії</string>
<string name="export_to_file">Експортувати в файл</string>
<string name="export_as">Експортувати як?</string>
<string name="export_csv_comma">CSV із комами</string>
@@ -173,11 +186,13 @@
<string name="export_database">Експортувати базу даних SQLite</string>
<string name="saved_in_downloads">Збережено в Завантаженнях</string>
<string name="rotate_image_cw">Повернути зображення за годинниковою стрілкою</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Вибрати файл зображення</string>
<string name="toggle_free_rotation">Увімкнути вільне обертання</string>
<string name="pick_file">Вибрати файл</string>
<string name="pick_image_file">Вибрати файл зображення</string>
<string name="pick_code_to_scan">Вибрати код для сканування</string>
<string name="shortcut_decode">Сканувати штрих-код</string>
<string name="shortcut_encode">Створити штрих-код</string>
<string name="shortcut_history">Історія</string>
<string name="shortcut_preferences">Налаштування</string>
<string name="background_request_failed">Помилка фонового запиту</string>
<string name="entry_type">Тип</string>
@@ -190,6 +205,6 @@
<string name="wifi_anonymous_identity">Анонімна особа</string>
<string name="wifi_identity">Користувач</string>
<string name="wifi_phase2">Phase 2 метод</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="network_suggestions">Мережеві пропозиції</string>
<string name="remove_suggestion">Видалити пропозицію</string>
</resources>
+20 -5
View File
@@ -13,6 +13,7 @@
<string name="error_correction_level_m" formatted="false">Trung bình (sửa ~15&#37;)</string>
<string name="error_correction_level_q" formatted="false">Một phần tư (sửa ~25&#37;)</string>
<string name="error_correction_level_h" formatted="false">Cao (sửa ~30&#37;)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -30,6 +31,7 @@
<string name="toggle_flash">Bật/tắt đèn</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">Chia sẻ</string>
<string name="share_file">Share as file</string>
<string name="share_as">Chia sẻ dưới định dạng?</string>
<string name="copy_to_clipboard">Sao chép</string>
<string name="copied_to_clipboard">Đã sao chép</string>
@@ -39,9 +41,11 @@
<string name="cannot_resolve_action">Không có ứng dụng nào mở được nội dung này</string>
<string name="pick_search_engine">Chọn một trình tìm kiếm</string>
<string name="format">Định dạng</string>
<string name="size">Kích cỡ theo pixel</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Kích cỡ theo pixel: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Nhập nội dung vào đây</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">MÃ HOÁ</string>
<string name="error_no_content">Thiếu nội dung</string>
<string name="error_encoding_barcode">Không thể tạo ra mã vạch</string>
@@ -90,8 +94,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Lưu lịch sử quét</string>
<string name="use_history_summary">Lưu mã đã nhận dạng được trên máy của bạn.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Bỏ qua trùng lặp</string>
<string name="ignore_consecutive_duplicates_summary">Không lưu các kết quả quét trùng lặp liên tục vào lịch sử.</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Mở ngay</string>
<string name="open_immediately_summary">Bỏ qua kiểm tra và mở ngay nội dung. Có thể mở nội dung nguy hiểm nếu kích hoạt.</string>
<string name="copy_immediately">Sao chép kết quả</string>
@@ -100,6 +106,8 @@
<string name="show_meta_data_summary">Hiện thêm thông tin về mã vạch quét được.</string>
<string name="show_hex_dump">Hiện mã thập lục phân</string>
<string name="show_hex_dump_summary">Hiện mã thập lục phân từ mã quét được.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Quay lại sau khi Sao chép/Chia sẻ</string>
@@ -130,12 +138,15 @@
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Thật sự xoá lần quét này?</string>
<string name="really_remove_all_scans">Thật sự xoá tất cả các lần quét?</string>
<string name="really_remove_selected_scans">Thật sự xoá các lần quét được chọn?</string>
<string name="clear_history">Xoá lịch sử</string>
<string name="copy_scan">Sao chép lần quét</string>
<string name="edit_scan">Sửa nhãn</string>
<string name="edit_label">Sửa nhãn</string>
<string name="remove_scan">Xoá lần quét</string>
<string name="enter_name">Nhập tên để miêu tả lần quét</string>
<string name="enter_name_hint">Tên lần quét</string>
@@ -163,6 +174,8 @@
<string name="otpauth_add">Thêm xác thực hai bước</string>
<string name="search_web">Tìm kiếm web</string>
<string name="search_scan">Tìm kiếm lần quét</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Xuất thành tệp</string>
<string name="export_as">Xuất dưói dạng?</string>
<string name="export_csv_comma">Tệp CSV với dấu phẩy</string>
@@ -172,10 +185,12 @@
<string name="saved_in_downloads">Lưu vào Downloads</string>
<string name="rotate_image_cw">Quay ảnh theo chiều kim đồng hồ</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Chọn tệp ảnh</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Chọn tệp ảnh</string>
<string name="pick_code_to_scan">Chọn mã để quét</string>
<string name="shortcut_decode">Quét mã vạch</string>
<string name="shortcut_encode">Tạo mã vạch</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Cài đặt</string>
<string name="background_request_failed">Yêu cầu nền thất bại</string>
<string name="entry_type">Type</string>
+55 -40
View File
@@ -1,5 +1,5 @@
<resources>
<string name="camera_error">无法访问相机,请重试</string>
<string name="camera_error">无法访问相机,请重试</string>
<string name="scan_code">扫码</string>
<string name="compose_barcode">生成条码</string>
<string name="decode_barcode">解析条码</string>
@@ -9,10 +9,11 @@
<item quantity="other">%2$d 字符, %1$s</item>
</plurals>
<string name="error_correction_level">纠错级别</string>
<string name="error_correction_level_l" formatted="false">低 (~7&#37; 准确度)</string>
<string name="error_correction_level_m" formatted="false">中 (~15&#37; 准确度)</string>
<string name="error_correction_level_q" formatted="false">较高 (~25&#37; 准确度)</string>
<string name="error_correction_level_h" formatted="false">高 (~30&#37; 准确度)</string>
<string name="error_correction_level_l" formatted="false">低 (~7% 准确度)</string>
<string name="error_correction_level_m" formatted="false">中 (~15% 准确度)</string>
<string name="error_correction_level_q" formatted="false">较高 (~25% 准确度)</string>
<string name="error_correction_level_h" formatted="false">高 (~30% 准确度)</string>
<string name="label">Label</string>
<string name="colors">前景和背景</string>
<string name="colors_black_on_white">白底黑字</string>
<string name="colors_white_on_black">黑底白字</string>
@@ -30,6 +31,7 @@
<string name="toggle_flash">开关闪光灯</string>
<string name="error_flash">开关闪光灯出错</string>
<string name="share">分享</string>
<string name="share_file">以文件形式分享</string>
<string name="share_as">以何种方式分享?</string>
<string name="copy_to_clipboard">复制到剪贴板</string>
<string name="copied_to_clipboard">已复制到剪贴板</string>
@@ -39,9 +41,11 @@
<string name="cannot_resolve_action">没有应用可以打开它</string>
<string name="pick_search_engine">选择一个搜索引擎</string>
<string name="format">编码格式</string>
<string name="size">图片尺寸</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">图片尺寸: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">边距(像素):%1$d</string>
<string name="input_content_here">在这里输入内容</string>
<string name="unescape">展开转义字符</string>
<string name="encode">编码</string>
<string name="error_no_content">缺少内容</string>
<string name="error_encoding_barcode">无法生成条码</string>
@@ -49,7 +53,7 @@
<string name="info">关于</string>
<string name="switch_camera">切换摄像头</string>
<string name="bulk_mode">连续扫描</string>
<string name="bulk_mode_summary">始终开启连续扫描</string>
<string name="bulk_mode_summary">始终开启连续扫描</string>
<string name="bulk_mode_delay">连续扫描之间的延迟</string>
<string name="restrict_format">严格模式(扫描指定编码格式)</string>
<string name="remove_restriction">解除限制</string>
@@ -67,39 +71,43 @@
<string name="custom_locale">设定语言</string>
<string name="follow_system_settings">跟随系统设置</string>
<string name="show_crop_handle">限制扫描范围</string>
<string name="show_crop_handle_summary">把扫描区域限制在选定范围内</string>
<string name="show_crop_handle_summary">把扫描区域限制在选定范围内</string>
<string name="barcode_formats">条码格式</string>
<string name="zoom_by_swiping">上下滑动缩放</string>
<string name="zoom_by_swiping_summary">通过上下滑动在扫描界面控制相机缩放</string>
<string name="zoom_by_swiping_summary">在扫描界面上下滑动以控制相机缩放</string>
<string name="auto_rotate">识别竖直的 1D 条形码</string>
<string name="auto_rotate_summary">自动旋转相机以识别竖直的 1D 条形码(可能会影响一些设备的扫描性能)</string>
<string name="auto_rotate_summary">自动旋转相机以识别竖直的 1D 条形码(可能会影响一些设备的扫描性能)</string>
<string name="try_harder">提高扫描精度</string>
<string name="try_harder_summary">扫描很难识别的条码时可启用该选项!会影响性能</string>
<string name="try_harder_summary">扫描很难识别的条码时可启用该选项!会影响性能</string>
<string name="show_toast_in_bulk_mode">在连续扫描模式中显示数据</string>
<string name="show_toast_in_bulk_mode_summary">连续扫描时简要显示扫描数据。</string>
<string name="vibrate">识别时震动</string>
<string name="vibrate_summary">如果你希望在识别到条码后震动设备,请启用该选项。</string>
<string name="beep">识别时提示音</string>
<string name="beep_summary">如果你希望在识别到条码后发出提示音,请启用该选项。</string>
<string name="beep_tone">选择提示音</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="beep">识别时的蜂鸣声</string>
<string name="beep_summary">如果你希望在识别到条码后发出蜂鸣声,请启用该选项。</string>
<string name="beep_tone">选择蜂鸣声</string>
<string name="tone_cdma_confirm">CDMA 确认</string>
<string name="tone_sup_confirm">呼叫主管确认</string>
<string name="tone_sup_radio_ack">呼叫主管无线电路径确认</string>
<string name="tone_prop_ack">肯定的确认</string>
<string name="tone_prop_beep">一般蜂鸣声</string>
<string name="tone_prop_beep2">一般两声蜂鸣声</string>
<string name="use_history">保存扫描历史</string>
<string name="use_history_summary">在本地保存扫描历史</string>
<string name="use_history_summary">在本地保存扫描历史</string>
<string name="ignore_duplicates">忽略重复项</string>
<string name="ignore_consecutive_duplicates">不保存重复历史</string>
<string name="ignore_consecutive_duplicates_summary">在扫描历史中不保存重复项</string>
<string name="open_immediately">不查看内容立即打开</string>
<string name="open_immediately_summary">可能会打开有害内容</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">接受重复项</string>
<string name="open_immediately">不检查内容立即打开链接</string>
<string name="open_immediately_summary">跳过检查并立即打开内容。如果启用,可能会打开有害内容。</string>
<string name="copy_immediately">自动复制扫描结果到剪贴板</string>
<string name="copy_immediately_summary">注意其他 APP 可能会在后台监控剪贴板</string>
<string name="copy_immediately_summary">注意其他 APP 可能会在后台监控剪贴板</string>
<string name="show_meta_data">显示元数据</string>
<string name="show_meta_data_summary">显示已扫描条码的额外数据</string>
<string name="show_meta_data_summary">显示已扫描条码的额外数据</string>
<string name="show_hex_dump">显示16进制数据</string>
<string name="show_hex_dump_summary">显示已扫描条码的16进制数据</string>
<string name="show_hex_dump_summary">显示已扫描条码的16进制数据</string>
<string name="show_checksum">显示校验和</string>
<string name="no_checksum">无校验和</string>
<string name="show_recreation">显示重新创建的条码</string>
<string name="show_recreation_summary">如果可以,就从读取内容中重新创建并显示条码。</string>
<string name="close_automatically">复制/分享后自动返回</string>
@@ -113,9 +121,9 @@
<string name="clear_network_suggestions_success">网络建议已清除</string>
<string name="clear_network_suggestions_nothing_to_remove">无内容可清除</string>
<string name="send_category">转发</string>
<string name="send_scan_active">转发扫描</string>
<string name="send_scan_active_summary">启用以转发扫描到给定的 URL</string>
<string name="send_scan_url">转发 URL</string>
<string name="send_scan_active">转发扫描结果</string>
<string name="send_scan_active_summary">启用以转发扫描结果至指定的 URL</string>
<string name="send_scan_url">转发 URL</string>
<string name="send_scan_type">请求类型</string>
<string name="send_type_get_add_content">GET 简单附加数据</string>
<string name="send_type_get_query_string">GET 完整查询数据</string>
@@ -123,19 +131,22 @@
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">在外部浏览器中打开</string>
<string name="test_url">测试 URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="send_scan_bluetooth">使用蓝牙转发扫描结果</string>
<string name="send_scan_bluetooth_summary">启用以转发扫描结果至指定的蓝牙服务设备。</string>
<string name="send_scan_bluetooth_host">蓝牙服务器</string>
<string name="no_bluetooth_hosts_paired">没有已配对的服务器</string>
<string name="bluetooth_connect_fail">无法连接蓝牙设备。</string>
<string name="bluetooth_send_fail">无法将结果发送至蓝牙设备。</string>
<string name="bluetooth_send_success">已通过蓝牙发送。</string>
<string name="generation_category">生成</string>
<string name="brighten_screen">点亮屏幕</string>
<string name="brighten_screen_summary">将屏幕亮度设为最大,以增强从屏幕扫描的效果。</string>
<string name="really_remove_scan">确定删除记录?</string>
<string name="really_remove_all_scans">确定删除全部记录?</string>
<string name="really_remove_selected_scans">确定删除所选记录?</string>
<string name="clear_history">清空记录</string>
<string name="copy_scan">复制扫描记录</string>
<string name="edit_scan">编辑名称</string>
<string name="edit_label">编辑名称</string>
<string name="remove_scan">删除所选记录</string>
<string name="enter_name">输入名称</string>
<string name="enter_name_hint">扫描描述</string>
@@ -163,6 +174,8 @@
<string name="otpauth_add">添加两步验证</string>
<string name="search_web">在互联网中搜索</string>
<string name="search_scan">搜索扫描记录</string>
<string name="add_to_history">添加到历史记录</string>
<string name="added_to_history">已添加到历史记录</string>
<string name="export_to_file">导出为文件</string>
<string name="export_as">另存为?</string>
<string name="export_csv_comma">逗号分隔的 CSV</string>
@@ -172,10 +185,12 @@
<string name="saved_in_downloads">已保存到下载目录</string>
<string name="rotate_image_cw">顺时针旋转图片</string>
<string name="toggle_free_rotation">切换自由旋转</string>
<string name="pick_file">选择图片文件</string>
<string name="pick_file">选择一个文件</string>
<string name="pick_image_file">选择图片文件</string>
<string name="pick_code_to_scan">选择扫描编码</string>
<string name="shortcut_decode">扫描条码</string>
<string name="shortcut_encode">创建条码</string>
<string name="shortcut_history">历史</string>
<string name="shortcut_preferences">设置</string>
<string name="background_request_failed">后台请求失败</string>
<string name="entry_type">类型</string>
+94 -79
View File
@@ -1,8 +1,8 @@
<resources>
<string name="camera_error">不能開啓相機,請重試</string>
<string name="camera_error">無法開啟相機,請再試一次</string>
<string name="scan_code">掃描條碼</string>
<string name="compose_barcode">製作條碼</string>
<string name="decode_barcode">條碼</string>
<string name="decode_barcode">條碼</string>
<string name="content">内容</string>
<string name="binary_data">(二進位資料)</string>
<plurals name="barcode_info">
@@ -13,7 +13,8 @@
<string name="error_correction_level_m" formatted="false">中 (~15&#37; 準確度)</string>
<string name="error_correction_level_q" formatted="false">較高 (~25&#37; 準確度)</string>
<string name="error_correction_level_h" formatted="false">高 (~30&#37; 準確度)</string>
<string name="colors">前景和背景</string>
<string name="label">名稱</string>
<string name="colors">前景與背景</string>
<string name="colors_black_on_white">白底黑字</string>
<string name="colors_white_on_black">黑底白字</string>
<string name="colors_black_on_transparent">透明底黑字</string>
@@ -26,22 +27,25 @@
<string name="gtin_price">建議價格</string>
<string name="gtin_add_on">UPC EAN 擴充</string>
<string name="barcode_version_number">版本</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="toggle_flash">開關閃光燈</string>
<string name="error_flash">開關閃光燈時發生錯誤</string>
<string name="qr_version_and_modules">%1$s (%2$d 模組)</string>
<string name="toggle_flash">控制閃光燈</string>
<string name="error_flash">控制閃光燈時發生錯誤</string>
<string name="share">分享</string>
<string name="share_as">以何種方式分享?</string>
<string name="share_file">分享檔案</string>
<string name="share_as">您要以何種方式分享?</string>
<string name="copy_to_clipboard">複製到剪貼簿</string>
<string name="copied_to_clipboard">已複製到剪貼簿</string>
<string name="copy_password">複製密碼到剪貼簿</string>
<string name="copied_password_to_clipboard">已複製密碼到剪貼簿</string>
<string name="open_url">開啟連結</string>
<string name="cannot_resolve_action">沒有相關程式可以開啟它</string>
<string name="cannot_resolve_action">沒有可開啟這個項目的應用程式</string>
<string name="pick_search_engine">選擇一個搜尋引擎</string>
<string name="format">格式</string>
<string name="size">圖片尺寸</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="input_content_here">在這裡輸入內容</string>
<string name="size_width_by_height">圖片尺寸: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">間距大小: %1$d</string>
<string name="input_content_here">請在這裡輸入內容</string>
<string name="unescape">展開逸出序列</string>
<string name="encode">編碼</string>
<string name="error_no_content">缺少內容</string>
<string name="error_encoding_barcode">無法產生條碼</string>
@@ -49,133 +53,144 @@
<string name="info">關於</string>
<string name="switch_camera">切換相機</string>
<string name="bulk_mode">連續掃描</string>
<string name="bulk_mode_summary">始終開啟連續掃描</string>
<string name="bulk_mode_summary">始終開啟連續掃描</string>
<string name="bulk_mode_delay">連續掃描間的延遲</string>
<string name="restrict_format">限制格式</string>
<string name="remove_restriction">刪除限制</string>
<string name="scan_format">掃描 %s</string>
<string name="quarter_second">四分之一秒</string>
<string name="half_second">半秒</string>
<string name="a_second"></string>
<string name="two_seconds"></string>
<string name="five_seconds"></string>
<string name="a_second">1 </string>
<string name="two_seconds">2 </string>
<string name="five_seconds">5 </string>
<string name="history">歷史記錄</string>
<string name="preferences">偏好設定</string>
<string name="preferences">設定</string>
<string name="scan_category">掃描</string>
<string name="content_category">內容</string>
<string name="locale_category">語言</string>
<string name="custom_locale">設定語言</string>
<string name="follow_system_settings">跟隨系統設定</string>
<string name="show_crop_handle">顯示裁切範圍選擇器</string>
<string name="show_crop_handle_summary">掃描區域限制在定範圍內</string>
<string name="show_crop_handle_summary">掃描區域限制在定範圍內</string>
<string name="barcode_formats">條碼格式</string>
<string name="zoom_by_swiping">上下滑動縮放</string>
<string name="zoom_by_swiping_summary">過上下滑動在掃描面控制相機縮放</string>
<string name="zoom_by_swiping_summary">過上下滑動在掃描面控制相機縮放</string>
<string name="auto_rotate">識別豎直的 1D 條碼</string>
<string name="auto_rotate_summary">自動旋轉相機以識別豎直的 1D 條碼(可能會影響些裝置的掃描能)</string>
<string name="auto_rotate_summary">自動旋轉相機以識別豎直的 1D 條碼 (可能會影響些裝置的掃描能)</string>
<string name="try_harder">提高掃描準確度</string>
<string name="try_harder_summary">掃描很難識別的條碼時可啟用此選項,但會降低掃描速度</string>
<string name="try_harder_summary">掃描不易識別的條碼時可啟用此選項,但會降低速度</string>
<string name="show_toast_in_bulk_mode">在連續掃描模式中顯示資料</string>
<string name="show_toast_in_bulk_mode_summary">連續掃描時簡要顯示掃描資料</string>
<string name="vibrate">動提</string>
<string name="vibrate_summary">識別條碼時振動提示。</string>
<string name="beep">Beep on detection</string>
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
<string name="beep_tone">Beep tone</string>
<string name="tone_cdma_confirm">CDMA confirm</string>
<string name="tone_sup_confirm">Call supervisory confirm</string>
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
<string name="tone_prop_ack">Positive acknowledgment</string>
<string name="tone_prop_beep">General beep</string>
<string name="tone_prop_beep2">General double beep</string>
<string name="show_toast_in_bulk_mode_summary">連續掃描時簡要顯示掃描資料</string>
<string name="vibrate">動提</string>
<string name="vibrate_summary">識別條碼時震動</string>
<string name="beep">偵測音效</string>
<string name="beep_summary">若您希望裝置識別條碼時提醒,請啟用這個選項</string>
<string name="beep_tone">提示音調</string>
<string name="tone_cdma_confirm">CDMA 確認</string>
<string name="tone_sup_confirm">呼叫監控確認</string>
<string name="tone_sup_radio_ack">呼叫監控無線電台應答</string>
<string name="tone_prop_ack">積極應答</string>
<string name="tone_prop_beep">標準嗶聲</string>
<string name="tone_prop_beep2">標準連續嗶聲</string>
<string name="use_history">儲存掃描記錄</string>
<string name="use_history_summary">在本機儲存掃描記錄</string>
<string name="use_history_summary">在本機儲存掃描記錄</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">不儲存重複歷史記錄</string>
<string name="ignore_consecutive_duplicates_summary">在掃描歷史中不儲存連續的重複項目。</string>
<string name="ignore_any_duplicates">Ignore any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">立即開啟</string>
<string name="open_immediately_summary">跳過檢查並立即開啟內容。如果啟用,可能會開啟有害內容</string>
<string name="open_immediately_summary">跳過檢查並立即開啟可能會開啟有害內容</string>
<string name="copy_immediately">自動複製掃描結果到剪貼簿</string>
<string name="copy_immediately_summary">自動將掃描內容複製到剪貼簿。請注意,其他 App 可能會在背景監控剪貼簿</string>
<string name="show_meta_data">顯示 Metadata</string>
<string name="show_meta_data_summary">顯示已掃描條碼的額外資訊</string>
<string name="copy_immediately_summary">自動將掃描內容複製到剪貼簿。請注意,其他應用程式可能會在背景監控剪貼簿</string>
<string name="show_meta_data">顯示中繼資料</string>
<string name="show_meta_data_summary">顯示已掃描條碼的額外資訊</string>
<string name="show_hex_dump">顯示 Hex dump</string>
<string name="show_hex_dump_summary">顯示已掃描條碼的 Hex dump。</string>
<string name="show_recreation">顯示重新創建的條碼</string>
<string name="show_recreation_summary">如果可以,就從讀取內容中重新創建並顯示條碼。</string>
<string name="close_automatically">複製/分享後自動返回</string>
<string name="close_automatically_summary">複製或分享讀取內容後自動返回掃描主要界面。</string>
<string name="default_search_engine">使用何種方式開啟未知資料</string>
<string name="show_hex_dump_summary">顯示已掃描條碼的十六進位轉儲資訊</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">顯示重新產生的條碼</string>
<string name="show_recreation_summary">如果可以,從讀取內容中重新建立並顯示條碼</string>
<string name="close_automatically">複製 / 分享後自動返回</string>
<string name="close_automatically_summary">複製或分享讀取的內容後自動返回掃描畫面</string>
<string name="default_search_engine">開啟未知資料的方式</string>
<string name="always_ask">總是詢問</string>
<string name="open_with_url">使用 URL 開啟未知資料</string>
<string name="clear_network_suggestions">清除網路建議</string>
<string name="clear_network_suggestions_summary">移除此 App 之前提供的所有網路建議</string>
<string name="really_remove_all_networks">真的要移除所有網路嗎?</string>
<string name="clear_network_suggestions_summary">移除應用程式先前提供的所有網路建議</string>
<string name="really_remove_all_networks">您確定要移除所有網路嗎</string>
<string name="clear_network_suggestions_success">網路建議已清除</string>
<string name="clear_network_suggestions_nothing_to_remove">沒有什麼可以移除的</string>
<string name="clear_network_suggestions_nothing_to_remove">沒有移除的項目</string>
<string name="send_category">轉發</string>
<string name="send_scan_active">轉發掃描</string>
<string name="send_scan_active_summary">啟用以將掃描轉發到給定的 URL</string>
<string name="send_scan_active_summary">啟用以將掃描轉發到指定 URL</string>
<string name="send_scan_url">將每個掃描結果傳送到 URL</string>
<string name="send_scan_type">每次掃描的請求類型</string>
<string name="send_type_get_add_content">GET 簡單附加資料</string>
<string name="send_type_get_query_string">GET 完整查詢資料</string>
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
<string name="send_type_post_json">POST application/json</string>
<string name="send_type_external_browser">外部瀏覽器開啟</string>
<string name="send_type_external_browser">外部瀏覽器開啟</string>
<string name="test_url">測試 URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="really_remove_scan">確定刪除記錄?</string>
<string name="really_remove_all_scans">確定刪除全部掃描記錄?</string>
<string name="really_remove_selected_scans">確定刪除所選掃描記錄?</string>
<string name="send_scan_bluetooth">透過藍牙轉發掃描</string>
<string name="send_scan_bluetooth_summary">啟用以將掃描轉發到指定藍牙裝置</string>
<string name="send_scan_bluetooth_host">主機</string>
<string name="no_bluetooth_hosts_paired">沒有配對主機</string>
<string name="bluetooth_connect_fail">無法連線到藍牙裝置</string>
<string name="bluetooth_send_fail">無法傳送到藍牙裝置</string>
<string name="bluetooth_send_success">藍牙傳送完成</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">確定刪除記錄?</string>
<string name="really_remove_all_scans">確定要刪除所有掃描記錄?</string>
<string name="really_remove_selected_scans">確定要刪除選擇的掃描記錄?</string>
<string name="clear_history">清空記錄</string>
<string name="copy_scan">複製掃描記錄</string>
<string name="edit_scan">編輯名稱</string>
<string name="edit_label">編輯名稱</string>
<string name="remove_scan">刪除所選記錄</string>
<string name="enter_name">輸入名稱</string>
<string name="enter_name_hint">掃描描述</string>
<string name="no_barcode_found">找到條碼</string>
<string name="pick_list_separator">如何分隔清單項目?</string>
<string name="no_barcode_found">到條碼</string>
<string name="pick_list_separator">如何分隔清單項目</string>
<string name="separator_line_break">換行符號</string>
<string name="separator_ruler">分割線</string>
<string name="save_as_file_name">在下載資料夾儲存為檔案?</string>
<string name="save_as_file_name">在下載資料夾儲存為檔案</string>
<string name="file_name">檔案名稱</string>
<string name="error_saving_file">無法儲存檔案</string>
<string name="error_file_exists">檔案已存在</string>
<string name="connect_to_wifi">連線到 WiFi</string>
<string name="wifi_config_failed">無法配置 WiFi</string>
<string name="wifi_added">WiFi 已加入</string>
<string name="connect_to_wifi">連線到 Wi-Fi</string>
<string name="wifi_config_failed">無法配置 Wi-Fi</string>
<string name="wifi_added">已加入 Wi-Fi</string>
<string name="sms_send">發送簡訊</string>
<string name="sms_error">無法發送簡訊</string>
<string name="tel_dial">撥打號碼</string>
<string name="tel_error">無法撥打此號碼</string>
<string name="mail_send">發送郵件</string>
<string name="mail_error">無法發送郵件</string>
<string name="vcard_add">加入通訊錄</string>
<string name="vcard_failed">無法加入通訊錄</string>
<string name="vevent_add">加入日曆</string>
<string name="vevent_failed">無法加入日曆</string>
<string name="vcard_add">加入通訊錄</string>
<string name="vcard_failed">無法加入通訊錄</string>
<string name="vevent_add">加入日曆</string>
<string name="vevent_failed">無法加入日曆</string>
<string name="otpauth_add">加入雙重驗證 (2FA)</string>
<string name="search_web">在網路上搜尋</string>
<string name="search_scan">搜尋掃描記錄</string>
<string name="export_to_file">匯出為檔案</string>
<string name="export_as">另存為?</string>
<string name="add_to_history">儲存記錄</string>
<string name="added_to_history">已新增至記錄</string>
<string name="export_to_file">匯出檔案</string>
<string name="export_as">另存為?</string>
<string name="export_csv_comma">逗號分隔的 CSV 檔案</string>
<string name="export_csv_semicolon">分號分隔的 CSV 檔案</string>
<string name="export_json">JSON 檔案</string>
<string name="export_database">出 SQLite 資料庫</string>
<string name="saved_in_downloads">已儲存下載目錄</string>
<string name="export_database">出 SQLite 資料庫</string>
<string name="saved_in_downloads">已儲存下載資料夾</string>
<string name="rotate_image_cw">順時針旋轉圖片</string>
<string name="toggle_free_rotation">切換自由旋轉</string>
<string name="pick_file">選擇圖片檔案</string>
<string name="pick_file">選擇檔案</string>
<string name="pick_image_file">選擇圖片檔案</string>
<string name="pick_code_to_scan">選擇要掃描的條碼</string>
<string name="shortcut_decode">掃描條碼</string>
<string name="shortcut_encode">建立條碼</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">設定</string>
<string name="background_request_failed">背景請求失敗</string>
<string name="entry_type">類型</string>
@@ -184,10 +199,10 @@
<string name="wifi_type">驗證類型</string>
<string name="wifi_password">密碼</string>
<string name="wifi_hidden">隱藏的網路</string>
<string name="wifi_eap">EAP method</string>
<string name="wifi_eap">EAP 方式</string>
<string name="wifi_anonymous_identity">匿名身分</string>
<string name="wifi_identity">身分</string>
<string name="wifi_phase2">Phase 2 method</string>
<string name="network_suggestions">Network suggestions</string>
<string name="remove_suggestion">Remove suggestion</string>
<string name="wifi_phase2">Phase 2 方式</string>
<string name="network_suggestions">網路建議</string>
<string name="remove_suggestion">移除建議</string>
</resources>
@@ -8,6 +8,7 @@
<item>DATA BAR</item>
<item>DATA BAR EXPANDED</item>
<item>DATA MATRIX</item>
<item>DX FILM EDGE</item>
<item>EAN 8</item>
<item>EAN 13</item>
<item>ITF</item>
@@ -15,6 +16,7 @@
<item>PDF 417</item>
<item>QR CODE</item>
<item>MICRO QR CODE</item>
<item>rMQR CODE</item>
<item>UPC A</item>
<item>UPC E</item>
</string-array>
@@ -27,6 +29,7 @@
<item>DATA_BAR</item>
<item>DATA_BAR_EXPANDED</item>
<item>DATA_MATRIX</item>
<item>DX_FILM_EDGE</item>
<item>EAN_8</item>
<item>EAN_13</item>
<item>ITF</item>
@@ -34,6 +37,7 @@
<item>PDF_417</item>
<item>QR_CODE</item>
<item>MICRO_QR_CODE</item>
<item>RMQR_CODE</item>
<item>UPC_A</item>
<item>UPC_E</item>
</string-array>
@@ -4,4 +4,8 @@
<string name="url_hint_add_content" translatable="false">http://example.com/?content=</string>
<string name="project_url" translatable="false">https://github.com/markusfisch/BinaryEye</string>
<string name="no_bluetooth_hosts_paired_value" translatable="false" />
<string name="crc4" translatable="false">CRC4</string>
<string name="md5" translatable="false">MD5</string>
<string name="sha1" translatable="false">SHA1</string>
<string name="sha256" translatable="false">SHA256</string>
</resources>
@@ -0,0 +1,12 @@
<resources>
<string-array name="ignore_duplicates_names">
<item>@string/ignore_consecutive_duplicates</item>
<item>@string/ignore_any_duplicates</item>
<item>@string/accept_duplicates</item>
</string-array>
<string-array name="ignore_duplicates_values">
<item>ignore_consecutive_duplicates</item>
<item>ignore_any_duplicates</item>
<item>accept_duplicates</item>
</string-array>
</resources>
+2
View File
@@ -2,6 +2,7 @@
<string-array name="locale_names">
<item>@string/follow_system_settings</item>
<item>English</item>
<item>Bulgarian</item>
<item>German</item>
<item>Spanish</item>
<item>French</item>
@@ -25,6 +26,7 @@
<string-array name="locale_values">
<item></item>
<item>en</item>
<item>bg</item>
<item>de</item>
<item>es</item>
<item>fr</item>
+3 -1
View File
@@ -2,11 +2,12 @@
<string-array name="search_engines_names">
<item>@string/always_ask</item>
<item>Google</item>
<item>Brave Search</item>
<item>DuckDuckGo</item>
<item>Qwant</item>
<item>Bing</item>
<item>Yandex</item>
<item>ebay</item>
<item>eBay</item>
<item>Amazon</item>
<item>OpenFoodFacts.org</item>
<item>OpenBeautyFacts.org</item>
@@ -16,6 +17,7 @@
<string-array name="search_engines_values">
<item></item>
<item>https://www.google.com/search?q=</item>
<item>https://search.brave.com/search?q=</item>
<item>https://duckduckgo.com/?q=</item>
<item>https://www.qwant.com/?q=</item>
<item>https://bing.com/?q=</item>
+16
View File
@@ -0,0 +1,16 @@
<resources>
<string-array name="checksum_names">
<item>@string/no_checksum</item>
<item>@string/crc4</item>
<item>@string/md5</item>
<item>@string/sha1</item>
<item>@string/sha256</item>
</string-array>
<string-array name="checksum_values">
<item></item>
<item>CRC4</item>
<item>MD5</item>
<item>SHA1</item>
<item>SHA256</item>
</string-array>
</resources>
+34 -19
View File
@@ -1,4 +1,4 @@
<resources>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="camera_error">Can\'t access camera, please try again</string>
<string name="scan_code">Scan code</string>
<string name="compose_barcode">Compose barcode</string>
@@ -14,6 +14,7 @@
<string name="error_correction_level_m" formatted="false">Medium (~15&#37; correction)</string>
<string name="error_correction_level_q" formatted="false">Quartile (~25&#37; correction)</string>
<string name="error_correction_level_h" formatted="false">High (~30&#37; correction)</string>
<string name="label">Label</string>
<string name="colors">Fore and background</string>
<string name="colors_black_on_white">Black on white</string>
<string name="colors_white_on_black">White on black</string>
@@ -27,22 +28,25 @@
<string name="gtin_price">Suggested price</string>
<string name="gtin_add_on">UPC EAN extension</string>
<string name="barcode_version_number">Version</string>
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
<string name="qr_version_and_modules" tools:ignore="PluralsCandidate">%1$s (%2$d modules)</string>
<string name="toggle_flash">Toggle flash</string>
<string name="error_flash">Error toggling flash</string>
<string name="share">Share</string>
<string name="share_file">Share as file</string>
<string name="share_as">Share as?</string>
<string name="copy_to_clipboard">Copy to clipboard</string>
<string name="copied_to_clipboard">Copied to clipboard</string>
<string name="copy_password">Copy password into clipboard</string>
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
<string name="open_url">Open url</string>
<string name="open_url">Open URL</string>
<string name="cannot_resolve_action">No application can open that</string>
<string name="pick_search_engine">Pick a search engine</string>
<string name="format">Format</string>
<string name="size">Size in pixels</string>
<string name="width_by_height">%1$d×%2$d</string>
<string name="size_width_by_height">Size in pixels: %1$d×%2$d</string>
<string name="size_no_magnification">No magnification</string>
<string name="margin_size">Margin in pixels: %1$d</string>
<string name="input_content_here">Input content here</string>
<string name="unescape">Expand escape sequences</string>
<string name="encode">ENCODE</string>
<string name="error_no_content">Missing content</string>
<string name="error_encoding_barcode">Barcode cannot be generated</string>
@@ -61,7 +65,7 @@
<string name="two_seconds">Two seconds</string>
<string name="five_seconds">Five seconds</string>
<string name="history">History</string>
<string name="preferences">Preferences</string>
<string name="preferences">Settings</string>
<string name="scan_category">Scan</string>
<string name="content_category">Content</string>
<string name="locale_category">Language</string>
@@ -91,8 +95,10 @@
<string name="tone_prop_beep2">General double beep</string>
<string name="use_history">Save scan history</string>
<string name="use_history_summary">Save recognized codes on your device.</string>
<string name="ignore_consecutive_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates_summary">Do not save consecutive duplicates in the scan history.</string>
<string name="ignore_duplicates">Ignore duplicates</string>
<string name="ignore_consecutive_duplicates">Consecutive duplicates</string>
<string name="ignore_any_duplicates">Any duplicates</string>
<string name="accept_duplicates">Accept duplicates</string>
<string name="open_immediately">Open immediately</string>
<string name="open_immediately_summary">Skip inspection and open contents immediately. May open harmful content if enabled.</string>
<string name="copy_immediately">Put into clipboard</string>
@@ -101,6 +107,8 @@
<string name="show_meta_data_summary">Show additional data about the scanned barcode.</string>
<string name="show_hex_dump">Show hex dump</string>
<string name="show_hex_dump_summary">Show a hex dump of the scanned contents.</string>
<string name="show_checksum">Show checksum</string>
<string name="no_checksum">No checksum</string>
<string name="show_recreation">Show recreated barcode</string>
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
<string name="close_automatically">Go back after Copy/Share</string>
@@ -115,7 +123,7 @@
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
<string name="send_category">Forwarding</string>
<string name="send_scan_active">Forward scans</string>
<string name="send_scan_active_summary">Enable to forward scans to a the given URL.</string>
<string name="send_scan_active_summary">Enable to forward scans to a given URL.</string>
<string name="send_scan_url">URL to forward to</string>
<string name="send_scan_type">Request type</string>
<string name="send_type_get_add_content">GET and simply add content</string>
@@ -125,18 +133,21 @@
<string name="send_type_external_browser">Open in external browser</string>
<string name="test_url">Test URL</string>
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_summary">Enable to forward scans to a given Bluetooth host.</string>
<string name="send_scan_bluetooth_host">Host</string>
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
<string name="bluetooth_send_success">Successful bluetooth send.</string>
<string name="bluetooth_connect_fail">Could not connect to Bluetooth device.</string>
<string name="bluetooth_send_fail">Could not send to Bluetooth device.</string>
<string name="bluetooth_send_success">Successful Bluetooth send.</string>
<string name="generation_category">Generation</string>
<string name="brighten_screen">Brighten screen</string>
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
<string name="really_remove_scan">Really remove scan?</string>
<string name="really_remove_all_scans">Really remove all scans?</string>
<string name="really_remove_selected_scans">Really remove selected scans?</string>
<string name="clear_history">Clear history</string>
<string name="copy_scan">Copy scan</string>
<string name="edit_scan">Edit label</string>
<string name="edit_label">Edit label</string>
<string name="remove_scan">Remove scan</string>
<string name="enter_name">Enter a name to describe the scan</string>
<string name="enter_name_hint">Name of the scan</string>
@@ -144,13 +155,13 @@
<string name="pick_list_separator">How to separate list items?</string>
<string name="separator_line_break">Line break</string>
<string name="separator_ruler">Ruler</string>
<string name="save_as_file_name">Save as in Downloads file?</string>
<string name="save_as_file_name">Save in Downloads folder?</string>
<string name="file_name">File name</string>
<string name="error_saving_file">Cannot save file</string>
<string name="error_file_exists">File already exists</string>
<string name="connect_to_wifi">Connect to WiFi</string>
<string name="wifi_config_failed">Could not configure WiFi</string>
<string name="wifi_added">WiFi added</string>
<string name="connect_to_wifi">Connect to Wi-Fi</string>
<string name="wifi_config_failed">Could not configure Wi-Fi</string>
<string name="wifi_added">Wi-Fi added</string>
<string name="sms_send">Send SMS</string>
<string name="sms_error">Could not send SMS</string>
<string name="tel_dial">Dial number</string>
@@ -164,6 +175,8 @@
<string name="otpauth_add">Add 2FA</string>
<string name="search_web">Search the web</string>
<string name="search_scan">Search scan</string>
<string name="add_to_history">Add to history</string>
<string name="added_to_history">Added to history</string>
<string name="export_to_file">Export to file</string>
<string name="export_as">Export as?</string>
<string name="export_csv_comma">CSV file with commas</string>
@@ -173,10 +186,12 @@
<string name="saved_in_downloads">Saved in downloads</string>
<string name="rotate_image_cw">Rotate image clockwise</string>
<string name="toggle_free_rotation">Toggle free rotation</string>
<string name="pick_file">Pick image file</string>
<string name="pick_file">Pick a file</string>
<string name="pick_image_file">Pick image file</string>
<string name="pick_code_to_scan">Pick code to scan</string>
<string name="shortcut_decode">Scan a barcode</string>
<string name="shortcut_encode">Create a barcode</string>
<string name="shortcut_history">History</string>
<string name="shortcut_preferences">Settings</string>
<string name="background_request_failed">Background request failed</string>
<string name="entry_type">Type</string>
+6
View File
@@ -26,6 +26,12 @@
<item name="android:paddingRight">@dimen/button_padding</item>
<item name="android:maxLines">1</item>
</style>
<style name="Spinner">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingTop">4dp</item>
<item name="android:paddingBottom">4dp</item>
</style>
<style name="FAB" parent="Widget.Design.FloatingActionButton">
<!-- Silence nonsense warning about setting a custom background. -->
<item name="android:background">@null</item>
+20 -6
View File
@@ -4,7 +4,7 @@
android:key="preferences">
<PreferenceCategory android:title="@string/scan_category">
<MultiSelectListPreference
android:key="barcode_formats"
android:key="formats"
android:title="@string/barcode_formats"
android:entries="@array/barcode_formats_names"
android:entryValues="@array/barcode_formats_values"/>
@@ -65,11 +65,12 @@
android:key="use_history"
android:title="@string/use_history"
android:summary="@string/use_history_summary"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="ignore_consecutive_duplicates"
android:title="@string/ignore_consecutive_duplicates"
android:summary="@string/ignore_consecutive_duplicates_summary"/>
<ListPreference
android:key="ignore_duplicates_name"
android:title="@string/ignore_duplicates"
android:entries="@array/ignore_duplicates_names"
android:entryValues="@array/ignore_duplicates_values"
android:defaultValue="ignore_consecutive_duplicates"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="copy_immediately"
@@ -119,6 +120,12 @@
android:key="show_hex_dump"
android:title="@string/show_hex_dump"
android:summary="@string/show_hex_dump_summary"/>
<ListPreference
android:key="show_checksum"
android:title="@string/show_checksum"
android:entries="@array/checksum_names"
android:entryValues="@array/checksum_values"
android:defaultValue="@string/no_checksum"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="show_recreation"
@@ -143,6 +150,13 @@
android:title="@string/clear_network_suggestions"
android:summary="@string/clear_network_suggestions_summary"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/generation_category">
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="brighten_screen"
android:title="@string/brighten_screen"
android:summary="@string/brighten_screen_summary"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/locale_category">
<ListPreference
android:key="custom_locale"
+20 -6
View File
@@ -4,7 +4,7 @@
android:key="preferences">
<PreferenceCategory android:title="@string/scan_category">
<MultiSelectListPreference
android:key="barcode_formats"
android:key="formats"
android:title="@string/barcode_formats"
android:entries="@array/barcode_formats_names"
android:entryValues="@array/barcode_formats_values"/>
@@ -65,11 +65,12 @@
android:key="use_history"
android:title="@string/use_history"
android:summary="@string/use_history_summary"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="ignore_consecutive_duplicates"
android:title="@string/ignore_consecutive_duplicates"
android:summary="@string/ignore_consecutive_duplicates_summary"/>
<ListPreference
android:key="ignore_duplicates_name"
android:title="@string/ignore_duplicates"
android:entries="@array/ignore_duplicates_names"
android:entryValues="@array/ignore_duplicates_values"
android:defaultValue="ignore_consecutive_duplicates"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="copy_immediately"
@@ -119,6 +120,12 @@
android:key="show_hex_dump"
android:title="@string/show_hex_dump"
android:summary="@string/show_hex_dump_summary"/>
<ListPreference
android:key="show_checksum"
android:title="@string/show_checksum"
android:entries="@array/checksum_names"
android:entryValues="@array/checksum_values"
android:defaultValue="@string/no_checksum"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="show_recreation"
@@ -143,4 +150,11 @@
android:title="@string/clear_network_suggestions"
android:summary="@string/clear_network_suggestions_summary"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/generation_category">
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="brighten_screen"
android:title="@string/brighten_screen"
android:summary="@string/brighten_screen_summary"/>
</PreferenceCategory>
</PreferenceScreen>
+19 -5
View File
@@ -60,11 +60,12 @@
android:key="use_history"
android:title="@string/use_history"
android:summary="@string/use_history_summary"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="ignore_consecutive_duplicates"
android:title="@string/ignore_consecutive_duplicates"
android:summary="@string/ignore_consecutive_duplicates_summary"/>
<ListPreference
android:key="ignore_duplicates_name"
android:title="@string/ignore_duplicates"
android:entries="@array/ignore_duplicates_names"
android:entryValues="@array/ignore_duplicates_values"
android:defaultValue="ignore_consecutive_duplicates"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="copy_immediately"
@@ -114,6 +115,12 @@
android:key="show_hex_dump"
android:title="@string/show_hex_dump"
android:summary="@string/show_hex_dump_summary"/>
<ListPreference
android:key="show_checksum"
android:title="@string/show_checksum"
android:entries="@array/checksum_names"
android:entryValues="@array/checksum_values"
android:defaultValue="@string/no_checksum"/>
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="show_recreation"
@@ -138,6 +145,13 @@
android:title="@string/clear_network_suggestions"
android:summary="@string/clear_network_suggestions_summary"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/generation_category">
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="brighten_screen"
android:title="@string/brighten_screen"
android:summary="@string/brighten_screen_summary"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/locale_category">
<ListPreference
android:key="custom_locale"
+13
View File
@@ -26,6 +26,19 @@
<extra android:name="encode" android:value="encode"/>
</intent>
</shortcut>
<shortcut
android:shortcutId="history"
android:enabled="true"
android:icon="@drawable/ic_shortcut_history"
android:shortcutShortLabel="@string/shortcut_history"
android:shortcutDisabledMessage="@string/shortcut_history">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="de.markusfisch.android.binaryeye"
android:targetClass="de.markusfisch.android.binaryeye.activity.MainActivity">
<extra android:name="history" android:value="history"/>
</intent>
</shortcut>
<shortcut
android:shortcutId="preferences"
android:enabled="true"
@@ -8,15 +8,36 @@ class VTypeTest {
fun vcard() {
val content = """BEGIN:VCARD
N:Doe;John
TEL:511
END:VCARD"""
assertEquals("VCARD", VTypeParser.parseVType(content))
val info = VTypeParser.parseMap(content)
info["N"]?.singleOrNull()?.also {
assertEquals("Doe;John", it.value)
}
assertEquals("Doe;John", info["N"]?.singleOrNull()?.value)
assertEquals("511", info["TEL"]?.singleOrNull()?.value)
}
@Test
fun vcardWithExplicitTelType() {
val content = """BEGIN:VCARD
N:Doe;John
TEL;TYPE=WORK:511
TEL;HOME:311
END:VCARD"""
assertEquals("VCARD", VTypeParser.parseVType(content))
val info = VTypeParser.parseMap(content)
assertEquals("Doe;John", info["N"]?.singleOrNull()?.value)
val work = info["TEL"]?.get(0)
assertEquals("511", work?.value)
assertEquals("WORK", work?.firstTypeOrFirstInfo)
val home = info["TEL"]?.get(1)
assertEquals("311", home?.value)
assertEquals("HOME", home?.firstTypeOrFirstInfo)
}
@Test
@@ -33,15 +54,18 @@ END:VCALENDAR"""
val info = VTypeParser.parseMap(content)
info["SUMMARY"]?.singleOrNull()?.also {
assertEquals("foo", it.value)
}
info["DTSTART"]?.singleOrNull()?.also {
assertEquals("20080504T123456Z", it.value)
}
info["DTEND"]?.singleOrNull()?.also {
assertEquals("20080505T234555Z", it.value)
}
assertEquals(
"foo",
info["SUMMARY"]?.singleOrNull()?.value
)
assertEquals(
"20080504T123456Z",
info["DTSTART"]?.singleOrNull()?.value
)
assertEquals(
"20080505T234555Z",
info["DTEND"]?.singleOrNull()?.value
)
}
@Test
@@ -56,15 +80,18 @@ END:VEVENT"""
val info = VTypeParser.parseMap(content)
info["SUMMARY"]?.singleOrNull()?.also {
assertEquals("foo", it.value)
}
info["DTSTART"]?.singleOrNull()?.also {
assertEquals("20080504T123456Z", it.value)
}
info["DTEND"]?.singleOrNull()?.also {
assertEquals("20080505T234555Z", it.value)
}
assertEquals(
"foo",
info["SUMMARY"]?.singleOrNull()?.value
)
assertEquals(
"20080504T123456Z",
info["DTSTART"]?.singleOrNull()?.value
)
assertEquals(
"20080505T234555Z",
info["DTEND"]?.singleOrNull()?.value
)
}
@Test
@@ -79,14 +106,17 @@ END:VEVENT"""
val info = VTypeParser.parseMap(content)
info["SUMMARY"]?.singleOrNull()?.also {
assertEquals("foo", it.value)
}
info["DTSTART"]?.singleOrNull()?.also {
assertEquals("20080504T123456Z", it.value)
}
info["DTEND"]?.singleOrNull()?.also {
assertEquals("20080505T234555Z", it.value)
}
assertEquals(
"foo",
info["SUMMARY"]?.singleOrNull()?.value
)
assertEquals(
"20080504T123456Z",
info["DTSTART"]?.singleOrNull()?.value
)
assertEquals(
"20080505T234555Z",
info["DTEND"]?.singleOrNull()?.value
)
}
}

Some files were not shown because too many files have changed in this diff Show More