Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e91c30f7c2 | ||
|
|
30a36e7e07 | ||
|
|
5f91fe2f02 | ||
|
|
cab8d6c038 | ||
|
|
4aac5dc61b | ||
|
|
fbbc20d327 | ||
|
|
5595b68ff4 | ||
|
|
c492897fa9 | ||
|
|
647c08bfb8 | ||
|
|
e5025ef58c | ||
|
|
74bb421b2d | ||
|
|
4ed8d4614a | ||
|
|
f038eb989b | ||
|
|
c5722a3890 | ||
|
|
41108007ad | ||
|
|
867f179a37 | ||
|
|
892916b0d0 | ||
|
|
3bd440fdb7 | ||
|
|
a4c8551be8 | ||
|
|
316644d3ae | ||
|
|
9fb2eb2d2b | ||
|
|
dd046a5d52 | ||
|
|
f3ddd458cb | ||
|
|
157d928620 | ||
|
|
94cb509f0b | ||
|
|
df18f8ebd3 | ||
|
|
705095472f | ||
|
|
f897973b3f | ||
|
|
c88d5cf4cd | ||
|
|
8ecd49731f | ||
|
|
6f3b4dbdab | ||
|
|
3c8c0737c4 | ||
|
|
9baf6d621a | ||
|
|
f0d0ee04af | ||
|
|
4d38da045a | ||
|
|
af70d9507b | ||
|
|
273f38c36c | ||
|
|
210cdfc171 | ||
|
|
3ec8c4b5d7 | ||
|
|
d99f0ca039 | ||
|
|
4a9e700d20 | ||
|
|
40e339ce89 | ||
|
|
9d476b3491 | ||
|
|
22b58265a5 | ||
|
|
bd4576b7ac | ||
|
|
a57f6d1904 | ||
|
|
842b38c986 | ||
|
|
b1fae727a9 | ||
|
|
db24f608d5 | ||
|
|
9f49a00bae | ||
|
|
947bbf3031 | ||
|
|
b3b57a7ba8 | ||
|
|
1627f3ead9 | ||
|
|
4343f5da82 | ||
|
|
67395a067d | ||
|
|
0de571f3c1 | ||
|
|
d83cd77a87 | ||
|
|
5ca7aff5df | ||
|
|
e4cc516a9b | ||
|
|
f160cf0953 | ||
|
|
ef5b5aa34a | ||
|
|
536ee5bc3d | ||
|
|
0becada572 | ||
|
|
0c773d6f05 | ||
|
|
f2df364840 | ||
|
|
5740b43568 | ||
|
|
b384b99b01 | ||
|
|
6affa4ce25 | ||
|
|
455d329fff | ||
|
|
792be87283 | ||
|
|
381e10bddc | ||
|
|
220d1b9d4c | ||
|
|
020cd2c192 | ||
|
|
e8766a0fd1 | ||
|
|
69c6d1324e | ||
|
|
2dd0c48225 | ||
|
|
faa536274b | ||
|
|
0a944f9fb8 | ||
|
|
a31982646a | ||
|
|
4320ee8fcc | ||
|
|
d890bf28fa | ||
|
|
6347bd568c | ||
|
|
9de11e2ae8 | ||
|
|
57c381e310 | ||
|
|
a11650eaa5 | ||
|
|
e85b006e40 | ||
|
|
a6c25be316 | ||
|
|
2b011325a6 | ||
|
|
fb96d5ecf8 | ||
|
|
897d61a646 | ||
|
|
ac67db6491 | ||
|
|
84bc7dad30 | ||
|
|
b21af65b68 | ||
|
|
a7adec7177 | ||
|
|
fc6fcfa743 | ||
|
|
47f95fc67a | ||
|
|
deccc9eb36 | ||
|
|
6505312b44 | ||
|
|
cb82fc3252 | ||
|
|
636ac2386a | ||
|
|
49d32ff95c | ||
|
|
fed7d561c5 | ||
|
|
8e22290c5f | ||
|
|
b33e474d12 | ||
|
|
40a05a1fc0 | ||
|
|
d947764882 | ||
|
|
1a5a8e0fa1 | ||
|
|
e6d9d54866 | ||
|
|
538155bf04 | ||
|
|
3266a58041 | ||
|
|
d594a43d6d | ||
|
|
0aa1f80451 | ||
|
|
36eff75546 | ||
|
|
8aef9c22dd | ||
|
|
1a159b35ee | ||
|
|
05ab87caa8 | ||
|
|
a3f0185f08 | ||
|
|
104f409486 | ||
|
|
eb8f578bd8 | ||
|
|
a8e420fc95 | ||
|
|
7120e18670 | ||
|
|
9fb34965f5 | ||
|
|
c5cbd1140b | ||
|
|
fecdcd7deb | ||
|
|
fd3d2f9934 | ||
|
|
35b6ead662 | ||
|
|
ad62cb5a03 | ||
|
|
e1905b1ff2 | ||
|
|
9aecf0d83b | ||
|
|
2645366baa | ||
|
|
37ea4ac9af | ||
|
|
4a6f5c5f92 | ||
|
|
b1ddb0fe7a | ||
|
|
2f61db731d | ||
|
|
b0de90c702 | ||
|
|
8df09090c9 | ||
|
|
9feef33275 | ||
|
|
147ad22df0 | ||
|
|
be833b7645 | ||
|
|
0eb921d579 | ||
|
|
1d156e0dbd | ||
|
|
82c1225848 | ||
|
|
33c1697d80 | ||
|
|
1d4e5d25ae | ||
|
|
386b47fbed | ||
|
|
b2c2632d76 | ||
|
|
4d64a5704d | ||
|
|
8875937022 | ||
|
|
3d33f62d7b | ||
|
|
a4050cbf8f | ||
|
|
abb362230e | ||
|
|
967cab9c7b | ||
|
|
c8d7be95e9 | ||
|
|
18146ec41a | ||
|
|
5cd6114ba1 | ||
|
|
8a310a1144 | ||
|
|
afc597ab90 | ||
|
|
6d742c4d19 | ||
|
|
1776559d40 | ||
|
|
75c1eb6b64 | ||
|
|
c5cffc00c3 | ||
|
|
c0153e822c | ||
|
|
f070269c2c | ||
|
|
3e8df89db1 | ||
|
|
56237c43cd | ||
|
|
7fc565ae67 | ||
|
|
656c1e36a8 | ||
|
|
42a6043f63 | ||
|
|
6a5fdae584 | ||
|
|
899deb77b5 | ||
|
|
3419194bfd | ||
|
|
3b55d48f65 | ||
|
|
d34673ddc3 | ||
|
|
242bf4c0a1 | ||
|
|
ed2a12eef8 | ||
|
|
4dd5c12e85 | ||
|
|
d3fae01786 | ||
|
|
37b6e6f832 | ||
|
|
e3274fd065 | ||
|
|
c75b9f73ab | ||
|
|
1432669aee | ||
|
|
00a8a94b59 | ||
|
|
c8c3da91ae | ||
|
|
8cbc73b7f8 | ||
|
|
941d875b3e | ||
|
|
1ac578845e | ||
|
|
e816e8bf89 | ||
|
|
54c368fcd8 | ||
|
|
c225e7d9eb | ||
|
|
6a0ce45a65 | ||
|
|
11c97cc4ef | ||
|
|
e3f6732bb8 | ||
|
|
53ae706b9c | ||
|
|
26a7ad2e6e | ||
|
|
9c3984ce7a | ||
|
|
f7d07e0b8a |
+115
@@ -1,5 +1,120 @@
|
||||
# Change Log
|
||||
|
||||
## 1.46.1
|
||||
* Use cropping limiter settings for image picking too
|
||||
* Remove extra link on result screen
|
||||
* Update Turkish translation
|
||||
|
||||
## 1.46.0
|
||||
* Support deep links
|
||||
* Support "A:" in WIFI codes
|
||||
* Allow multiple query arguments in custom URL
|
||||
* Add Wi-Fi info data section
|
||||
* Add Vietnamese translation
|
||||
* Update Brazilian Portuguese translation
|
||||
* Update Hungarian translation
|
||||
* Update Ukrainian translation
|
||||
* Update Russian translation
|
||||
|
||||
## 1.45.0
|
||||
* Add a setting to set the delay for bulk mode
|
||||
* Add support for MECARD contact format
|
||||
* Remove unused permissions on Android Q
|
||||
|
||||
## 1.44.1
|
||||
* Update Spanish translation
|
||||
* Update Japanese translation
|
||||
* Fix in-app language switching for App Bundles
|
||||
|
||||
## 1.44.0
|
||||
* Add a setting to choose barcode formats to scan
|
||||
* Ask before removing network suggestions
|
||||
* Update Traditional Chinese Translation
|
||||
* Update Russian language
|
||||
* Update Dutch translation
|
||||
|
||||
## 1.43.0
|
||||
* Add a preference item to remove WiFi network suggestions
|
||||
* Update Traditional Chinese Translation
|
||||
* Update Russian language
|
||||
|
||||
## 1.42.0
|
||||
* Add a setting to pick a default search engine
|
||||
* Update Traditional Chinese
|
||||
* Update Dutch translation
|
||||
|
||||
## 1.41.1
|
||||
* Update Bengali translation
|
||||
* Update Simplified Chinese
|
||||
|
||||
## 1.41.0
|
||||
* Use cropping limiter by default for new installations
|
||||
* Truncate all toasts with strings from the outside
|
||||
* Add Bangla translation
|
||||
* Add missing Japanese locale
|
||||
* Update Hungarian translation
|
||||
* Update Russian app description
|
||||
|
||||
## 1.40.0
|
||||
* Add a setting to show/hide scanned data when scanning continuously
|
||||
* Only show the first 50 characters when scanning continuously
|
||||
* Share binary data as hex dump
|
||||
* Update Russian language
|
||||
|
||||
## 1.39.0
|
||||
* Fix adding contacts and calendar entries on Android 11+
|
||||
* Add a setting to always start in bulk mode
|
||||
* Add Czech translation
|
||||
* Update Spanish translation
|
||||
* Update Czech translation
|
||||
|
||||
## 1.38.0
|
||||
* Add a quick settings tile to scan from settings
|
||||
* Make custom background requests time out after 5 seconds
|
||||
* Add Japanese translation
|
||||
* Updated French translation
|
||||
|
||||
## 1.37.0
|
||||
* Improve formatting date and time in history listing
|
||||
* Add haptic and audible feedback for background request errors
|
||||
|
||||
## 1.36.0
|
||||
* Add a setting to automatically return to scanning screen after copying
|
||||
* Add a button to test the background request
|
||||
* Show HTTP response for background requests
|
||||
* Improve SVG export
|
||||
* Automatically continue with an action after granting a permission
|
||||
* Update Chinese translation
|
||||
* Update French translation
|
||||
* Update Indonesian translation
|
||||
* Update Turkish translation
|
||||
* Update Ukrainian translation
|
||||
|
||||
## 1.35.0
|
||||
* Put images with transparent pixels on white/black
|
||||
* Use cropping limiter when scanning from images too
|
||||
* Support setting the error correction level when creating QR Codes
|
||||
* Support setting a custom deviating locale
|
||||
* Use adaptive icons for shortcut icons
|
||||
* Add exporting barcodes as plain text
|
||||
* Add Ukrainian translation
|
||||
* Add Turkish translation
|
||||
* Add Georgian translation
|
||||
* Update Indonesian translation
|
||||
* Update Russian translation
|
||||
* Update Italian translation
|
||||
* Update Simplified Chinese translation
|
||||
|
||||
## 1.34.0
|
||||
* Use Material Design settings with headers
|
||||
* Add a setting to choose the message type when forwarding scanned content
|
||||
|
||||
## 1.33.0
|
||||
* Add a setting to automatically send the scanned content to a custom URL
|
||||
* Add a setting to automatically put contents into clipboard
|
||||
* Add an explicit button to copy WiFi password into clipboard
|
||||
* Update Indonesian translation
|
||||
|
||||
## 1.32.1
|
||||
* Alternatively remove region of interest by dragging handle to a screen corner
|
||||
* Restrict region of interest to screen space
|
||||
|
||||
@@ -23,6 +23,19 @@ test:
|
||||
cat:
|
||||
./gradlew test cAT
|
||||
|
||||
testview:
|
||||
adb shell am start -W -a android.intent.action.VIEW -d 'binaryeye://scan'
|
||||
|
||||
testscan:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'binaryeye://scan/?ret=http%3A%2F%2Fmarkusfisch.de%2F%3Fresult%3D{RESULT}'
|
||||
|
||||
testurl:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'http://markusfisch.de/BinaryEye?ret=http%3A%2F%2Fmarkusfisch.de%2F%3Fresult%3D{RESULT}'
|
||||
|
||||
install:
|
||||
adb $(TARGET) install -r app/build/outputs/apk/debug/app-debug.apk
|
||||
|
||||
|
||||
+47
@@ -4,3 +4,50 @@ Binary Eye does not collect any personal information.
|
||||
|
||||
If you have any questions or suggestions about my Privacy Policy, do not
|
||||
hesitate to contact me.
|
||||
|
||||
## Permissions
|
||||
|
||||
### [ACCESS_FINE_LOCATION](https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION)
|
||||
|
||||
Required to add a WiFi network from a barcode (usually a QR Code).
|
||||
|
||||
Before Android Q, this feature requires using
|
||||
[WifiManager.getConfiguredNetworks][configuredNetworks]
|
||||
which requires `ACCESS_FINE_LOCATION`.
|
||||
|
||||
On Android Q an better, this permission is not requested nor required.
|
||||
|
||||
### [CAMERA](https://developer.android.com/reference/android/Manifest.permission#CAMERA)
|
||||
|
||||
Required to read a barcode from the camera image.
|
||||
|
||||
### [INTERNET](https://developer.android.com/reference/android/Manifest.permission#INTERNET)
|
||||
|
||||
Required to send a scanned code to a custom URL you can specify in settings.
|
||||
|
||||
### [VIBRATE](https://developer.android.com/reference/android/Manifest.permission#VIBRATE)
|
||||
|
||||
Required to vibrate on detection.
|
||||
|
||||
### [WRITE_EXTERNAL_STORAGE](https://developer.android.com/reference/android/Manifest.permission#WRITE_EXTERNAL_STORAGE)
|
||||
|
||||
Required to save generated barcodes as files before Android Q.
|
||||
|
||||
### [CHANGE_WIFI_STATE](https://developer.android.com/reference/android/Manifest.permission#CHANGE_WIFI_STATE)
|
||||
|
||||
Required to add a WiFi network from a barcode (usually a QR Code).
|
||||
|
||||
On Android Q and better, this feature requires using
|
||||
[WifiManager.addNetworkSuggestions][addNetworkSuggestions]
|
||||
which requires `CHANGE_WIFI_STATE`.
|
||||
|
||||
### [ACCESS_WIFI_STATE](https://developer.android.com/reference/android/Manifest.permission#ACCESS_FINE_LOCATION)
|
||||
|
||||
Required to add a WiFi network from a barcode (usually a QR Code).
|
||||
|
||||
Before Android Q, this feature requires using
|
||||
[WifiManager.getConfiguredNetworks][configuredNetworks]
|
||||
which requires `ACCESS_WIFI_STATE`.
|
||||
|
||||
[configuredNetworks]: https://developer.android.com/reference/android/net/wifi/WifiManager#getConfiguredNetworks()
|
||||
[addNetworkSuggestions]: https://developer.android.com/reference/android/net/wifi/WifiManager#addNetworkSuggestions(java.util.List%3Candroid.net.wifi.WifiNetworkSuggestion%3E)
|
||||
|
||||
@@ -12,9 +12,14 @@ library.
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||

|
||||
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/screencap-scanning.png"
|
||||
alt="Screenshot Gallery" width="160"/>
|
||||
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/screencap-scanning-cropped.png"
|
||||
alt="Screenshot Gallery" width="160"/>
|
||||
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/screencap-decoded.png"
|
||||
alt="Screenshot Theme" width="160"/>
|
||||
<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/screencap-compose-barcode.png"
|
||||
alt="Screenshot Editor" width="160"/>
|
||||
|
||||
## Download
|
||||
|
||||
@@ -59,6 +64,54 @@ ZXing can generate the following barcode formats:
|
||||
* [QR CODE][qr_code]
|
||||
* [UPC A][upc_a]
|
||||
|
||||
## Deep Links and Intents
|
||||
|
||||
### Deep Links
|
||||
|
||||
You can invoke Binary Eye with a web URI intent from anything that can
|
||||
open URIs. There are two options:
|
||||
|
||||
1. [binaryeye://scan](binaryeye://scan)
|
||||
2. [http(s)://markusfisch.de/BinaryEye](http://markusfisch.de/BinaryEye)
|
||||
|
||||
If you want to get the scanned contents, you can add a `ret` query
|
||||
argument with a (URL encoded) URI template. For example:
|
||||
|
||||
[http://markusfisch.de/BinaryEye?ret=http%3A%2F%2Fexample.com%2F%3Fresult%3D{RESULT}](http://markusfisch.de/BinaryEye?ret=http%3A%2F%2Fexample.com%2F%3Fresult%3D{RESULT})
|
||||
|
||||
Supported symbols are:
|
||||
|
||||
* `RESULT` - scanned content
|
||||
* `RESULT_BYTES` - raw result as a hex string
|
||||
* `FORMAT` - barcode format
|
||||
* `META` - the meta data, if available
|
||||
|
||||
### SCAN Intent
|
||||
|
||||
You can also use Binary Eye from other apps by using the
|
||||
`com.google.zxing.client.android.SCAN` Intent with `startActivityForResult()`
|
||||
like this:
|
||||
|
||||
startActivityForResult(
|
||||
Intent("com.google.zxing.client.android.SCAN"),
|
||||
SOME_NUMBER
|
||||
)
|
||||
|
||||
And process the result in `onActivityResult()` of your `Activity`:
|
||||
|
||||
override fun onActivityResult(
|
||||
requestCode: Int,
|
||||
resultCode: Int,
|
||||
data: Intent?
|
||||
) {
|
||||
when (requestCode) {
|
||||
SOME_NUMBER -> if (resultCode == RESULT_OK) {
|
||||
val result = data.getStringExtra("SCAN_RESULT")
|
||||
…
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
## RenderScript
|
||||
|
||||
This app uses [RenderScript][rs] to resize and rotate the camera image.
|
||||
@@ -79,29 +132,6 @@ be thrown and the only option is to restart the app, this time with calling
|
||||
Calling `RenderScript.forceCompat()` means the processing is done in
|
||||
software so you probably don't want to enable it by default.
|
||||
|
||||
### macOS Catalina
|
||||
|
||||
At the time of writing, calling `RenderScript.forceCompat()` in a build made
|
||||
on macOS Catalina with build tools 29.0.3 will crash the app. This is a bug
|
||||
in the build tools for Catalina.
|
||||
|
||||
So *do not* build release builts on macOS Catalina with build tools 29.0.3.
|
||||
|
||||
Building on Linux with 29.0.3 works fine.
|
||||
|
||||
### Side by Side NDK
|
||||
|
||||
At the time of writing, it's important to _not_ have the NDK available when
|
||||
compiling the custom rotation kernel. This will produce a broken build for
|
||||
some ARMv7 devices running Android 6 (e.g. One Plus X, Yotaphone 2, Moto E)
|
||||
while it works for newer Android versions.
|
||||
|
||||
### App Bundle
|
||||
|
||||
At the time of writing, `./gradlew bundleRelease` will produce a broken
|
||||
App Bundle without the necessary RenderScript libraries. This is another
|
||||
bug in the build tools.
|
||||
|
||||
### 2D barcodes
|
||||
|
||||
If you want to fork this and are only interested in reading 2D barcodes
|
||||
|
||||
+22
-7
@@ -9,13 +9,14 @@ android {
|
||||
minSdkVersion 9
|
||||
targetSdkVersion sdk_version
|
||||
|
||||
versionCode 70
|
||||
versionName '1.32.1'
|
||||
versionCode 88
|
||||
versionName '1.46.1'
|
||||
|
||||
// it's recommended to set this value to the lowest API level
|
||||
// able to provide all the functionality
|
||||
// It's recommended to set this value to the lowest API level
|
||||
// able to provide all the functionality.
|
||||
renderscriptTargetApi 24
|
||||
renderscriptSupportModeEnabled true
|
||||
renderscriptSupportModeBlasEnabled true
|
||||
|
||||
testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
|
||||
}
|
||||
@@ -49,10 +50,22 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
bundle {
|
||||
language {
|
||||
// To make the app bundle contain all language resources
|
||||
// so the in-app language setting works. Another solution
|
||||
// would be to use the PlayCore API to download language
|
||||
// resources on demand, but it makes much more sense to
|
||||
// simply include the ~60 kb than adding fragile code and
|
||||
// dependencies.
|
||||
enableSplit = false
|
||||
}
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
// because at the time of writing, even the latest version
|
||||
// Because at the time of writing, even the latest version
|
||||
// of RenderScript is raising this error no matter if
|
||||
// renderscriptTargetApi matches targetSdkVersion
|
||||
// renderscriptTargetApi matches targetSdkVersion.
|
||||
disable 'GradleCompatible'
|
||||
}
|
||||
}
|
||||
@@ -70,9 +83,11 @@ dependencies {
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"
|
||||
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"
|
||||
// Do NOT upgrade ZXing because newer versions won't work on API < 24
|
||||
// https://github.com/zxing/zxing/issues/1170
|
||||
implementation 'com.google.zxing:core:3.3.3'
|
||||
implementation 'com.github.markusfisch:CameraView:1.9.1'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.2.0'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.3.0'
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import android.support.test.InstrumentationRegistry
|
||||
import android.support.test.runner.AndroidJUnit4
|
||||
import android.support.v8.renderscript.RenderScript
|
||||
import de.markusfisch.android.binaryeye.rs.Preprocessor
|
||||
import de.markusfisch.android.binaryeye.zxing.Zxing
|
||||
import org.junit.Assert.fail;
|
||||
@@ -35,8 +36,11 @@ class PreprocessorTest {
|
||||
val frameWidth = bitmap.width
|
||||
val frameHeight = bitmap.height
|
||||
val frameOrientation = m.group(1) ?: return
|
||||
val preprocessor = Preprocessor(
|
||||
val rs = RenderScript.create(
|
||||
InstrumentationRegistry.getTargetContext(),
|
||||
)
|
||||
val preprocessor = Preprocessor(
|
||||
rs,
|
||||
frameWidth,
|
||||
frameHeight,
|
||||
null
|
||||
@@ -55,6 +59,7 @@ class PreprocessorTest {
|
||||
}
|
||||
val result = zxing.decode(frameData, outWidth, outHeight)
|
||||
preprocessor.destroy()
|
||||
rs.destroy()
|
||||
|
||||
checkNotNull(result) { "no barcode found in $sample" }
|
||||
}
|
||||
|
||||
@@ -5,17 +5,33 @@
|
||||
<supports-screens
|
||||
android:largeScreens="true"
|
||||
android:xlargeScreens="true"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
|
||||
android:maxSdkVersion="28"/>
|
||||
<uses-permission android:name="android.permission.CAMERA"/>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
android:maxSdkVersion="28"/>
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"
|
||||
android:maxSdkVersion="28"/>
|
||||
<uses-feature android:name="android.hardware.camera"/>
|
||||
<uses-feature android:name="android.hardware.camera.autofocus"/>
|
||||
<uses-sdk tools:overrideLibrary="android.support.v14.preference"/>
|
||||
<queries>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<data android:scheme="https"/>
|
||||
</intent>
|
||||
<intent>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<data android:scheme="http"/>
|
||||
</intent>
|
||||
</queries>
|
||||
<application
|
||||
tools:ignore="UnusedAttribute"
|
||||
android:name=".app.BinaryEyeApp"
|
||||
android:usesCleartextTraffic="true"
|
||||
android:allowBackup="true"
|
||||
android:fullBackupContent="@xml/backup_rules"
|
||||
android:supportsRtl="true"
|
||||
@@ -51,10 +67,16 @@
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
<data
|
||||
android:host="www.markusfisch.de"
|
||||
android:pathPrefix="/BinaryEye"
|
||||
android:scheme="http"/>
|
||||
<data android:scheme="http"
|
||||
android:host="markusfisch.de"
|
||||
android:pathPrefix="/BinaryEye"/>
|
||||
<data android:scheme="https" />
|
||||
</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:scheme="binaryeye" android:host="scan"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
@@ -76,6 +98,15 @@
|
||||
android:name=".activity.MainActivity"
|
||||
android:label="@string/app_name"
|
||||
android:exported="true"/>
|
||||
<service
|
||||
android:name=".service.ScanTileService"
|
||||
android:icon="@drawable/ic_action_scan"
|
||||
android:label="@string/scan_code"
|
||||
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
|
||||
<intent-filter>
|
||||
<action android:name="android.service.quicksettings.action.QS_TILE"/>
|
||||
</intent-filter>
|
||||
</service>
|
||||
<provider
|
||||
android:name="android.support.v4.content.FileProvider"
|
||||
android:authorities="${applicationId}.provider"
|
||||
|
||||
@@ -2,8 +2,8 @@ package de.markusfisch.android.binaryeye.actions
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import de.markusfisch.android.binaryeye.app.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.app.parseAndNormalizeUri
|
||||
import de.markusfisch.android.binaryeye.content.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
interface IAction {
|
||||
@@ -21,7 +21,7 @@ abstract class IntentAction : IAction {
|
||||
val intent = createIntent(context, data) ?: return context.toast(
|
||||
errorMsg
|
||||
)
|
||||
execShareIntent(context, intent)
|
||||
context.execShareIntent(intent)
|
||||
}
|
||||
|
||||
abstract suspend fun createIntent(context: Context, data: ByteArray): Intent?
|
||||
@@ -43,6 +43,6 @@ abstract class SchemeAction : IAction {
|
||||
|
||||
final override suspend fun execute(context: Context, data: ByteArray) {
|
||||
val uri = parseAndNormalizeUri(String(data))
|
||||
execShareIntent(context, Intent(intentAction, uri))
|
||||
context.execShareIntent(Intent(intentAction, uri))
|
||||
}
|
||||
}
|
||||
|
||||
+22
-15
@@ -5,10 +5,9 @@ import android.content.Intent
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.IAction
|
||||
import de.markusfisch.android.binaryeye.app.alertDialog
|
||||
import de.markusfisch.android.binaryeye.app.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.app.parseAndNormalizeUri
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.binaryeye.content.startIntent
|
||||
import java.net.URLEncoder
|
||||
|
||||
object OpenOrSearchAction : IAction {
|
||||
@@ -18,28 +17,36 @@ object OpenOrSearchAction : IAction {
|
||||
override fun canExecuteOn(data: ByteArray): Boolean = false
|
||||
|
||||
override suspend fun execute(context: Context, data: ByteArray) {
|
||||
val intent = openUri(context, String(data)) ?: return
|
||||
execShareIntent(context, intent)
|
||||
view(context, String(data), true)
|
||||
}
|
||||
|
||||
private suspend fun openUri(context: Context, data: String, search: Boolean = true): Intent? {
|
||||
val uri = parseAndNormalizeUri(data)
|
||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
||||
when {
|
||||
intent.resolveActivity(context.packageManager) != null -> return intent
|
||||
search -> return getSearchIntent(context, data)
|
||||
else -> context.toast(R.string.cannot_resolve_action)
|
||||
private suspend fun view(context: Context, s: String, search: Boolean) {
|
||||
val intent = Intent(Intent.ACTION_VIEW, parseAndNormalizeUri(s))
|
||||
if (!context.startIntent(intent) && search) {
|
||||
openSearch(context, s)
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
private suspend fun getSearchIntent(context: Context, query: String): Intent? {
|
||||
private suspend fun openSearch(context: Context, query: String) {
|
||||
val defaultSearchUrl = prefs.defaultSearchUrl
|
||||
if (defaultSearchUrl.isNotEmpty()) {
|
||||
view(
|
||||
context,
|
||||
defaultSearchUrl + URLEncoder.encode(query, "utf-8"),
|
||||
false
|
||||
)
|
||||
return
|
||||
}
|
||||
val names = context.resources.getStringArray(
|
||||
R.array.search_engines_names
|
||||
).toMutableList()
|
||||
val urls = context.resources.getStringArray(
|
||||
R.array.search_engines_values
|
||||
).toMutableList()
|
||||
// Remove the "Always ask" entry. The arrays search_engines_*
|
||||
// are used in the preferences too.
|
||||
names.removeFirst()
|
||||
urls.removeFirst()
|
||||
if (prefs.openWithUrl.isNotEmpty()) {
|
||||
names.add(prefs.openWithUrl)
|
||||
urls.add(prefs.openWithUrl)
|
||||
@@ -49,7 +56,7 @@ object OpenOrSearchAction : IAction {
|
||||
setItems(names.toTypedArray()) { _, which ->
|
||||
resume(urls[which] + URLEncoder.encode(query, "utf-8"))
|
||||
}
|
||||
} ?: return null
|
||||
return openUri(context, queryUri, false)
|
||||
} ?: return
|
||||
view(context, queryUri, false)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ object VTypeParser {
|
||||
|
||||
fun parseVType(data: String): String? = vTypeRegex.matchEntire(
|
||||
data
|
||||
)?.groupValues?.get(1)?.toUpperCase(Locale.US)
|
||||
)?.groupValues?.get(1)?.uppercase(Locale.US)
|
||||
|
||||
fun parseMap(
|
||||
data: String
|
||||
@@ -26,7 +26,7 @@ object VTypeParser {
|
||||
it.groupValues[2]
|
||||
)
|
||||
}
|
||||
}.groupBy({ it.first.toUpperCase(Locale.US) }) { it.second }
|
||||
}.groupBy({ it.first.uppercase(Locale.US) }) { it.second }
|
||||
}
|
||||
|
||||
data class VTypeProperty(
|
||||
|
||||
+14
-5
@@ -20,10 +20,19 @@ object VCardAction : IntentAction() {
|
||||
get() = R.string.vcard_failed
|
||||
|
||||
override fun canExecuteOn(data: ByteArray): Boolean {
|
||||
return VTypeParser.parseVType(String(data)) == "VCARD"
|
||||
var stringData = String(data)
|
||||
// Quick & dirty MECARD support: simply make it a VCARD.
|
||||
if (stringData.startsWith("MECARD:")) {
|
||||
stringData = stringData
|
||||
.trim()
|
||||
.replace("MECARD:", "BEGIN:VCARD\n")
|
||||
.replace(";;", "\nEND:VCARD\n")
|
||||
.replace(";", "\n")
|
||||
}
|
||||
return VTypeParser.parseVType(stringData) == "VCARD"
|
||||
}
|
||||
|
||||
override suspend fun createIntent(context: Context, data: ByteArray): Intent? {
|
||||
override suspend fun createIntent(context: Context, data: ByteArray): Intent {
|
||||
val info = VTypeParser.parseMap(String(data))
|
||||
|
||||
return Intent(Intent.ACTION_INSERT_OR_EDIT).apply {
|
||||
@@ -50,7 +59,7 @@ object VCardAction : IntentAction() {
|
||||
}
|
||||
putExtra(
|
||||
extraPhone,
|
||||
phoneProperty.value.toLowerCase(Locale.US).removePrefix("tel:")
|
||||
phoneProperty.value.lowercase(Locale.US).removePrefix("tel:")
|
||||
)
|
||||
}
|
||||
info["EMAIL"]?.forEachIndexed { index, mailProperty ->
|
||||
@@ -142,7 +151,7 @@ object VCardAction : IntentAction() {
|
||||
} ?: this
|
||||
|
||||
private val String.mailType: Int?
|
||||
get() = when (this.toUpperCase(Locale.US)) {
|
||||
get() = when (this.uppercase(Locale.US)) {
|
||||
"HOME" -> ContactsContract.CommonDataKinds.Email.TYPE_HOME
|
||||
"WORK" -> ContactsContract.CommonDataKinds.Email.TYPE_WORK
|
||||
"OTHER" -> ContactsContract.CommonDataKinds.Email.TYPE_OTHER
|
||||
@@ -151,7 +160,7 @@ object VCardAction : IntentAction() {
|
||||
}
|
||||
|
||||
private val String.phoneType: Int?
|
||||
get() = when (this.toUpperCase(Locale.US)) {
|
||||
get() = when (this.uppercase(Locale.US)) {
|
||||
"HOME" -> ContactsContract.CommonDataKinds.Phone.TYPE_HOME
|
||||
"MOBILE", "CELL" -> ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
|
||||
"WORK" -> ContactsContract.CommonDataKinds.Phone.TYPE_WORK
|
||||
|
||||
+2
-1
@@ -56,7 +56,8 @@ object VEventAction : IntentAction() {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SimpleDateFormat") // we definitely don't wan't the local format
|
||||
// We definitely don't wan't the local format.
|
||||
@SuppressLint("SimpleDateFormat")
|
||||
private val dateFormats = listOf(
|
||||
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"),
|
||||
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"),
|
||||
|
||||
+57
-54
@@ -10,6 +10,12 @@ import android.support.annotation.RequiresApi
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import java.util.*
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
fun removeNetworkSuggestions(context: Context): Int =
|
||||
(context.applicationContext.getSystemService(
|
||||
Context.WIFI_SERVICE
|
||||
) as WifiManager).removeNetworkSuggestions(listOf())
|
||||
|
||||
/**
|
||||
* Normal:
|
||||
* WIFI:S:[network SSID];T:<WPA|WEP|nopass|>;P:[network password];H:<true|false|>;;
|
||||
@@ -45,7 +51,7 @@ object WifiConnector {
|
||||
invoke(parsedData.password)
|
||||
}
|
||||
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||
// WifiConfiguration is deprecated in Android Q
|
||||
// WifiConfiguration is deprecated in Android Q.
|
||||
@Suppress("DEPRECATION")
|
||||
WifiConfiguration().apply(parsedData)
|
||||
} else {
|
||||
@@ -58,7 +64,7 @@ object WifiConnector {
|
||||
Context.WIFI_SERVICE
|
||||
) as WifiManager
|
||||
return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||
// WifiConfiguration is deprecated in Android Q
|
||||
// WifiConfiguration is deprecated in Android Q.
|
||||
@Suppress("DEPRECATION")
|
||||
val wifiConfig = config as WifiConfiguration
|
||||
if (wifiManager.enableWifi() &&
|
||||
@@ -72,7 +78,7 @@ object WifiConnector {
|
||||
} else {
|
||||
val suggestion = (config as WifiNetworkSuggestion.Builder).build()
|
||||
val suggestions = listOf(suggestion)
|
||||
// remove previous conflicting network suggestion
|
||||
// Remove previous conflicting network suggestion.
|
||||
wifiManager.removeNetworkSuggestions(suggestions)
|
||||
val result = wifiManager.addNetworkSuggestions(suggestions)
|
||||
if (result == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
|
||||
@@ -84,17 +90,17 @@ object WifiConnector {
|
||||
}
|
||||
|
||||
internal fun parseMap(string: String): Map<String, String>? {
|
||||
// normally those codes should have the last semicolon, but many
|
||||
// generators don't add it
|
||||
// Normally those codes should have the last semicolon, but many
|
||||
// generators don't add it.
|
||||
val wifiRegex = """^WIFI:((?:.+?:(?:[^\\;]|\\.)*;)+);?$""".toRegex()
|
||||
// should be: ^(.+):((?:[^\\;,":]|\\.)*);$ but allows unescaped , "
|
||||
// and : because many QR Code creators don't escape properly
|
||||
// Should be: ^(.+):((?:[^\\;,":]|\\.)*);$ but allows unescaped , "
|
||||
// and : because many QR Code creators don't escape properly.
|
||||
val pairRegex = """(.+?):((?:[^\\;]|\\.)*);""".toRegex()
|
||||
return wifiRegex.matchEntire(
|
||||
string
|
||||
)?.groupValues?.get(1)?.let { pairs ->
|
||||
pairRegex.findAll(pairs).map { pair ->
|
||||
pair.groupValues[1].toUpperCase(Locale.US) to pair.groupValues[2]
|
||||
pair.groupValues[1].uppercase(Locale.US) to pair.groupValues[2]
|
||||
}.toMap()
|
||||
}
|
||||
}
|
||||
@@ -102,7 +108,7 @@ object WifiConnector {
|
||||
internal class SimpleDataAccessor private constructor(
|
||||
private val inputMap: Map<String, String>
|
||||
) {
|
||||
// this should be private but because of testing it isn't possible
|
||||
// This should be private but because of testing it isn't possible.
|
||||
internal val ssid: String
|
||||
get() = inputMap.getValue("S").unescape
|
||||
internal val securityType: String
|
||||
@@ -112,7 +118,7 @@ object WifiConnector {
|
||||
internal val hidden: Boolean
|
||||
get() = inputMap["H"]?.unescape == "true"
|
||||
internal val anonymousIdentity: String
|
||||
get() = inputMap["AI"]?.unescape ?: ""
|
||||
get() = inputMap["AI"]?.unescape ?: inputMap["A"]?.unescape ?: ""
|
||||
internal val identity: String
|
||||
get() = inputMap["I"]?.unescape ?: ""
|
||||
internal val eapMethod: Int?
|
||||
@@ -164,7 +170,7 @@ object WifiConnector {
|
||||
): WifiNetworkSuggestion.Builder? {
|
||||
fun WifiNetworkSuggestion.Builder.applyCommon(
|
||||
data: SimpleDataAccessor
|
||||
): WifiNetworkSuggestion.Builder? {
|
||||
): WifiNetworkSuggestion.Builder {
|
||||
setSsid(data.ssid)
|
||||
return this
|
||||
}
|
||||
@@ -172,47 +178,44 @@ object WifiConnector {
|
||||
fun WifiNetworkSuggestion.Builder.applySecurity(
|
||||
data: SimpleDataAccessor
|
||||
): WifiNetworkSuggestion.Builder? {
|
||||
when (data.securityType) {
|
||||
"WPA", "WPA2" -> {
|
||||
data.password?.let {
|
||||
setWpa2Passphrase(it)
|
||||
try {
|
||||
when (data.securityType) {
|
||||
"WPA", "WPA2" -> {
|
||||
data.password?.let { setWpa2Passphrase(it) }
|
||||
}
|
||||
"WPA2-EAP" -> {
|
||||
setWpa2EnterpriseConfig(WifiEnterpriseConfig().apply {
|
||||
identity = data.identity
|
||||
anonymousIdentity = data.anonymousIdentity
|
||||
password = data.password
|
||||
data.eapMethod?.let { eapMethod = it }
|
||||
data.phase2Method?.let { phase2Method = it }
|
||||
})
|
||||
}
|
||||
"WPA3" -> {
|
||||
data.password?.let { setWpa3Passphrase(it) }
|
||||
}
|
||||
"WPA3-EAP" -> {
|
||||
setWpa3EnterpriseConfig(WifiEnterpriseConfig().apply {
|
||||
identity = data.identity
|
||||
anonymousIdentity = data.anonymousIdentity
|
||||
password = data.password
|
||||
data.eapMethod?.let { eapMethod = it }
|
||||
data.phase2Method?.let { phase2Method = it }
|
||||
})
|
||||
}
|
||||
}
|
||||
"WPA2-EAP" -> {
|
||||
data.password?.let {
|
||||
setWpa2Passphrase(it)
|
||||
}
|
||||
setWpa2EnterpriseConfig(WifiEnterpriseConfig().apply {
|
||||
identity = data.identity
|
||||
anonymousIdentity = data.anonymousIdentity
|
||||
password = data.password
|
||||
data.eapMethod?.let { eapMethod = it }
|
||||
data.phase2Method?.let { phase2Method = it }
|
||||
})
|
||||
}
|
||||
"WPA3" -> {
|
||||
data.password?.let {
|
||||
setWpa3Passphrase(it)
|
||||
}
|
||||
}
|
||||
"WPA3-EAP" -> {
|
||||
data.password?.let { setWpa3Passphrase(it) }
|
||||
setWpa3EnterpriseConfig(WifiEnterpriseConfig().apply {
|
||||
identity = data.identity
|
||||
anonymousIdentity = data.anonymousIdentity
|
||||
password = data.password
|
||||
data.eapMethod?.let { eapMethod = it }
|
||||
data.phase2Method?.let { phase2Method = it }
|
||||
})
|
||||
}
|
||||
} catch (e: IllegalArgumentException) {
|
||||
// Don't accept passphrases that aren't ASCII encodeable.
|
||||
return null
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
return this.applyCommon(data)?.applySecurity(data)
|
||||
return this.applyCommon(data).applySecurity(data)
|
||||
}
|
||||
|
||||
// WifiConfiguration is deprecated in Android Q
|
||||
// WifiConfiguration is deprecated in Android Q.
|
||||
@Suppress("DEPRECATION")
|
||||
private fun WifiConfiguration.apply(
|
||||
data: SimpleDataAccessor
|
||||
@@ -222,7 +225,7 @@ object WifiConnector {
|
||||
|
||||
fun WifiConfiguration.applyCommon(
|
||||
data: SimpleDataAccessor
|
||||
): WifiConfiguration? {
|
||||
): WifiConfiguration {
|
||||
allowedAuthAlgorithms.clear()
|
||||
allowedGroupCiphers.clear()
|
||||
allowedKeyManagement.clear()
|
||||
@@ -274,7 +277,7 @@ object WifiConnector {
|
||||
allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN)
|
||||
allowedProtocols.set(WifiConfiguration.Protocol.RSN) // WPA2
|
||||
allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP)
|
||||
@Suppress("DEPRECATION") // TKIP is insecure and has bad performance
|
||||
@Suppress("DEPRECATION") // TKIP is insecure and has bad performance.
|
||||
allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP)
|
||||
allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP)
|
||||
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP)
|
||||
@@ -292,7 +295,7 @@ object WifiConnector {
|
||||
return this
|
||||
}
|
||||
|
||||
return this.applyCommon(data)?.applySecurity(data)
|
||||
return this.applyCommon(data).applySecurity(data)
|
||||
}
|
||||
|
||||
private inline fun <T> requireSdk(version: Int, block: () -> T): T? {
|
||||
@@ -300,8 +303,8 @@ object WifiConnector {
|
||||
}
|
||||
}
|
||||
|
||||
// keep possibility of wrongly unescaped \ by explicitly searching
|
||||
// for special chars
|
||||
// Keep possibility of wrongly unescaped \ by explicitly searching
|
||||
// for special chars.
|
||||
private val escapedRegex = """\\([\\;,":])""".toRegex()
|
||||
private val String.unescape: String
|
||||
get() = this.replace(escapedRegex) { escaped ->
|
||||
@@ -327,12 +330,12 @@ private fun String.isHex() = length == 64 && matches(hexRegex)
|
||||
|
||||
private fun WifiManager.enableWifi(): Boolean {
|
||||
// setWifiEnabled() will always return false for Android Q
|
||||
// because Q doesn't allow apps to enable/disable Wi-Fi anymore
|
||||
// because Q doesn't allow apps to enable/disable Wi-Fi anymore.
|
||||
@Suppress("DEPRECATION")
|
||||
return isWifiEnabled || setWifiEnabled(true)
|
||||
}
|
||||
|
||||
// WifiConfiguration is deprecated in Android Q
|
||||
// WifiConfiguration is deprecated in Android Q.
|
||||
@Suppress("DEPRECATION")
|
||||
private fun WifiManager.removeOldNetwork(
|
||||
wifiConfig: WifiConfiguration
|
||||
@@ -345,13 +348,13 @@ private fun WifiManager.removeOldNetwork(
|
||||
removeNetwork(it)
|
||||
}
|
||||
} catch (e: SecurityException) {
|
||||
// the user didn't allow ACCESS_FINE_LOCATION which is
|
||||
// required to access configuredNetworks and that's fine
|
||||
// The user didn't allow ACCESS_FINE_LOCATION which is
|
||||
// required to access configuredNetworks and that's fine.
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// WifiConfiguration is deprecated in Android Q
|
||||
// WifiConfiguration is deprecated in Android Q.
|
||||
@Suppress("DEPRECATION")
|
||||
private fun WifiManager.enableNewNetwork(
|
||||
wifiConfig: WifiConfiguration
|
||||
|
||||
@@ -4,9 +4,12 @@ import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Matrix
|
||||
import android.graphics.Rect
|
||||
import android.graphics.RectF
|
||||
import android.hardware.Camera
|
||||
import android.media.AudioManager
|
||||
import android.media.ToneGenerator
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Vibrator
|
||||
@@ -14,6 +17,7 @@ import android.support.design.widget.FloatingActionButton
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.Toolbar
|
||||
import android.support.v8.renderscript.RSRuntimeException
|
||||
import android.support.v8.renderscript.RenderScript
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.MotionEvent
|
||||
@@ -21,34 +25,43 @@ import android.view.View
|
||||
import android.widget.SeekBar
|
||||
import com.google.zxing.Result
|
||||
import com.google.zxing.ResultMetadataType
|
||||
import com.google.zxing.ResultPointCallback
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.*
|
||||
import de.markusfisch.android.binaryeye.content.copyToClipboard
|
||||
import de.markusfisch.android.binaryeye.content.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.graphics.Mapping
|
||||
import de.markusfisch.android.binaryeye.graphics.frameToView
|
||||
import de.markusfisch.android.binaryeye.graphics.isPortrait
|
||||
import de.markusfisch.android.binaryeye.graphics.getFrameToViewMatrix
|
||||
import de.markusfisch.android.binaryeye.graphics.map
|
||||
import de.markusfisch.android.binaryeye.net.sendAsync
|
||||
import de.markusfisch.android.binaryeye.os.error
|
||||
import de.markusfisch.android.binaryeye.os.vibrate
|
||||
import de.markusfisch.android.binaryeye.rs.Preprocessor
|
||||
import de.markusfisch.android.binaryeye.view.initSystemBars
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.widget.DetectorView
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.binaryeye.zxing.Zxing
|
||||
import de.markusfisch.android.cameraview.widget.CameraView
|
||||
import java.net.URLEncoder
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class CameraActivity : AppCompatActivity() {
|
||||
private val zxing = Zxing(ResultPointCallback { point ->
|
||||
point?.let {
|
||||
getMapping()?.map(it)?.let {
|
||||
detectorView.post {
|
||||
detectorView.mark(listOf(it))
|
||||
}
|
||||
}
|
||||
private val zxing = Zxing { point ->
|
||||
point ?: return@Zxing
|
||||
val matrix = getMappingMatrix() ?: return@Zxing
|
||||
detectorView.post {
|
||||
detectorView.update(
|
||||
matrix.map(
|
||||
arrayOf(point),
|
||||
detectorView.coordinates
|
||||
)
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private lateinit var rs: RenderScript
|
||||
private lateinit var vibrator: Vibrator
|
||||
private lateinit var cameraView: CameraView
|
||||
private lateinit var detectorView: DetectorView
|
||||
@@ -56,16 +69,17 @@ class CameraActivity : AppCompatActivity() {
|
||||
private lateinit var flashFab: FloatingActionButton
|
||||
|
||||
private var preprocessor: Preprocessor? = null
|
||||
private var nativeMapping: Mapping? = null
|
||||
private var rotatedMapping: Mapping? = null
|
||||
private var nativeMappingMatrix: Matrix? = null
|
||||
private var rotatedMappingMatrix: Matrix? = null
|
||||
private var recreatePreprocessor = false
|
||||
private var rotate = false
|
||||
private var invert = false
|
||||
private var flash = false
|
||||
private var decoding = true
|
||||
private var returnResult = false
|
||||
private var returnUrlTemplate: String? = null
|
||||
private var frontFacing = false
|
||||
private var bulkMode = false
|
||||
private var bulkMode = prefs.bulkMode
|
||||
private var ignoreNext: String? = null
|
||||
private var fallbackBuffer: IntArray? = null
|
||||
|
||||
@@ -101,10 +115,20 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun attachBaseContext(base: Context?) {
|
||||
base?.applyLocale(prefs.customLocale)
|
||||
super.attachBaseContext(base)
|
||||
}
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setContentView(R.layout.activity_camera)
|
||||
|
||||
// Necessary to get the right translation after setting a
|
||||
// custom locale.
|
||||
setTitle(R.string.scan_code)
|
||||
|
||||
rs = RenderScript.create(this)
|
||||
vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
||||
|
||||
initSystemBars(this)
|
||||
@@ -131,19 +155,39 @@ class CameraActivity : AppCompatActivity() {
|
||||
resetPreProcessor()
|
||||
fallbackBuffer = null
|
||||
saveZoom()
|
||||
saveCropHandlePos()
|
||||
detectorView.saveCropHandlePos()
|
||||
rs.destroy()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
System.gc()
|
||||
zxing.updateHints(prefs.tryHarder)
|
||||
returnResult = "com.google.zxing.client.android.SCAN" == intent.action
|
||||
zxing.updateHints(
|
||||
prefs.tryHarder,
|
||||
prefs.barcodeFormats
|
||||
)
|
||||
if (prefs.bulkMode && bulkMode != prefs.bulkMode) {
|
||||
bulkMode = prefs.bulkMode
|
||||
invalidateOptionsMenu()
|
||||
ignoreNext = null
|
||||
}
|
||||
setReturnTarget(intent)
|
||||
if (hasCameraPermission(this)) {
|
||||
openCamera()
|
||||
}
|
||||
}
|
||||
|
||||
private fun setReturnTarget(intent: Intent?) {
|
||||
when {
|
||||
intent?.action == "com.google.zxing.client.android.SCAN" -> {
|
||||
returnResult = true
|
||||
}
|
||||
isReturnUrl(intent) -> intent?.data?.let {
|
||||
returnUrlTemplate = it.getQueryParameter("ret")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun resetPreProcessor() {
|
||||
preprocessor?.destroy()
|
||||
preprocessor = null
|
||||
@@ -169,7 +213,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
private fun closeCamera() {
|
||||
cameraView.close()
|
||||
// closing the camera will also shut off the flash
|
||||
// Closing the camera will also shut off the flash.
|
||||
flash = false
|
||||
}
|
||||
|
||||
@@ -190,8 +234,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
|
||||
// always give crop handle precedence over other controls
|
||||
// because it can easily overlap and would then be inaccessible
|
||||
// Always give crop handle precedence over other controls
|
||||
// because it can easily overlap and would then be inaccessible.
|
||||
if (detectorView.onTouchEvent(ev)) {
|
||||
return true
|
||||
}
|
||||
@@ -233,6 +277,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
R.id.bulk_mode -> {
|
||||
bulkMode = bulkMode xor true
|
||||
item.isChecked = bulkMode
|
||||
ignoreNext = null
|
||||
true
|
||||
}
|
||||
R.id.preferences -> {
|
||||
@@ -262,11 +307,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
Intent.ACTION_VIEW,
|
||||
Uri.parse(getString(R.string.project_url))
|
||||
)
|
||||
if (intent.resolveActivity(packageManager) != null) {
|
||||
startActivity(intent)
|
||||
} else {
|
||||
toast(R.string.project_url)
|
||||
}
|
||||
execShareIntent(intent)
|
||||
}
|
||||
|
||||
private fun handleSendText(intent: Intent) {
|
||||
@@ -308,8 +349,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
MotionEvent.ACTION_UP -> {
|
||||
// stop calling focusTo() as soon as it returns false
|
||||
// to avoid throwing and catching future exceptions
|
||||
// Stop calling focusTo() as soon as it returns false
|
||||
// to avoid throwing and catching future exceptions.
|
||||
if (focus) {
|
||||
focus = cameraView.focusTo(v, event.x, event.y)
|
||||
if (focus) {
|
||||
@@ -357,9 +398,9 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
override fun onCameraReady(camera: Camera) {
|
||||
// reset preprocessor to make sure it always fits the current
|
||||
// frame orientation; important for landscape to landscape
|
||||
// orientation changes
|
||||
// Reset preprocessor to make sure it always fits the current
|
||||
// frame orientation. Important for landscape to landscape
|
||||
// orientation changes.
|
||||
resetPreProcessor()
|
||||
val frameWidth = cameraView.frameWidth
|
||||
val frameHeight = cameraView.frameHeight
|
||||
@@ -419,7 +460,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
params.zoom = zoom
|
||||
camera.parameters = params
|
||||
} catch (e: RuntimeException) {
|
||||
// ignore; there's nothing we can do
|
||||
// Ignore. There's nothing we can do.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -448,22 +489,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
recreatePreprocessor = true
|
||||
}
|
||||
detectorView.setPaddingFromWindowInsets()
|
||||
restoreCropHandlePos()
|
||||
}
|
||||
|
||||
private fun saveCropHandlePos() {
|
||||
val pos = detectorView.getCropHandlePos()
|
||||
prefs.cropHandleX = pos.x
|
||||
prefs.cropHandleY = pos.y
|
||||
prefs.cropHandleOrientation = detectorView.currentOrientation
|
||||
}
|
||||
|
||||
private fun restoreCropHandlePos() {
|
||||
detectorView.setCropHandlePos(
|
||||
prefs.cropHandleX,
|
||||
prefs.cropHandleY,
|
||||
prefs.cropHandleOrientation
|
||||
)
|
||||
detectorView.restoreCropHandlePos()
|
||||
}
|
||||
|
||||
private fun updateFlashFab(unavailable: Boolean) {
|
||||
@@ -490,7 +516,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
camera.parameters = parameters
|
||||
flash = flash xor true
|
||||
} catch (e: RuntimeException) {
|
||||
// ignore; there's nothing we can do
|
||||
// Ignore. There's nothing we can do.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -534,9 +560,9 @@ class CameraActivity : AppCompatActivity() {
|
||||
zxing.decode(frameData, w, h, invert)
|
||||
} catch (e: RSRuntimeException) {
|
||||
prefs.forceCompat = prefs.forceCompat xor true
|
||||
// now the only option is to restart the app because
|
||||
// Now the only option is to restart the app because
|
||||
// RenderScript.forceCompat() needs to be called before
|
||||
// RenderScript is initialized
|
||||
// RenderScript is initialized.
|
||||
restartApp(this)
|
||||
null
|
||||
}
|
||||
@@ -553,7 +579,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
frameOrientation
|
||||
)
|
||||
val pp = Preprocessor(
|
||||
this,
|
||||
rs,
|
||||
frameWidth,
|
||||
frameHeight,
|
||||
frameRoi
|
||||
@@ -563,13 +589,13 @@ class CameraActivity : AppCompatActivity() {
|
||||
} else {
|
||||
cameraView.previewRect
|
||||
}
|
||||
nativeMapping = frameToView(
|
||||
nativeMappingMatrix = getFrameToViewMatrix(
|
||||
pp.outWidth,
|
||||
pp.outHeight,
|
||||
frameOrientation,
|
||||
viewRect
|
||||
)
|
||||
rotatedMapping = frameToView(
|
||||
rotatedMappingMatrix = getFrameToViewMatrix(
|
||||
pp.outHeight,
|
||||
pp.outWidth,
|
||||
(frameOrientation - 90 + 360) % 360,
|
||||
@@ -590,12 +616,12 @@ class CameraActivity : AppCompatActivity() {
|
||||
) {
|
||||
null
|
||||
} else {
|
||||
// map ROI in detectorView to cameraView
|
||||
// Map ROI in detectorView to cameraView.
|
||||
val previewRect = cameraView.previewRect
|
||||
// previewRect may be larger than the screen (and thus as the
|
||||
// detectorView) in which case its left and/or top coordinate
|
||||
// will be negative which must then be clamped to the
|
||||
// screen/DetectorView
|
||||
// screen/DetectorView.
|
||||
val previewLeft = max(0, previewRect.left)
|
||||
val previewTop = max(0, previewRect.top)
|
||||
val previewRoi = Rect(
|
||||
@@ -612,52 +638,87 @@ class CameraActivity : AppCompatActivity() {
|
||||
previewRoi.right.toFloat() / previewRectWidth,
|
||||
previewRoi.bottom.toFloat() / previewRectHeight
|
||||
)
|
||||
// since the ROI is always centered and symmetric, we don't
|
||||
// need to distinguish between 0 and 180 or 90 and 270 degree
|
||||
if (isPortrait(frameOrientation)) {
|
||||
Rect(
|
||||
(normalizedRoi.top * frameWidth.toFloat()).roundToInt(),
|
||||
(normalizedRoi.left * frameHeight.toFloat()).roundToInt(),
|
||||
(normalizedRoi.bottom * frameWidth.toFloat()).roundToInt(),
|
||||
(normalizedRoi.right * frameHeight.toFloat()).roundToInt()
|
||||
// Since the ROI is always centered and symmetric, we don't
|
||||
// need to distinguish between 0 and 180 or 90 and 270 degree.
|
||||
val errectedRoi = if (isPortrait(frameOrientation)) {
|
||||
RectF(
|
||||
normalizedRoi.top,
|
||||
normalizedRoi.left,
|
||||
normalizedRoi.bottom,
|
||||
normalizedRoi.right
|
||||
)
|
||||
} else {
|
||||
Rect(
|
||||
(normalizedRoi.left * frameWidth.toFloat()).roundToInt(),
|
||||
(normalizedRoi.top * frameHeight.toFloat()).roundToInt(),
|
||||
(normalizedRoi.right * frameWidth.toFloat()).roundToInt(),
|
||||
(normalizedRoi.bottom * frameHeight.toFloat()).roundToInt()
|
||||
)
|
||||
normalizedRoi
|
||||
}
|
||||
Rect(
|
||||
(errectedRoi.left * frameWidth.toFloat()).roundToInt(),
|
||||
(errectedRoi.top * frameHeight.toFloat()).roundToInt(),
|
||||
(errectedRoi.right * frameWidth.toFloat()).roundToInt(),
|
||||
(errectedRoi.bottom * frameHeight.toFloat()).roundToInt()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun postResult(result: Result) {
|
||||
// get mapping for the current rotate value
|
||||
val mapping = getMapping()
|
||||
// Get matrix for the current rotate value.
|
||||
val matrix = getMappingMatrix()
|
||||
val resultPoints = result.resultPoints
|
||||
if (matrix == null ||
|
||||
resultPoints == null ||
|
||||
resultPoints.isEmpty()
|
||||
) {
|
||||
return
|
||||
}
|
||||
cameraView.post {
|
||||
val rp = result.resultPoints
|
||||
if (mapping != null && rp != null && rp.isNotEmpty()) {
|
||||
detectorView.mark(mapping.map(rp))
|
||||
}
|
||||
vibrator.vibrate()
|
||||
showResult(
|
||||
this@CameraActivity,
|
||||
result,
|
||||
returnResult,
|
||||
bulkMode
|
||||
detectorView.update(
|
||||
matrix.map(
|
||||
resultPoints,
|
||||
detectorView.coordinates
|
||||
)
|
||||
)
|
||||
vibrator.vibrate()
|
||||
val returnUri = returnUrlTemplate?.let {
|
||||
try {
|
||||
completeUrl(it, result)
|
||||
} catch (e: Exception) {
|
||||
e.message?.let { message ->
|
||||
toast(message)
|
||||
}
|
||||
null
|
||||
}
|
||||
}
|
||||
when {
|
||||
returnResult -> {
|
||||
setResult(Activity.RESULT_OK, getReturnIntent(result))
|
||||
finish()
|
||||
}
|
||||
returnUri != null -> execShareIntent(
|
||||
Intent(Intent.ACTION_VIEW, returnUri)
|
||||
)
|
||||
else -> showResult(
|
||||
this@CameraActivity,
|
||||
result,
|
||||
vibrator,
|
||||
bulkMode
|
||||
)
|
||||
}
|
||||
if (bulkMode) {
|
||||
ignoreNext = result.text
|
||||
toast(result.text)
|
||||
if (prefs.showToastInBulkMode) {
|
||||
toast(result.text)
|
||||
}
|
||||
detectorView.postDelayed({
|
||||
decoding = true
|
||||
}, 500)
|
||||
}, prefs.bulkModeDelay.toLong())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getMapping() = if (rotate) rotatedMapping else nativeMapping
|
||||
private fun getMappingMatrix() = if (rotate) {
|
||||
rotatedMappingMatrix
|
||||
} else {
|
||||
nativeMappingMatrix
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val PICK_FILE_RESULT_CODE = 1
|
||||
@@ -671,15 +732,29 @@ class CameraActivity : AppCompatActivity() {
|
||||
fun showResult(
|
||||
activity: Activity,
|
||||
result: Result,
|
||||
isResult: Boolean = false,
|
||||
bulkMode: Boolean = false
|
||||
vibrator: Vibrator,
|
||||
bulkMode: Boolean = false,
|
||||
) {
|
||||
if (isResult) {
|
||||
activity.setResult(Activity.RESULT_OK, getReturnIntent(result))
|
||||
activity.finish()
|
||||
return
|
||||
if (prefs.copyImmediately) {
|
||||
activity.copyToClipboard(result.text)
|
||||
}
|
||||
val scan = Scan(result)
|
||||
if (prefs.sendScanUrl.isNotEmpty()) {
|
||||
scan.sendAsync(
|
||||
prefs.sendScanUrl,
|
||||
prefs.sendScanType
|
||||
) { code, body ->
|
||||
if (code == null || code < 200 || code > 299) {
|
||||
vibrator.error()
|
||||
beepBeepBeep()
|
||||
}
|
||||
if (body != null && body.isNotEmpty()) {
|
||||
activity.toast(body)
|
||||
} else if (code == null || code > 299) {
|
||||
activity.toast(R.string.background_request_failed)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (prefs.useHistory) {
|
||||
scan.id = db.insertScan(scan)
|
||||
}
|
||||
@@ -730,3 +805,44 @@ fun getReturnIntent(result: Result): Intent {
|
||||
}
|
||||
return intent
|
||||
}
|
||||
|
||||
private fun isReturnUrl(intent: Intent?): Boolean {
|
||||
val dataString = intent?.dataString
|
||||
return listOf(
|
||||
"binaryeye://scan",
|
||||
"http://markusfisch.de/BinaryEye",
|
||||
"https://markusfisch.de/BinaryEye"
|
||||
).firstOrNull {
|
||||
val result = dataString?.startsWith(it) == true
|
||||
result
|
||||
} != null
|
||||
}
|
||||
|
||||
private fun completeUrl(urlTemplate: String, result: Result) = Uri.parse(
|
||||
urlTemplate
|
||||
.replace("{RESULT}", URLEncoder.encode(result.text, "UTF-8"))
|
||||
.replace("{RESULT_BYTES}", result.rawBytes?.toHexString() ?: "")
|
||||
.replace(
|
||||
"{FORMAT}", URLEncoder.encode(
|
||||
result.barcodeFormat.toString(), "UTF-8"
|
||||
)
|
||||
)
|
||||
.replace(
|
||||
"{META}", URLEncoder.encode(
|
||||
result.resultMetadata?.toString() ?: "", "UTF-8"
|
||||
)
|
||||
)
|
||||
// And support {CODE} from the old ZXing app, too.
|
||||
.replace("{CODE}", URLEncoder.encode(result.text, "UTF-8"))
|
||||
)
|
||||
|
||||
private fun beepBeepBeep() {
|
||||
ToneGenerator(AudioManager.STREAM_ALARM, 100).startTone(
|
||||
ToneGenerator.TONE_CDMA_CONFIRM,
|
||||
1000
|
||||
)
|
||||
}
|
||||
|
||||
private fun isPortrait(
|
||||
orientation: Int
|
||||
) = orientation == 90 || orientation == 270
|
||||
|
||||
@@ -2,23 +2,39 @@ package de.markusfisch.android.binaryeye.activity
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
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.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.app.initSystemBars
|
||||
import de.markusfisch.android.binaryeye.app.setFragment
|
||||
import de.markusfisch.android.binaryeye.app.*
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.fragment.DecodeFragment
|
||||
import de.markusfisch.android.binaryeye.fragment.EncodeFragment
|
||||
import de.markusfisch.android.binaryeye.fragment.HistoryFragment
|
||||
import de.markusfisch.android.binaryeye.fragment.PreferencesFragment
|
||||
import de.markusfisch.android.binaryeye.view.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.view.initSystemBars
|
||||
import de.markusfisch.android.binaryeye.view.recordToolbarHeight
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
override fun onRequestPermissionsResult(
|
||||
requestCode: Int,
|
||||
permissions: Array<String>,
|
||||
grantResults: IntArray
|
||||
) {
|
||||
when (requestCode) {
|
||||
PERMISSION_LOCATION, PERMISSION_WRITE -> if (grantResults.isNotEmpty() &&
|
||||
grantResults[0] == PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
permissionGrantedCallback?.invoke()
|
||||
permissionGrantedCallback = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSupportNavigateUp(): Boolean {
|
||||
val fm = supportFragmentManager
|
||||
if (fm != null && fm.backStackEntryCount > 0) {
|
||||
@@ -29,6 +45,11 @@ class MainActivity : AppCompatActivity() {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun attachBaseContext(base: Context?) {
|
||||
base?.applyLocale(prefs.customLocale)
|
||||
super.attachBaseContext(base)
|
||||
}
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setContentView(R.layout.activity_main)
|
||||
@@ -52,7 +73,7 @@ class MainActivity : AppCompatActivity() {
|
||||
private const val PREFERENCES = "preferences"
|
||||
private const val HISTORY = "history"
|
||||
private const val ENCODE = "encode"
|
||||
private const val DECODED = "decoded"
|
||||
const val DECODED = "decoded"
|
||||
|
||||
private fun getFragmentForIntent(intent: Intent?): Fragment {
|
||||
intent ?: return PreferencesFragment()
|
||||
|
||||
@@ -4,40 +4,65 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Rect
|
||||
import android.graphics.RectF
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.os.Vibrator
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.Toolbar
|
||||
import android.support.v8.renderscript.RenderScript
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import com.google.zxing.Result
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.app.initSystemBars
|
||||
import de.markusfisch.android.binaryeye.app.vibrate
|
||||
import de.markusfisch.android.binaryeye.app.*
|
||||
import de.markusfisch.android.binaryeye.graphics.crop
|
||||
import de.markusfisch.android.binaryeye.graphics.loadImageUri
|
||||
import de.markusfisch.android.binaryeye.graphics.mapResult
|
||||
import de.markusfisch.android.binaryeye.view.doOnApplyWindowInsets
|
||||
import de.markusfisch.android.binaryeye.graphics.mapResultToView
|
||||
import de.markusfisch.android.binaryeye.os.vibrate
|
||||
import de.markusfisch.android.binaryeye.rs.fixTransparency
|
||||
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.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.binaryeye.zxing.Zxing
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class PickActivity : AppCompatActivity() {
|
||||
private val zxing = Zxing()
|
||||
|
||||
private lateinit var rs: RenderScript
|
||||
private lateinit var vibrator: Vibrator
|
||||
private lateinit var cropImageView: CropImageView
|
||||
private lateinit var detectorView: DetectorView
|
||||
|
||||
private var result: Result? = null
|
||||
|
||||
override fun attachBaseContext(base: Context?) {
|
||||
base?.applyLocale(prefs.customLocale)
|
||||
super.attachBaseContext(base)
|
||||
}
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setContentView(R.layout.activity_pick)
|
||||
|
||||
zxing.updateHints(true)
|
||||
// Necessary to get the right translation after setting a custom
|
||||
// locale.
|
||||
setTitle(R.string.pick_code_to_scan)
|
||||
|
||||
zxing.updateHints(
|
||||
true,
|
||||
prefs.barcodeFormats
|
||||
)
|
||||
rs = RenderScript.create(this)
|
||||
vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
|
||||
|
||||
initSystemBars(this)
|
||||
@@ -49,68 +74,90 @@ class PickActivity : AppCompatActivity() {
|
||||
colorSystemAndToolBars(this@PickActivity)
|
||||
}
|
||||
|
||||
val bitmap = if (
|
||||
intent?.action == Intent.ACTION_SEND &&
|
||||
intent.type?.startsWith("image/") == true
|
||||
) {
|
||||
loadSentImage(intent)
|
||||
} else if (
|
||||
intent?.action == Intent.ACTION_VIEW &&
|
||||
intent.type?.startsWith("image/") == true
|
||||
) {
|
||||
loadImageToOpen(intent)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
val bitmap = fixTransparency(rs, getBitmapFromIntent())
|
||||
if (bitmap == null) {
|
||||
applicationContext.toast(R.string.error_no_content)
|
||||
finish()
|
||||
return
|
||||
}
|
||||
|
||||
var result: Result? = null
|
||||
val scope = CoroutineScope(Dispatchers.IO)
|
||||
val scannedRect = Rect()
|
||||
fun scanWithinBounds() = crop(
|
||||
cropImageView = findViewById(R.id.image) as CropImageView
|
||||
cropImageView.restrictTranslation = false
|
||||
cropImageView.setImageBitmap(bitmap)
|
||||
cropImageView.onScan = {
|
||||
scanWithinBounds(bitmap)
|
||||
}
|
||||
|
||||
detectorView = findViewById(R.id.detector_view) as DetectorView
|
||||
detectorView.onRoiChanged = {
|
||||
scanWithinBounds(bitmap)
|
||||
}
|
||||
detectorView.setPaddingFromWindowInsets()
|
||||
detectorView.restoreCropHandlePos()
|
||||
|
||||
findViewById(R.id.scan).setOnClickListener {
|
||||
showResult()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getBitmapFromIntent(): Bitmap? = if (
|
||||
intent?.action == Intent.ACTION_SEND &&
|
||||
intent.type?.startsWith("image/") == true
|
||||
) {
|
||||
loadSentImage(intent)
|
||||
} else if (
|
||||
intent?.action == Intent.ACTION_VIEW &&
|
||||
intent.type?.startsWith("image/") == true
|
||||
) {
|
||||
loadImageToOpen(intent)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
private fun scanWithinBounds(bitmap: Bitmap) {
|
||||
val roi = detectorView.roi
|
||||
val rectInView = if (roi.width() < 1) {
|
||||
cropImageView.getBoundsRect()
|
||||
} else {
|
||||
roi
|
||||
}
|
||||
val imageRect = cropImageView.mappedRect
|
||||
val rectInImage = normalizeRoi(imageRect, rectInView)
|
||||
val cropped = crop(
|
||||
bitmap,
|
||||
cropImageView.normalizedRectInBounds,
|
||||
rectInImage,
|
||||
cropImageView.imageRotation
|
||||
)?.let {
|
||||
scannedRect.set(0, 0, it.width, it.height)
|
||||
scope.launch(Dispatchers.IO) {
|
||||
result = zxing.decodePositiveNegative(it)
|
||||
result?.let {
|
||||
withContext(Dispatchers.Main) {
|
||||
if (!isFinishing) {
|
||||
vibrator.vibrate()
|
||||
}
|
||||
cropImageView.updateResultPoints(
|
||||
mapResult(
|
||||
scannedRect.width(),
|
||||
scannedRect.height(),
|
||||
0,
|
||||
cropImageView.getBoundsRect(),
|
||||
it
|
||||
)
|
||||
)
|
||||
) ?: return
|
||||
CoroutineScope(Dispatchers.IO).launch(Dispatchers.IO) {
|
||||
result = zxing.decodePositiveNegative(cropped)
|
||||
result?.let {
|
||||
withContext(Dispatchers.Main) {
|
||||
if (isFinishing) {
|
||||
return@withContext
|
||||
}
|
||||
vibrator.vibrate()
|
||||
val rc = Rect()
|
||||
imageRect.round(rc)
|
||||
rectInView.intersect(rc)
|
||||
detectorView.update(
|
||||
mapResultToView(
|
||||
cropped.width,
|
||||
cropped.height,
|
||||
0,
|
||||
rectInView,
|
||||
it.resultPoints,
|
||||
detectorView.coordinates
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cropImageView = findViewById(R.id.image) as CropImageView
|
||||
cropImageView.setImageBitmap(bitmap)
|
||||
cropImageView.onScan = {
|
||||
scanWithinBounds()
|
||||
}
|
||||
cropImageView.doOnApplyWindowInsets { v, insets ->
|
||||
(v as CropImageView).windowInsets.set(insets)
|
||||
}
|
||||
|
||||
findViewById(R.id.scan).setOnClickListener {
|
||||
scanImage(result)
|
||||
}
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
detectorView.saveCropHandlePos()
|
||||
rs.destroy()
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
@@ -144,12 +191,24 @@ class PickActivity : AppCompatActivity() {
|
||||
return loadImageUri(contentResolver, uri)
|
||||
}
|
||||
|
||||
private fun scanImage(result: Result?) {
|
||||
if (result != null) {
|
||||
showResult(this, result)
|
||||
private fun showResult() {
|
||||
val r = result
|
||||
if (r != null) {
|
||||
showResult(this, r, vibrator)
|
||||
finish()
|
||||
return
|
||||
} else {
|
||||
applicationContext.toast(R.string.no_barcode_found)
|
||||
}
|
||||
applicationContext.toast(R.string.no_barcode_found)
|
||||
}
|
||||
}
|
||||
|
||||
private fun normalizeRoi(imageRect: RectF, roi: Rect): RectF {
|
||||
val w = imageRect.width()
|
||||
val h = imageRect.height()
|
||||
return RectF(
|
||||
(roi.left - imageRect.left) / w,
|
||||
(roi.top - imageRect.top) / h,
|
||||
(roi.right - imageRect.left) / w,
|
||||
(roi.bottom - imageRect.top) / h
|
||||
)
|
||||
}
|
||||
|
||||
@@ -9,9 +9,9 @@ class SplashActivity : AppCompatActivity() {
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
|
||||
// it's important _not_ to inflate a layout file here
|
||||
// It's important _not_ to inflate a layout file here
|
||||
// because that would happen after the app is fully
|
||||
// initialized what is too late
|
||||
// initialized what is too late.
|
||||
|
||||
setRestartCount(intent)
|
||||
startActivity(Intent(applicationContext, CameraActivity::class.java))
|
||||
|
||||
@@ -9,6 +9,9 @@ import android.widget.CursorAdapter
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.database.Database
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
CursorAdapter(context, cursor, false) {
|
||||
@@ -56,7 +59,7 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
cursor: Cursor
|
||||
) {
|
||||
val holder = getViewHolder(view)
|
||||
holder.timeView.text = cursor.getString(timeIndex)
|
||||
holder.timeView.text = formatDateTime(cursor.getString(timeIndex))
|
||||
val name = cursor.getString(nameIndex)
|
||||
val content = cursor.getString(contentIndex)
|
||||
var icon = 0
|
||||
@@ -71,8 +74,8 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
holder.contentView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
icon, 0, 0, 0
|
||||
)
|
||||
holder.formatView.text = cursor.getString(formatIndex)
|
||||
// view.isSelected needs to be put on the queue to work
|
||||
holder.formatView.text = prettifyFormatName(cursor.getString(formatIndex))
|
||||
// view.isSelected needs to be put on the queue to work.
|
||||
val selected = cursor.getLong(idIndex) == selectedScanId
|
||||
view.post {
|
||||
view.isSelected = selected
|
||||
@@ -95,3 +98,15 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
val formatView: TextView
|
||||
)
|
||||
}
|
||||
|
||||
fun prettifyFormatName(format: String) = format.replace("_", " ")
|
||||
|
||||
private fun formatDateTime(rfc: String): String {
|
||||
SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).parse(rfc)?.let {
|
||||
return DateFormat.getDateTimeInstance(
|
||||
DateFormat.LONG,
|
||||
DateFormat.SHORT
|
||||
).format(it)
|
||||
}
|
||||
return rfc
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ suspend inline fun <T : Any> alertDialog(
|
||||
context: Context,
|
||||
crossinline build: AlertDialog.Builder.(resume: (T?) -> Unit) -> Unit
|
||||
): T? = withContext(Dispatchers.Main) {
|
||||
suspendCoroutine<T?> { continuation ->
|
||||
suspendCoroutine { continuation ->
|
||||
AlertDialog.Builder(context).apply {
|
||||
setOnCancelListener {
|
||||
continuation.resume(null)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
|
||||
import java.util.regex.Pattern
|
||||
|
||||
private val urlPattern: Pattern = Pattern.compile(
|
||||
"(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" +
|
||||
"(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" +
|
||||
"[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)",
|
||||
Pattern.CASE_INSENSITIVE or Pattern.MULTILINE or Pattern.DOTALL
|
||||
)
|
||||
|
||||
fun getLinks(text: String): List<String> {
|
||||
val matcher = urlPattern.matcher(text)
|
||||
val urls = mutableListOf<String>()
|
||||
|
||||
while (matcher.find()) {
|
||||
val matchStart = matcher.start(1)
|
||||
val matchEnd = matcher.end()
|
||||
|
||||
var url = text.substring(matchStart, matchEnd)
|
||||
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
||||
url = "https://$url"
|
||||
}
|
||||
|
||||
urls.add(url)
|
||||
}
|
||||
|
||||
return urls
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import java.util.*
|
||||
|
||||
fun Context.applyLocale(localeName: String) {
|
||||
if (localeName.isEmpty()) {
|
||||
return
|
||||
}
|
||||
val localeParts = localeName.split("-")
|
||||
val locale = if (localeParts.size == 2) {
|
||||
Locale(localeParts[0], localeParts[1])
|
||||
} else {
|
||||
Locale(localeName)
|
||||
}
|
||||
Locale.setDefault(locale)
|
||||
val conf = resources.configuration
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||
@Suppress("DEPRECATION")
|
||||
conf.locale = locale
|
||||
} else {
|
||||
conf.setLocale(locale)
|
||||
}
|
||||
resources.updateConfiguration(conf, resources.displayMetrics)
|
||||
}
|
||||
@@ -6,17 +6,18 @@ import android.content.pm.PackageManager
|
||||
import android.support.v4.app.ActivityCompat
|
||||
import android.support.v4.content.ContextCompat
|
||||
|
||||
var permissionGrantedCallback: (() -> Any)? = null
|
||||
|
||||
const val PERMISSION_CAMERA = 1
|
||||
fun hasCameraPermission(activity: Activity): Boolean {
|
||||
return hasPermission(
|
||||
activity,
|
||||
Manifest.permission.CAMERA,
|
||||
PERMISSION_CAMERA
|
||||
)
|
||||
}
|
||||
fun hasCameraPermission(activity: Activity) = hasPermission(
|
||||
activity,
|
||||
Manifest.permission.CAMERA,
|
||||
PERMISSION_CAMERA
|
||||
)
|
||||
|
||||
const val PERMISSION_WRITE = 2
|
||||
fun hasWritePermission(activity: Activity): Boolean {
|
||||
fun hasWritePermission(activity: Activity, callback: () -> Any): Boolean {
|
||||
permissionGrantedCallback = callback
|
||||
return hasPermission(
|
||||
activity,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
@@ -25,7 +26,8 @@ fun hasWritePermission(activity: Activity): Boolean {
|
||||
}
|
||||
|
||||
const val PERMISSION_LOCATION = 3
|
||||
fun hasLocationPermission(activity: Activity): Boolean {
|
||||
fun hasLocationPermission(activity: Activity, callback: () -> Any): Boolean {
|
||||
permissionGrantedCallback = callback
|
||||
return hasPermission(
|
||||
activity,
|
||||
Manifest.permission.ACCESS_FINE_LOCATION,
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
|
||||
import android.os.Build
|
||||
import android.os.VibrationEffect
|
||||
import android.os.Vibrator
|
||||
|
||||
private const val MILLISECONDS = 100L
|
||||
|
||||
fun Vibrator.vibrate() {
|
||||
if (!prefs.vibrate) {
|
||||
return
|
||||
}
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
@Suppress("DEPRECATION")
|
||||
this.vibrate(MILLISECONDS)
|
||||
} else {
|
||||
this.vibrate(
|
||||
VibrationEffect.createOneShot(
|
||||
MILLISECONDS,
|
||||
VibrationEffect.DEFAULT_AMPLITUDE
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
package de.markusfisch.android.binaryeye.content
|
||||
|
||||
import android.content.ClipData
|
||||
import android.content.Context
|
||||
@@ -11,7 +11,7 @@ fun Context.copyToClipboard(text: String) {
|
||||
(service as android.text.ClipboardManager).text = text
|
||||
} else {
|
||||
(service as android.content.ClipboardManager).setPrimaryClip(
|
||||
ClipData.newPlainText("simple text", text)
|
||||
ClipData.newPlainText("plain text", text)
|
||||
)
|
||||
}
|
||||
}
|
||||
+25
-11
@@ -1,5 +1,6 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
package de.markusfisch.android.binaryeye.content
|
||||
|
||||
import android.content.ActivityNotFoundException
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
@@ -10,11 +11,32 @@ import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import java.io.File
|
||||
|
||||
fun Context.execShareIntent(intent: Intent) {
|
||||
if (!startIntent(intent)) {
|
||||
toast(R.string.cannot_resolve_action)
|
||||
}
|
||||
}
|
||||
|
||||
fun Context.startIntent(intent: Intent) = try {
|
||||
// Avoid using `intent.resolveActivity()` at API level 30+ due
|
||||
// to the new package visibility restrictions. In order for
|
||||
// `resolveActivity()` to "see" another package, we would need
|
||||
// to list that package/intent in a `<queries>` block in the
|
||||
// Manifest. But since we used `resolveActivity()` only to avoid
|
||||
// an exception if the Intent cannot be resolved, it's much easier
|
||||
// and more robust to just try and catch that exception if
|
||||
// necessary.
|
||||
startActivity(intent)
|
||||
true
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
false
|
||||
}
|
||||
|
||||
fun shareText(context: Context, text: String, type: String = "text/plain") {
|
||||
val intent = Intent(Intent.ACTION_SEND)
|
||||
intent.putExtra(Intent.EXTRA_TEXT, text)
|
||||
intent.type = type
|
||||
execShareIntent(context, intent)
|
||||
context.execShareIntent(intent)
|
||||
}
|
||||
|
||||
fun shareUri(context: Context, uri: Uri, type: String) {
|
||||
@@ -22,15 +44,7 @@ fun shareUri(context: Context, uri: Uri, type: String) {
|
||||
intent.putExtra(Intent.EXTRA_STREAM, uri)
|
||||
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
intent.type = type
|
||||
execShareIntent(context, intent)
|
||||
}
|
||||
|
||||
fun execShareIntent(context: Context, intent: Intent) {
|
||||
if (intent.resolveActivity(context.packageManager) != null) {
|
||||
context.startActivity(intent)
|
||||
} else {
|
||||
context.toast(R.string.cannot_resolve_action)
|
||||
}
|
||||
context.execShareIntent(intent)
|
||||
}
|
||||
|
||||
fun shareFile(context: Context, file: File, type: String) {
|
||||
@@ -3,7 +3,7 @@ package de.markusfisch.android.binaryeye.database
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import de.markusfisch.android.binaryeye.app.toHexString
|
||||
import de.markusfisch.android.binaryeye.app.writeExternalFile
|
||||
import de.markusfisch.android.binaryeye.io.writeExternalFile
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.OutputStream
|
||||
|
||||
@@ -16,7 +16,7 @@ fun exportCsv(
|
||||
exportCsv(outputStream, cursor, delimiter)
|
||||
}
|
||||
|
||||
fun exportCsv(cursor: Cursor, delimiter: String): String? {
|
||||
fun exportCsv(cursor: Cursor, delimiter: String): String {
|
||||
val outputStream = ByteArrayOutputStream()
|
||||
exportCsv(outputStream, cursor, delimiter)
|
||||
return outputStream.toString()
|
||||
@@ -87,6 +87,8 @@ private fun Cursor.toCsvRecord(
|
||||
return sb.toString().toByteArray()
|
||||
}
|
||||
|
||||
private fun String.quoteAndEscape() = "\"${this
|
||||
.replace("\n", " ")
|
||||
.replace("\"", "\"\"")}\""
|
||||
private fun String.quoteAndEscape() = "\"${
|
||||
this
|
||||
.replace("\n", " ")
|
||||
.replace("\"", "\"\"")
|
||||
}\""
|
||||
|
||||
@@ -2,7 +2,7 @@ package de.markusfisch.android.binaryeye.database
|
||||
|
||||
import android.app.Activity
|
||||
import android.os.Environment
|
||||
import de.markusfisch.android.binaryeye.app.writeExternalFile
|
||||
import de.markusfisch.android.binaryeye.io.writeExternalFile
|
||||
import java.io.File
|
||||
import java.io.FileInputStream
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package de.markusfisch.android.binaryeye.database
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import de.markusfisch.android.binaryeye.app.toHexString
|
||||
import de.markusfisch.android.binaryeye.app.writeExternalFile
|
||||
import de.markusfisch.android.binaryeye.io.writeExternalFile
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
|
||||
@@ -138,8 +138,12 @@ private fun getRawBytes(result: Result): ByteArray? {
|
||||
for (seg in segments as Iterable<ByteArray>) {
|
||||
bytes += seg
|
||||
}
|
||||
// byte segments can never be shorter than the text.
|
||||
// Zxing cuts off content prefixes like "WIFI:"
|
||||
// If the byte segments are shorter than the converted string, the
|
||||
// content of the QR Code has been encoded with different encoding
|
||||
// modes (e.g. some parts in alphanumeric, some in byte encoding).
|
||||
// This is because Zxing only records byte segments for byte encoded
|
||||
// parts. Please note the byte segments can actually be longer than
|
||||
// the string because Zxing cuts off prefixes like "WIFI:".
|
||||
return if (bytes.size >= result.text.length) bytes else null
|
||||
}
|
||||
|
||||
|
||||
@@ -2,20 +2,31 @@ package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.AlertDialog
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.view.*
|
||||
import android.widget.EditText
|
||||
import com.google.zxing.BarcodeFormat
|
||||
import com.google.zxing.EncodeHintType
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.*
|
||||
import de.markusfisch.android.binaryeye.app.hasWritePermission
|
||||
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.io.addSuffixIfNotGiven
|
||||
import de.markusfisch.android.binaryeye.io.toSaveResult
|
||||
import de.markusfisch.android.binaryeye.io.writeExternalFile
|
||||
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.binaryeye.zxing.Zxing
|
||||
import kotlinx.coroutines.Dispatchers.Main
|
||||
import de.markusfisch.android.binaryeye.zxing.encodeAsBitmap
|
||||
import de.markusfisch.android.binaryeye.zxing.encodeAsSvg
|
||||
import de.markusfisch.android.binaryeye.zxing.encodeAsText
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import java.io.File
|
||||
@@ -26,11 +37,12 @@ import java.util.*
|
||||
|
||||
class BarcodeFragment : Fragment() {
|
||||
private enum class FileType {
|
||||
PNG, SVG
|
||||
PNG, SVG, TXT
|
||||
}
|
||||
|
||||
private var barcodeBitmap: Bitmap? = null
|
||||
private var barcodeSvg: String? = null
|
||||
private var barcodeTxt: String? = null
|
||||
private var content: String = ""
|
||||
private var format: BarcodeFormat? = null
|
||||
|
||||
@@ -56,10 +68,12 @@ class BarcodeFragment : Fragment() {
|
||||
val args = arguments ?: return view
|
||||
val content = args.getString(CONTENT) ?: return view
|
||||
val format = args.getSerializable(FORMAT) as BarcodeFormat? ?: return view
|
||||
val hints = args.getSerializable(HINTS) as EnumMap<EncodeHintType, Any>?
|
||||
val size = args.getInt(SIZE)
|
||||
try {
|
||||
barcodeBitmap = Zxing.encodeAsBitmap(content, format, size, size)
|
||||
barcodeSvg = Zxing.encodeAsSvg(content, format, size, size)
|
||||
barcodeBitmap = encodeAsBitmap(content, format, size, size, hints)
|
||||
barcodeSvg = encodeAsSvg(content, format, hints)
|
||||
barcodeTxt = encodeAsText(content, format, hints)
|
||||
} catch (e: Exception) {
|
||||
var message = e.message
|
||||
if (message == null || message.isEmpty()) {
|
||||
@@ -79,14 +93,13 @@ class BarcodeFragment : Fragment() {
|
||||
)
|
||||
imageView.setImageBitmap(barcodeBitmap)
|
||||
imageView.post {
|
||||
// make sure to invoke this after ScalingImageView.onLayout()
|
||||
// Make sure to invoke this after ScalingImageView.onLayout().
|
||||
imageView.minWidth /= 2f
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.share).setOnClickListener {
|
||||
val bitmap = barcodeBitmap
|
||||
bitmap?.let {
|
||||
share(bitmap)
|
||||
pickFileType(context, R.string.share_as) {
|
||||
shareAs(it)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,23 +117,45 @@ class BarcodeFragment : Fragment() {
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.export_svg -> {
|
||||
askForFileNameAndSave(FileType.SVG)
|
||||
R.id.copy_to_clipboard -> {
|
||||
barcodeTxt?.let {
|
||||
context.copyToClipboard(it)
|
||||
context.toast(R.string.copied_to_clipboard)
|
||||
}
|
||||
true
|
||||
}
|
||||
R.id.export_png -> {
|
||||
askForFileNameAndSave(FileType.PNG)
|
||||
R.id.export_to_file -> {
|
||||
pickFileType(context, R.string.export_as) {
|
||||
askForFileNameAndSave(it)
|
||||
}
|
||||
true
|
||||
}
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
|
||||
// dialogs do not have a parent view
|
||||
private fun pickFileType(
|
||||
context: Context,
|
||||
title: Int,
|
||||
action: (FileType) -> Unit
|
||||
) {
|
||||
val fileTypes = FileType.values()
|
||||
AlertDialog.Builder(context)
|
||||
.setTitle(title)
|
||||
.setItems(fileTypes.map { it.name }.toTypedArray()) { _, which ->
|
||||
action(fileTypes[which])
|
||||
}
|
||||
.show()
|
||||
}
|
||||
|
||||
// Dialogs do not have a parent view.
|
||||
@SuppressLint("InflateParams")
|
||||
private fun askForFileNameAndSave(fileType: FileType) {
|
||||
val ac = activity ?: return
|
||||
if (!hasWritePermission(ac)) {
|
||||
// write permission is only required before Android Q
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&
|
||||
!hasWritePermission(ac) { askForFileNameAndSave(fileType) }
|
||||
) {
|
||||
return
|
||||
}
|
||||
val view = ac.layoutInflater.inflate(R.layout.dialog_save_file, null)
|
||||
@@ -133,18 +168,26 @@ class BarcodeFragment : Fragment() {
|
||||
when (fileType) {
|
||||
FileType.PNG -> saveAs(
|
||||
addSuffixIfNotGiven(fileName, ".png"),
|
||||
"image/png"
|
||||
MIME_PNG
|
||||
) {
|
||||
barcodeBitmap?.saveAsPng(it)
|
||||
}
|
||||
FileType.SVG -> saveAs(
|
||||
addSuffixIfNotGiven(fileName, ".svg"),
|
||||
"image/svg+xmg"
|
||||
MIME_SVG
|
||||
) { outputStream ->
|
||||
barcodeSvg?.let {
|
||||
outputStream.write(it.toByteArray())
|
||||
}
|
||||
}
|
||||
FileType.TXT -> saveAs(
|
||||
addSuffixIfNotGiven(fileName, ".txt"),
|
||||
MIME_TXT
|
||||
) { outputStream ->
|
||||
barcodeTxt?.let {
|
||||
outputStream.write(it.toByteArray())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
@@ -158,18 +201,27 @@ class BarcodeFragment : Fragment() {
|
||||
write: (outputStream: OutputStream) -> Unit
|
||||
) {
|
||||
val ac = activity ?: return
|
||||
GlobalScope.launch {
|
||||
GlobalScope.launch(Dispatchers.IO) {
|
||||
val message = writeExternalFile(ac, fileName, mimeType, write).toSaveResult()
|
||||
GlobalScope.launch(Main) {
|
||||
launch(Dispatchers.Main) {
|
||||
ac.toast(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun shareAs(fileType: FileType) {
|
||||
when (fileType) {
|
||||
FileType.PNG -> barcodeBitmap?.let { share(it) }
|
||||
FileType.SVG -> barcodeSvg?.let { shareText(context, it, MIME_SVG) }
|
||||
FileType.TXT -> barcodeTxt?.let { shareText(context, it) }
|
||||
}
|
||||
}
|
||||
|
||||
private fun share(bitmap: Bitmap) {
|
||||
GlobalScope.launch {
|
||||
val ctx = context ?: return
|
||||
GlobalScope.launch(Dispatchers.IO) {
|
||||
val file = File(
|
||||
context.externalCacheDir,
|
||||
ctx.externalCacheDir,
|
||||
"shared_barcode.png"
|
||||
)
|
||||
val success = try {
|
||||
@@ -180,11 +232,11 @@ class BarcodeFragment : Fragment() {
|
||||
} catch (e: IOException) {
|
||||
false
|
||||
}
|
||||
GlobalScope.launch(Main) {
|
||||
launch(Dispatchers.Main) {
|
||||
if (success) {
|
||||
shareFile(context, file, "image/png")
|
||||
shareFile(ctx, file, "image/png")
|
||||
} else {
|
||||
activity?.toast(R.string.error_saving_file)
|
||||
ctx.toast(R.string.error_saving_file)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -193,16 +245,24 @@ class BarcodeFragment : Fragment() {
|
||||
companion object {
|
||||
private const val CONTENT = "content"
|
||||
private const val FORMAT = "format"
|
||||
private const val HINTS = "hints"
|
||||
private const val SIZE = "size"
|
||||
private const val MIME_PNG = "image/png"
|
||||
private const val MIME_SVG = "image/svg+xmg"
|
||||
private const val MIME_TXT = "text/plain"
|
||||
|
||||
fun newInstance(
|
||||
content: String,
|
||||
format: BarcodeFormat,
|
||||
size: Int
|
||||
size: Int,
|
||||
hints: EnumMap<EncodeHintType, Any>? = null
|
||||
): Fragment {
|
||||
val args = Bundle()
|
||||
args.putString(CONTENT, content)
|
||||
args.putSerializable(FORMAT, format)
|
||||
hints?.let {
|
||||
args.putSerializable(HINTS, it)
|
||||
}
|
||||
args.putInt(SIZE, size)
|
||||
val fragment = BarcodeFragment()
|
||||
fragment.arguments = args
|
||||
@@ -217,4 +277,4 @@ private fun Bitmap.saveAsPng(outputStream: OutputStream, quality: Int = 90) {
|
||||
|
||||
private val fileNameCharacters = "[^A-Za-z0-9]".toRegex()
|
||||
private fun encodeFileName(name: String): String =
|
||||
fileNameCharacters.replace(name, "_").take(16).trim('_').toLowerCase(Locale.getDefault())
|
||||
fileNameCharacters.replace(name, "_").take(16).trim('_').lowercase(Locale.getDefault())
|
||||
|
||||
@@ -14,8 +14,16 @@ import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.ActionRegistry
|
||||
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.content.copyToClipboard
|
||||
import de.markusfisch.android.binaryeye.content.shareText
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.io.askForFileName
|
||||
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.CoroutineScope
|
||||
@@ -26,6 +34,7 @@ import kotlinx.coroutines.launch
|
||||
class DecodeFragment : Fragment() {
|
||||
private lateinit var contentView: EditText
|
||||
private lateinit var formatView: TextView
|
||||
private lateinit var dataView: TableLayout
|
||||
private lateinit var metaView: TableLayout
|
||||
private lateinit var hexView: TextView
|
||||
private lateinit var format: String
|
||||
@@ -36,8 +45,10 @@ class DecodeFragment : Fragment() {
|
||||
private val content: String
|
||||
get() = contentView.text.toString()
|
||||
|
||||
private var closeAutomatically = false
|
||||
private var action = ActionRegistry.DEFAULT_ACTION
|
||||
private var isBinary = false
|
||||
private var raw: ByteArray = ByteArray(0)
|
||||
private var id = 0L
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
@@ -58,6 +69,9 @@ class DecodeFragment : Fragment() {
|
||||
false
|
||||
)
|
||||
|
||||
closeAutomatically = prefs.closeAutomatically &&
|
||||
activity?.intent?.hasExtra(MainActivity.DECODED) == true
|
||||
|
||||
val scan = arguments?.getParcelable(SCAN) as Scan?
|
||||
?: throw IllegalArgumentException("DecodeFragment needs a Scan")
|
||||
id = scan.id
|
||||
@@ -66,7 +80,7 @@ class DecodeFragment : Fragment() {
|
||||
isBinary = hasNonPrintableCharacters(
|
||||
inputContent
|
||||
) or inputContent.isEmpty()
|
||||
val raw = scan.raw ?: inputContent.toByteArray()
|
||||
raw = scan.raw ?: inputContent.toByteArray()
|
||||
format = scan.format
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
@@ -111,18 +125,14 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
formatView = view.findViewById(R.id.format)
|
||||
dataView = view.findViewById(R.id.data)
|
||||
metaView = view.findViewById(R.id.meta)
|
||||
hexView = view.findViewById(R.id.hex)
|
||||
|
||||
updateViewsAndAction(raw)
|
||||
if (action is WifiAction) {
|
||||
val password = (action as WifiAction).password
|
||||
if (password != null) {
|
||||
activity?.apply {
|
||||
copyToClipboard(password)
|
||||
toast(R.string.copied_password_to_clipboard)
|
||||
}
|
||||
}
|
||||
|
||||
if (!isBinary) {
|
||||
fillDataView(dataView, inputContent)
|
||||
}
|
||||
|
||||
if (prefs.showMetaData) {
|
||||
@@ -135,6 +145,11 @@ class DecodeFragment : Fragment() {
|
||||
return view
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
parentJob.cancel()
|
||||
}
|
||||
|
||||
private fun updateViewsAndAction(bytes: ByteArray) {
|
||||
val prevAction = action
|
||||
if (!prevAction.canExecuteOn(bytes)) {
|
||||
@@ -143,7 +158,7 @@ class DecodeFragment : Fragment() {
|
||||
formatView.text = resources.getQuantityString(
|
||||
R.plurals.barcode_info,
|
||||
bytes.size,
|
||||
format,
|
||||
prettifyFormatName(format),
|
||||
bytes.size
|
||||
)
|
||||
hexView.text = if (prefs.showHexDump) hexDump(bytes) else ""
|
||||
@@ -160,20 +175,13 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun fillMetaView(tableLayout: TableLayout, scan: Scan) {
|
||||
private fun fillDataTable(tableLayout: TableLayout, items: LinkedHashMap<Int, String?>?) {
|
||||
val ctx = tableLayout.context
|
||||
val spaceBetween = (ctx.resources.displayMetrics.density * 16f).toInt()
|
||||
var hasMeta = false
|
||||
sortedMapOf(
|
||||
R.string.error_correction_level to scan.errorCorrectionLevel,
|
||||
R.string.issue_number to scan.issueNumber,
|
||||
R.string.orientation to scan.orientation,
|
||||
R.string.other_meta_data to scan.otherMetaData,
|
||||
R.string.pdf417_extra_metadata to scan.pdf417ExtraMetaData,
|
||||
R.string.possible_country to scan.possibleCountry,
|
||||
R.string.suggested_price to scan.suggestedPrice,
|
||||
R.string.upc_ean_extension to scan.upcEanExtension
|
||||
).forEach { item ->
|
||||
val spaceBetween = (16f * ctx.resources.displayMetrics.density).toInt()
|
||||
|
||||
var hasEntries = false
|
||||
|
||||
items?.forEach { item ->
|
||||
item.value?.let {
|
||||
val tr = TableRow(ctx)
|
||||
val keyView = TextView(ctx)
|
||||
@@ -184,14 +192,51 @@ class DecodeFragment : Fragment() {
|
||||
tr.addView(keyView)
|
||||
tr.addView(valueView)
|
||||
tableLayout.addView(tr)
|
||||
hasMeta = true
|
||||
hasEntries = true
|
||||
}
|
||||
}
|
||||
if (hasMeta) {
|
||||
if (hasEntries) {
|
||||
tableLayout.setPadding(0, 0, 0, spaceBetween)
|
||||
}
|
||||
}
|
||||
|
||||
private fun fillDataView(tableLayout: TableLayout, content: String) {
|
||||
val items = LinkedHashMap<Int, String?>()
|
||||
|
||||
if (action is WifiAction) {
|
||||
val wifiData = WifiConnector.parseMap(content)
|
||||
|
||||
if (wifiData != null) {
|
||||
items[R.string.entry_type] = getString(R.string.wifi_network)
|
||||
items[R.string.wifi_ssid] = wifiData["S"]
|
||||
items[R.string.wifi_password] = wifiData["P"]
|
||||
items[R.string.wifi_type] = wifiData["T"]
|
||||
items[R.string.wifi_hidden] = wifiData["H"]
|
||||
items[R.string.wifi_eap] = wifiData["E"]
|
||||
items[R.string.wifi_identity] = wifiData["I"]
|
||||
items[R.string.wifi_anonymous_identity] = wifiData["A"]
|
||||
items[R.string.wifi_phase2] = wifiData["PH2"]
|
||||
}
|
||||
}
|
||||
|
||||
fillDataTable(tableLayout, items)
|
||||
}
|
||||
|
||||
private fun fillMetaView(tableLayout: TableLayout, scan: Scan) {
|
||||
fillDataTable(
|
||||
tableLayout, linkedMapOf(
|
||||
R.string.error_correction_level to scan.errorCorrectionLevel,
|
||||
R.string.issue_number to scan.issueNumber,
|
||||
R.string.orientation to scan.orientation,
|
||||
R.string.other_meta_data to scan.otherMetaData,
|
||||
R.string.pdf417_extra_metadata to scan.pdf417ExtraMetaData,
|
||||
R.string.possible_country to scan.possibleCountry,
|
||||
R.string.suggested_price to scan.suggestedPrice,
|
||||
R.string.upc_ean_extension to scan.upcEanExtension
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||
inflater.inflate(R.menu.fragment_decode, menu)
|
||||
if (isBinary) {
|
||||
@@ -201,16 +246,28 @@ class DecodeFragment : Fragment() {
|
||||
if (id > 0L) {
|
||||
menu.findItem(R.id.remove).isVisible = true
|
||||
}
|
||||
if (action is WifiAction) {
|
||||
menu.findItem(R.id.copy_password).isVisible = true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.copy_password -> {
|
||||
copyPasswordToClipboard()
|
||||
maybeBackOrFinish()
|
||||
true
|
||||
}
|
||||
R.id.copy_to_clipboard -> {
|
||||
copyToClipboard(content)
|
||||
copyToClipboard(textOrHex())
|
||||
maybeBackOrFinish()
|
||||
true
|
||||
}
|
||||
R.id.share -> {
|
||||
context?.also { shareText(it, content) }
|
||||
context?.also {
|
||||
shareText(it, textOrHex())
|
||||
maybeBackOrFinish()
|
||||
}
|
||||
true
|
||||
}
|
||||
R.id.create -> {
|
||||
@@ -229,6 +286,24 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun textOrHex() = if (isBinary) {
|
||||
raw.toHexString()
|
||||
} else {
|
||||
content
|
||||
}
|
||||
|
||||
private fun copyPasswordToClipboard() {
|
||||
val ac = action
|
||||
if (ac is WifiAction) {
|
||||
ac.password?.let { password ->
|
||||
activity?.apply {
|
||||
copyToClipboard(password)
|
||||
toast(R.string.copied_password_to_clipboard)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun copyToClipboard(text: String) {
|
||||
activity?.apply {
|
||||
copyToClipboard(text)
|
||||
@@ -236,6 +311,12 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun maybeBackOrFinish() {
|
||||
if (closeAutomatically) {
|
||||
backOrFinish()
|
||||
}
|
||||
}
|
||||
|
||||
private fun backOrFinish() {
|
||||
val fm = fragmentManager
|
||||
if (fm != null && fm.backStackEntryCount > 0) {
|
||||
@@ -250,19 +331,20 @@ class DecodeFragment : Fragment() {
|
||||
if (content.isNotEmpty()) {
|
||||
if (action is WifiAction &&
|
||||
Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&
|
||||
!hasLocationPermission(ac)
|
||||
!hasLocationPermission(ac) { executeAction(content) }
|
||||
) {
|
||||
return
|
||||
}
|
||||
scope.launch {
|
||||
action.execute(ac, content)
|
||||
maybeBackOrFinish()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun askForFileNameAndSave(raw: ByteArray) {
|
||||
val ac = activity ?: return
|
||||
if (!hasWritePermission(ac)) {
|
||||
if (!hasWritePermission(ac) { askForFileNameAndSave(raw) }) {
|
||||
return
|
||||
}
|
||||
scope.launch(Dispatchers.Main) {
|
||||
@@ -278,11 +360,6 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
parentJob.cancel()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val SCAN = "scan"
|
||||
|
||||
@@ -296,7 +373,7 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
fun hexDump(bytes: ByteArray, charsPerLine: Int = 33): String {
|
||||
private fun hexDump(bytes: ByteArray, charsPerLine: Int = 33): String {
|
||||
if (charsPerLine < 4 || bytes.isEmpty()) {
|
||||
return ""
|
||||
}
|
||||
@@ -309,7 +386,7 @@ fun hexDump(bytes: ByteArray, charsPerLine: Int = 33): String {
|
||||
while (true) {
|
||||
val ord = bytes[i]
|
||||
hex.append(String.format("%02X ", ord))
|
||||
ascii.append(if (ord > 31) ord.toChar() else " ")
|
||||
ascii.append(if (ord > 31) ord.toInt().toChar() else " ")
|
||||
++i
|
||||
val posInLine = i % itemsPerLine
|
||||
val atEnd = i >= len
|
||||
|
||||
@@ -2,17 +2,25 @@ package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.view.*
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.*
|
||||
import com.google.zxing.BarcodeFormat
|
||||
import com.google.zxing.EncodeHintType
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
|
||||
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.hideSoftKeyboard
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.view.hideSoftKeyboard
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import java.util.*
|
||||
|
||||
class EncodeFragment : Fragment() {
|
||||
private lateinit var formatView: Spinner
|
||||
private lateinit var errorCorrectionLabel: TextView
|
||||
private lateinit var errorCorrectionLevel: Spinner
|
||||
private lateinit var sizeView: TextView
|
||||
private lateinit var sizeBarView: SeekBar
|
||||
private lateinit var contentView: EditText
|
||||
@@ -46,11 +54,38 @@ class EncodeFragment : Fragment() {
|
||||
)
|
||||
|
||||
formatView = view.findViewById(R.id.format)
|
||||
formatView.adapter = ArrayAdapter(
|
||||
val formatAdapter = ArrayAdapter(
|
||||
ac,
|
||||
android.R.layout.simple_list_item_1,
|
||||
writers.map { it.name }
|
||||
android.R.layout.simple_spinner_item,
|
||||
writers.map { prettifyFormatName(it.name) }
|
||||
)
|
||||
formatAdapter.setDropDownViewResource(
|
||||
android.R.layout.simple_spinner_dropdown_item
|
||||
)
|
||||
formatView.adapter = formatAdapter
|
||||
formatView.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||
override fun onItemSelected(
|
||||
parentView: AdapterView<*>?,
|
||||
selectedItemView: View?,
|
||||
position: Int,
|
||||
id: Long
|
||||
) {
|
||||
val visibility = if (
|
||||
writers[position] == BarcodeFormat.QR_CODE
|
||||
) {
|
||||
View.VISIBLE
|
||||
} else {
|
||||
View.GONE
|
||||
}
|
||||
errorCorrectionLabel.visibility = visibility
|
||||
errorCorrectionLevel.visibility = visibility
|
||||
}
|
||||
|
||||
override fun onNothingSelected(parentView: AdapterView<*>?) {}
|
||||
}
|
||||
|
||||
errorCorrectionLabel = view.findViewById(R.id.error_correction_label)
|
||||
errorCorrectionLevel = view.findViewById(R.id.error_correction_level)
|
||||
|
||||
sizeView = view.findViewById(R.id.size_display)
|
||||
sizeBarView = view.findViewById(R.id.size_bar)
|
||||
@@ -90,7 +125,16 @@ class EncodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun encode() {
|
||||
val hints = EnumMap<EncodeHintType, Any>(EncodeHintType::class.java)
|
||||
val format = writers[formatView.selectedItemPosition]
|
||||
if (format == BarcodeFormat.QR_CODE) {
|
||||
hints[EncodeHintType.ERROR_CORRECTION] = arrayListOf(
|
||||
ErrorCorrectionLevel.L,
|
||||
ErrorCorrectionLevel.M,
|
||||
ErrorCorrectionLevel.Q,
|
||||
ErrorCorrectionLevel.H
|
||||
)[errorCorrectionLevel.selectedItemPosition]
|
||||
}
|
||||
val size = getSize(sizeBarView.progress)
|
||||
val content = contentView.text.toString()
|
||||
if (content.isEmpty()) {
|
||||
@@ -103,7 +147,7 @@ class EncodeFragment : Fragment() {
|
||||
activity?.hideSoftKeyboard(contentView)
|
||||
addFragment(
|
||||
fragmentManager,
|
||||
BarcodeFragment.newInstance(content, format, size)
|
||||
BarcodeFragment.newInstance(content, format, size, hints)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,12 +21,15 @@ 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.content.copyToClipboard
|
||||
import de.markusfisch.android.binaryeye.content.shareText
|
||||
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.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.useVisibility
|
||||
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.widget.toast
|
||||
import kotlinx.coroutines.*
|
||||
|
||||
@@ -151,7 +154,7 @@ class HistoryFragment : Fragment() {
|
||||
}
|
||||
true
|
||||
}
|
||||
listView.setOnScrollListener(systemBarScrollListener)
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
|
||||
fab = view.findViewById(R.id.share)
|
||||
fab.setOnClickListener { v ->
|
||||
@@ -221,7 +224,7 @@ class HistoryFragment : Fragment() {
|
||||
true
|
||||
}
|
||||
R.id.export_history -> {
|
||||
askToExportToFile(context)
|
||||
askToExportToFile()
|
||||
true
|
||||
}
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
@@ -262,7 +265,7 @@ class HistoryFragment : Fragment() {
|
||||
View.GONE
|
||||
}
|
||||
cursor?.let { cursor ->
|
||||
// close previous cursor
|
||||
// Close previous cursor.
|
||||
scansAdapter?.also { it.changeCursor(null) }
|
||||
scansAdapter = ScansAdapter(ac, cursor)
|
||||
listView.adapter = scansAdapter
|
||||
@@ -295,7 +298,7 @@ class HistoryFragment : Fragment() {
|
||||
DecodeFragment.newInstance(scan)
|
||||
)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
// ignore, can never happen
|
||||
// Ignore, can never happen.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -304,7 +307,7 @@ class HistoryFragment : Fragment() {
|
||||
return cursor?.getString(cursor.getColumnIndex(Database.SCANS_NAME))
|
||||
}
|
||||
|
||||
// dialogs don't have a parent layout
|
||||
// Dialogs don't have a parent layout.
|
||||
@SuppressLint("InflateParams")
|
||||
private fun askForName(context: Context, id: Long, text: String?) {
|
||||
val view = LayoutInflater.from(context).inflate(
|
||||
@@ -357,41 +360,43 @@ class HistoryFragment : Fragment() {
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun askToExportToFile(context: Context) = scope.launch {
|
||||
val ac = activity ?: return@launch
|
||||
progressView.useVisibility {
|
||||
if (!hasWritePermission(ac)) {
|
||||
return@useVisibility
|
||||
}
|
||||
val options = context.resources.getStringArray(
|
||||
R.array.export_options_values
|
||||
)
|
||||
val delimiter = alertDialog<String>(context) { resume ->
|
||||
setTitle(R.string.export_as)
|
||||
setItems(R.array.export_options_names) { _, which ->
|
||||
resume(options[which])
|
||||
private fun askToExportToFile() {
|
||||
scope.launch {
|
||||
val ac = activity ?: return@launch
|
||||
progressView.useVisibility {
|
||||
if (!hasWritePermission(ac) { askToExportToFile() }) {
|
||||
return@useVisibility
|
||||
}
|
||||
} ?: return@useVisibility
|
||||
val name = withContext(Dispatchers.Main) {
|
||||
ac.askForFileName(
|
||||
when (delimiter) {
|
||||
"db" -> ".db"
|
||||
"json" -> ".json"
|
||||
else -> ".csv"
|
||||
}
|
||||
val options = context.resources.getStringArray(
|
||||
R.array.export_options_values
|
||||
)
|
||||
} ?: return@useVisibility
|
||||
val message = when (delimiter) {
|
||||
"db" -> exportDatabase(ac, name)
|
||||
else -> db.getScansDetailed(filter)?.use {
|
||||
when (delimiter) {
|
||||
"json" -> exportJson(context, name, it)
|
||||
else -> exportCsv(context, name, it, delimiter)
|
||||
val delimiter = alertDialog<String>(context) { resume ->
|
||||
setTitle(R.string.export_as)
|
||||
setItems(R.array.export_options_names) { _, which ->
|
||||
resume(options[which])
|
||||
}
|
||||
} ?: false
|
||||
}.toSaveResult()
|
||||
withContext(Dispatchers.Main) {
|
||||
ac.toast(message)
|
||||
} ?: return@useVisibility
|
||||
val name = withContext(Dispatchers.Main) {
|
||||
ac.askForFileName(
|
||||
when (delimiter) {
|
||||
"db" -> ".db"
|
||||
"json" -> ".json"
|
||||
else -> ".csv"
|
||||
}
|
||||
)
|
||||
} ?: return@useVisibility
|
||||
val message = when (delimiter) {
|
||||
"db" -> exportDatabase(ac, name)
|
||||
else -> db.getScansDetailed(filter)?.use {
|
||||
when (delimiter) {
|
||||
"json" -> exportJson(context, name, it)
|
||||
else -> exportCsv(context, name, it, delimiter)
|
||||
}
|
||||
} ?: false
|
||||
}.toSaveResult()
|
||||
withContext(Dispatchers.Main) {
|
||||
ac.toast(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+142
-102
@@ -1,114 +1,154 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.app.Activity
|
||||
import android.app.AlertDialog
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||
import android.net.wifi.WifiManager
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.support.v7.widget.SwitchCompat
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.EditText
|
||||
import android.support.annotation.RequiresApi
|
||||
import android.support.v14.preference.MultiSelectListPreference
|
||||
import android.support.v7.preference.ListPreference
|
||||
import android.support.v7.preference.Preference
|
||||
import android.support.v7.preference.PreferenceFragmentCompat
|
||||
import android.support.v7.preference.PreferenceGroup
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.wifi.removeNetworkSuggestions
|
||||
import de.markusfisch.android.binaryeye.activity.SplashActivity
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
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
|
||||
|
||||
class PreferencesFragment : Fragment() {
|
||||
private lateinit var showCropHandleSwitch: SwitchCompat
|
||||
private lateinit var zoomBySwipingSwitch: SwitchCompat
|
||||
private lateinit var autoResizeSwitch: SwitchCompat
|
||||
private lateinit var tryHarderSwitch: SwitchCompat
|
||||
private lateinit var vibrateSwitch: SwitchCompat
|
||||
private lateinit var useHistorySwitch: SwitchCompat
|
||||
private lateinit var ignoreConsecutiveDuplicatesSwitch: SwitchCompat
|
||||
private lateinit var openImmediatelySwitch: SwitchCompat
|
||||
private lateinit var showMetaDataSwitch: SwitchCompat
|
||||
private lateinit var showHexDumpSwitch: SwitchCompat
|
||||
private lateinit var openWithUrlInput: EditText
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
state: Bundle?
|
||||
): View? {
|
||||
activity?.setTitle(R.string.preferences)
|
||||
|
||||
val view = inflater.inflate(
|
||||
R.layout.fragment_preferences,
|
||||
container,
|
||||
false
|
||||
)
|
||||
|
||||
showCropHandleSwitch = view.findViewById(R.id.show_crop_handle)
|
||||
if (prefs.showCropHandle) {
|
||||
showCropHandleSwitch.toggle()
|
||||
class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
private val changeListener = object : OnSharedPreferenceChangeListener {
|
||||
override fun onSharedPreferenceChanged(
|
||||
sharedPreferences: SharedPreferences,
|
||||
key: String
|
||||
) {
|
||||
val preference = findPreference(key) ?: return
|
||||
prefs.update()
|
||||
if (preference.key == "custom_locale") {
|
||||
activity?.restartApp()
|
||||
} else {
|
||||
setSummary(preference)
|
||||
}
|
||||
}
|
||||
|
||||
zoomBySwipingSwitch = view.findViewById(R.id.zoom_by_swiping)
|
||||
if (prefs.zoomBySwiping) {
|
||||
zoomBySwipingSwitch.toggle()
|
||||
}
|
||||
|
||||
autoResizeSwitch = view.findViewById(R.id.auto_rotate)
|
||||
if (prefs.autoRotate) {
|
||||
autoResizeSwitch.toggle()
|
||||
}
|
||||
|
||||
tryHarderSwitch = view.findViewById(R.id.try_harder)
|
||||
if (prefs.tryHarder) {
|
||||
tryHarderSwitch.toggle()
|
||||
}
|
||||
|
||||
vibrateSwitch = view.findViewById(R.id.vibrate)
|
||||
if (prefs.vibrate) {
|
||||
vibrateSwitch.toggle()
|
||||
}
|
||||
|
||||
useHistorySwitch = view.findViewById(R.id.use_history)
|
||||
if (prefs.useHistory) {
|
||||
useHistorySwitch.toggle()
|
||||
}
|
||||
|
||||
ignoreConsecutiveDuplicatesSwitch = view.findViewById(
|
||||
R.id.ignore_consecutive_duplicates
|
||||
)
|
||||
if (prefs.ignoreConsecutiveDuplicates) {
|
||||
ignoreConsecutiveDuplicatesSwitch.toggle()
|
||||
}
|
||||
|
||||
openImmediatelySwitch = view.findViewById(R.id.open_immediately)
|
||||
if (prefs.openImmediately) {
|
||||
openImmediatelySwitch.toggle()
|
||||
}
|
||||
|
||||
showMetaDataSwitch = view.findViewById(R.id.show_meta_data)
|
||||
if (prefs.showMetaData) {
|
||||
showMetaDataSwitch.toggle()
|
||||
}
|
||||
|
||||
showHexDumpSwitch = view.findViewById(R.id.show_hex_dump)
|
||||
if (prefs.showHexDump) {
|
||||
showHexDumpSwitch.toggle()
|
||||
}
|
||||
|
||||
openWithUrlInput = view.findViewById(R.id.open_with_url)
|
||||
openWithUrlInput.setText(prefs.openWithUrl)
|
||||
|
||||
(view.findViewById(R.id.scroll_view) as View).setPaddingFromWindowInsets()
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
prefs.showCropHandle = showCropHandleSwitch.isChecked
|
||||
prefs.zoomBySwiping = zoomBySwipingSwitch.isChecked
|
||||
prefs.autoRotate = autoResizeSwitch.isChecked
|
||||
prefs.tryHarder = tryHarderSwitch.isChecked
|
||||
prefs.vibrate = vibrateSwitch.isChecked
|
||||
prefs.useHistory = useHistorySwitch.isChecked
|
||||
prefs.ignoreConsecutiveDuplicates = ignoreConsecutiveDuplicatesSwitch.isChecked
|
||||
prefs.openImmediately = openImmediatelySwitch.isChecked
|
||||
prefs.showMetaData = showMetaDataSwitch.isChecked
|
||||
prefs.showHexDump = showHexDumpSwitch.isChecked
|
||||
prefs.openWithUrl = openWithUrlInput.text.toString()
|
||||
override fun onCreatePreferences(state: Bundle?, rootKey: String?) {
|
||||
addPreferencesFromResource(R.xml.preferences)
|
||||
activity?.setTitle(R.string.preferences)
|
||||
wireClearNetworkPreferences()
|
||||
}
|
||||
|
||||
private fun wireClearNetworkPreferences() {
|
||||
val pref = findPreference("clear_network_suggestions") ?: return
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||
pref.isVisible = false
|
||||
} else {
|
||||
pref.setOnPreferenceClickListener {
|
||||
askToClearNetworkSuggestions(context)
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
private fun askToClearNetworkSuggestions(context: Context) {
|
||||
AlertDialog.Builder(context)
|
||||
.setMessage(R.string.really_remove_all_networks)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
clearNetworkSuggestions(context)
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.show()
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.Q)
|
||||
private fun clearNetworkSuggestions(context: Context) {
|
||||
context.toast(
|
||||
if (
|
||||
removeNetworkSuggestions(context) == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS
|
||||
) {
|
||||
R.string.clear_network_suggestions_success
|
||||
} else {
|
||||
R.string.clear_network_suggestions_nothing_to_remove
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
listView.removeOnScrollListener(systemBarRecyclerViewScrollListener)
|
||||
listView.addOnScrollListener(systemBarRecyclerViewScrollListener)
|
||||
preferenceScreen.sharedPreferences
|
||||
.registerOnSharedPreferenceChangeListener(changeListener)
|
||||
setSummaries(preferenceScreen)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
preferenceScreen.sharedPreferences
|
||||
.unregisterOnSharedPreferenceChangeListener(changeListener)
|
||||
}
|
||||
|
||||
override fun onDisplayPreferenceDialog(preference: Preference) {
|
||||
if (preference is UrlPreference) {
|
||||
val fm = fragmentManager
|
||||
UrlDialogFragment.newInstance(preference.key).apply {
|
||||
setTargetFragment(this@PreferencesFragment, 0)
|
||||
show(fm, null)
|
||||
}
|
||||
} else {
|
||||
super.onDisplayPreferenceDialog(preference)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setSummaries(screen: PreferenceGroup) {
|
||||
var i = screen.preferenceCount
|
||||
while (i-- > 0) {
|
||||
setSummary(screen.getPreference(i))
|
||||
}
|
||||
}
|
||||
|
||||
private fun setSummary(preference: Preference) {
|
||||
when (preference) {
|
||||
is UrlPreference -> {
|
||||
preference.setSummary(preference.getUrl())
|
||||
}
|
||||
is ListPreference -> {
|
||||
preference.setSummary(preference.entry)
|
||||
}
|
||||
is MultiSelectListPreference -> {
|
||||
preference.setSummary(
|
||||
preference.values.joinToString(", ") {
|
||||
it.replace(Regex("_"), " ")
|
||||
}
|
||||
)
|
||||
}
|
||||
is PreferenceGroup -> {
|
||||
setSummaries(preference)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Activity.restartApp() {
|
||||
val intent = Intent(this, SplashActivity::class.java)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
intent.addFlags(
|
||||
Intent.FLAG_ACTIVITY_NEW_TASK or
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
)
|
||||
}
|
||||
startActivity(intent)
|
||||
finish()
|
||||
// Restart to begin with an unmodified Locale to follow system settings.
|
||||
Runtime.getRuntime().exit(0)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v7.preference.PreferenceDialogFragmentCompat
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
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
|
||||
|
||||
class UrlDialogFragment : PreferenceDialogFragmentCompat() {
|
||||
private var urlView: TextView? = null
|
||||
private var testButton: TextView? = null
|
||||
|
||||
override fun onBindDialogView(view: View?) {
|
||||
super.onBindDialogView(view)
|
||||
urlView = view?.findViewById(R.id.url)
|
||||
testButton = view?.findViewById(R.id.test_url)
|
||||
testButton?.setOnClickListener {
|
||||
testUrl(testButton)
|
||||
}
|
||||
urlView?.text = urlPreference().getUrl()
|
||||
urlView?.hint = getString(
|
||||
when (prefs.sendScanType) {
|
||||
"0" -> R.string.url_hint_add_content
|
||||
else -> R.string.url_hint
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
override fun onDialogClosed(positiveResult: Boolean) {
|
||||
if (positiveResult) {
|
||||
urlPreference().setUrl(getUrl())
|
||||
}
|
||||
}
|
||||
|
||||
private fun getUrl() = completeUrl(urlView?.text.toString())
|
||||
|
||||
private fun urlPreference() = preference as UrlPreference
|
||||
|
||||
private fun testUrl(textView: TextView?) {
|
||||
val url = getUrl()
|
||||
if (url.isEmpty()) {
|
||||
return
|
||||
}
|
||||
textView ?: return
|
||||
textView.text = "…"
|
||||
Scan(
|
||||
"test",
|
||||
null,
|
||||
"none",
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null
|
||||
).sendAsync(url, prefs.sendScanType) { code, body ->
|
||||
textView.text = when {
|
||||
code != null -> "$code"
|
||||
body != null -> body
|
||||
else -> getString(R.string.background_request_failed)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newInstance(key: String): UrlDialogFragment {
|
||||
val args = Bundle()
|
||||
args.putString(ARG_KEY, key)
|
||||
val fragment = UrlDialogFragment()
|
||||
fragment.arguments = args
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun completeUrl(template: String): String {
|
||||
var s = template.trim()
|
||||
if (s.isEmpty()) {
|
||||
return ""
|
||||
}
|
||||
if (!s.startsWith("http")) {
|
||||
s = "http://${s}"
|
||||
}
|
||||
if (prefs.sendScanType == "0" &&
|
||||
!s.matches(".*/[a-zA-Z._-]*\\?[a-zA-Z0-9&=_-]+=$".toRegex())
|
||||
) {
|
||||
s = "${s}?content="
|
||||
}
|
||||
return s
|
||||
}
|
||||
@@ -7,6 +7,8 @@ import android.graphics.Matrix
|
||||
import android.graphics.RectF
|
||||
import android.net.Uri
|
||||
import java.io.IOException
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
fun loadImageUri(cr: ContentResolver, uri: Uri): Bitmap? = try {
|
||||
@@ -51,12 +53,14 @@ fun crop(bitmap: Bitmap, rect: RectF, rotation: Float) = try {
|
||||
val erected = erect(bitmap, rotation)
|
||||
val w = erected.width
|
||||
val h = erected.height
|
||||
val x = max(0, (rect.left * w).roundToInt())
|
||||
val y = max(0, (rect.top * h).roundToInt())
|
||||
Bitmap.createBitmap(
|
||||
erected,
|
||||
(rect.left * w).roundToInt(),
|
||||
(rect.top * h).roundToInt(),
|
||||
(rect.width() * w).roundToInt(),
|
||||
(rect.height() * h).roundToInt()
|
||||
x,
|
||||
y,
|
||||
min(w - x, (rect.width() * w).roundToInt()),
|
||||
min(h - y, (rect.height() * h).roundToInt())
|
||||
)
|
||||
} catch (e: OutOfMemoryError) {
|
||||
null
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
package de.markusfisch.android.binaryeye.graphics
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Paint
|
||||
import android.graphics.Point
|
||||
import android.support.v4.content.ContextCompat
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
|
||||
class Dots(context: Context) {
|
||||
private val paint = Paint(Paint.ANTI_ALIAS_FLAG)
|
||||
private val radius = 8f * context.resources.displayMetrics.density
|
||||
|
||||
init {
|
||||
paint.color = ContextCompat.getColor(context, R.color.dot)
|
||||
paint.style = Paint.Style.FILL
|
||||
}
|
||||
|
||||
fun draw(canvas: Canvas, points: List<Point>) {
|
||||
for (point in points) {
|
||||
canvas.drawCircle(
|
||||
point.x.toFloat(),
|
||||
point.y.toFloat(),
|
||||
radius,
|
||||
paint
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,85 +1,62 @@
|
||||
package de.markusfisch.android.binaryeye.graphics
|
||||
|
||||
import android.graphics.Point
|
||||
import android.graphics.Matrix
|
||||
import android.graphics.Rect
|
||||
import com.google.zxing.Result
|
||||
import com.google.zxing.ResultPoint
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
fun mapResult(
|
||||
fun mapResultToView(
|
||||
frameWidth: Int,
|
||||
frameHeight: Int,
|
||||
frameOrientation: Int,
|
||||
viewRect: Rect,
|
||||
result: Result
|
||||
): List<Point> = frameToView(
|
||||
resultPoints: Array<ResultPoint?>,
|
||||
targetArray: FloatArray
|
||||
): Int = getFrameToViewMatrix(
|
||||
frameWidth,
|
||||
frameHeight,
|
||||
frameOrientation,
|
||||
viewRect
|
||||
).map(
|
||||
result.resultPoints
|
||||
resultPoints,
|
||||
targetArray
|
||||
)
|
||||
|
||||
fun frameToView(
|
||||
fun getFrameToViewMatrix(
|
||||
frameWidth: Int,
|
||||
frameHeight: Int,
|
||||
frameOrientation: Int,
|
||||
viewRect: Rect
|
||||
) = Mapping(
|
||||
frameWidth,
|
||||
frameHeight,
|
||||
frameOrientation,
|
||||
viewRect.width().toFloat(),
|
||||
viewRect.height().toFloat(),
|
||||
viewRect.left,
|
||||
viewRect.top
|
||||
)
|
||||
|
||||
fun isPortrait(orientation: Int) = orientation == 90 || orientation == 270
|
||||
|
||||
data class Mapping(
|
||||
val frameWidth: Int,
|
||||
val frameHeight: Int,
|
||||
val frameOrientation: Int,
|
||||
val viewWidth: Float,
|
||||
val viewHeight: Float,
|
||||
val offsetX: Int,
|
||||
val offsetY: Int
|
||||
) {
|
||||
fun map(resultPoint: ResultPoint): Point {
|
||||
val point = Point(
|
||||
resultPoint.x.roundToInt(),
|
||||
resultPoint.y.roundToInt()
|
||||
)
|
||||
rotate(point)
|
||||
val w: Int
|
||||
val h: Int
|
||||
if (isPortrait(frameOrientation)) {
|
||||
w = frameHeight
|
||||
h = frameWidth
|
||||
} else {
|
||||
w = frameWidth
|
||||
h = frameHeight
|
||||
}
|
||||
val ratioX = viewWidth / w.toFloat()
|
||||
val ratioY = viewHeight / h.toFloat()
|
||||
point.set(
|
||||
(point.x * ratioX).roundToInt() + offsetX,
|
||||
(point.y * ratioY).roundToInt() + offsetY
|
||||
)
|
||||
return point
|
||||
}
|
||||
|
||||
fun map(points: Array<ResultPoint?>): List<Point> =
|
||||
// because ZXing apparently returns null in this array sometimes
|
||||
points.filterNotNull().map { map(it) }
|
||||
|
||||
private fun rotate(point: Point) = when (frameOrientation) {
|
||||
90 -> point.set(frameHeight - point.y, point.x)
|
||||
180 -> point.set(frameWidth - point.x, frameHeight - point.y)
|
||||
270 -> point.set(point.y, frameWidth - point.x)
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
) = Matrix().apply {
|
||||
// Normalize to frame dimensions for rotation.
|
||||
postScale(
|
||||
1f / frameWidth,
|
||||
1f / frameHeight
|
||||
)
|
||||
// Rotate around center.
|
||||
postRotate(frameOrientation.toFloat(), 0.5f, 0.5f)
|
||||
// Scale up to view size.
|
||||
postScale(viewRect.width().toFloat(), viewRect.height().toFloat())
|
||||
// Apply view displacement.
|
||||
postTranslate(viewRect.left.toFloat(), viewRect.top.toFloat())
|
||||
}
|
||||
|
||||
fun Matrix.map(
|
||||
resultPoints: Array<ResultPoint?>,
|
||||
targetArray: FloatArray
|
||||
): Int {
|
||||
val max = targetArray.size
|
||||
var i = 0
|
||||
for (resultPoint in resultPoints) {
|
||||
// Because ZXing apparently returns null in this array sometimes.
|
||||
if (resultPoint == null) {
|
||||
continue
|
||||
}
|
||||
targetArray[i++] = resultPoint.x
|
||||
targetArray[i++] = resultPoint.y
|
||||
if (i >= max) {
|
||||
break
|
||||
}
|
||||
}
|
||||
mapPoints(targetArray, 0, targetArray, 0, i)
|
||||
return i
|
||||
}
|
||||
|
||||
+2
-1
@@ -1,4 +1,4 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
package de.markusfisch.android.binaryeye.io
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.ContentValues
|
||||
@@ -9,6 +9,7 @@ import android.provider.MediaStore
|
||||
import android.support.annotation.MainThread
|
||||
import android.widget.EditText
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.alertDialog
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
@@ -0,0 +1,122 @@
|
||||
package de.markusfisch.android.binaryeye.net
|
||||
|
||||
import de.markusfisch.android.binaryeye.app.toHexString
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.json.JSONObject
|
||||
import java.io.BufferedReader
|
||||
import java.io.IOException
|
||||
import java.io.InputStream
|
||||
import java.io.InputStreamReader
|
||||
import java.net.HttpURLConnection
|
||||
import java.net.ProtocolException
|
||||
import java.net.URL
|
||||
import java.net.URLEncoder
|
||||
|
||||
fun Scan.sendAsync(url: String, type: String, callback: (Int?, String?) -> Unit) {
|
||||
CoroutineScope(Dispatchers.IO).launch(Dispatchers.IO) {
|
||||
val response = send(url, type)
|
||||
withContext(Dispatchers.Main) {
|
||||
callback(response.code, response.body)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun Scan.send(url: String, type: String): Response {
|
||||
return when (type) {
|
||||
"1" -> request(
|
||||
url + "?" + asUrlArguments()
|
||||
)
|
||||
"2" -> request(url) { con ->
|
||||
con.requestMethod = "POST"
|
||||
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
|
||||
con.outputStream.apply {
|
||||
write(asUrlArguments().toByteArray())
|
||||
close()
|
||||
}
|
||||
}
|
||||
"3" -> request(url) { con ->
|
||||
con.requestMethod = "POST"
|
||||
con.setRequestProperty("Content-Type", "application/json")
|
||||
con.outputStream.apply {
|
||||
write(asJson().toString().toByteArray())
|
||||
close()
|
||||
}
|
||||
}
|
||||
else -> request(
|
||||
url + urlEncode(content)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun Scan.asUrlArguments(): String = getMap().map { (k, v) ->
|
||||
"${k}=${urlEncode(v)}"
|
||||
}.joinToString("&")
|
||||
|
||||
private fun Scan.asJson() = JSONObject().apply {
|
||||
getMap().forEach { (k, v) -> put(k, v) }
|
||||
}
|
||||
|
||||
private fun urlEncode(s: String) = URLEncoder.encode(s, "utf-8")
|
||||
|
||||
private fun Scan.getMap(): Map<String, String> = mapOf(
|
||||
"content" to content,
|
||||
"raw" to raw?.toHexString(),
|
||||
"format" to format,
|
||||
"errorCorrectionLevel" to errorCorrectionLevel,
|
||||
"issueNumber" to issueNumber,
|
||||
"orientation" to orientation,
|
||||
"otherMetaData" to otherMetaData,
|
||||
"pdf417ExtraMetaData" to pdf417ExtraMetaData,
|
||||
"possibleCountry" to possibleCountry,
|
||||
"suggestedPrice" to suggestedPrice,
|
||||
"upcEanExtension" to upcEanExtension,
|
||||
"timestamp" to timestamp
|
||||
).filterNullValues()
|
||||
|
||||
private fun Map<String, String?>.filterNullValues() =
|
||||
filterValues { it != null }.mapValues { it.value as String }
|
||||
|
||||
private fun request(
|
||||
url: String,
|
||||
writer: ((HttpURLConnection) -> Any)? = null
|
||||
): Response {
|
||||
var con: HttpURLConnection? = null
|
||||
return try {
|
||||
con = URL(url).openConnection() as HttpURLConnection
|
||||
con.connectTimeout = 5000
|
||||
writer?.invoke(con)
|
||||
val body = con.inputStream.readHead()
|
||||
Response(con.responseCode, body)
|
||||
} catch (e: ProtocolException) {
|
||||
Response(null, e.message)
|
||||
} catch (e: IOException) {
|
||||
try {
|
||||
val body = con?.errorStream?.readHead() ?: e.message
|
||||
Response(con?.responseCode, body)
|
||||
} catch (e: IOException) {
|
||||
Response(null, e.message)
|
||||
}
|
||||
} finally {
|
||||
con?.disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
private fun InputStream.readHead(): String {
|
||||
val sb = StringBuilder()
|
||||
val br = BufferedReader(InputStreamReader(this))
|
||||
var line = br.readLine()
|
||||
var i = 0
|
||||
while (line != null && sb.length < 240) {
|
||||
sb.append(line)
|
||||
line = br.readLine()
|
||||
++i
|
||||
}
|
||||
br.close()
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
private data class Response(val code: Int?, val body: String?)
|
||||
@@ -0,0 +1,49 @@
|
||||
package de.markusfisch.android.binaryeye.os
|
||||
|
||||
import android.os.Build
|
||||
import android.os.VibrationEffect
|
||||
import android.os.Vibrator
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
|
||||
private const val MILLISECONDS = 100L
|
||||
private val errorPatternTimings = longArrayOf(
|
||||
50L, 100L, 50L, 100L, 50L
|
||||
)
|
||||
private val errorPatternAmplitudes = intArrayOf(
|
||||
255, 0, 255, 0, 255
|
||||
)
|
||||
|
||||
fun Vibrator.vibrate() {
|
||||
if (!prefs.vibrate) {
|
||||
return
|
||||
}
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
@Suppress("DEPRECATION")
|
||||
vibrate(MILLISECONDS)
|
||||
} else {
|
||||
vibrate(
|
||||
VibrationEffect.createOneShot(
|
||||
MILLISECONDS,
|
||||
VibrationEffect.DEFAULT_AMPLITUDE
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun Vibrator.error() {
|
||||
if (!prefs.vibrate) {
|
||||
return
|
||||
}
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
@Suppress("DEPRECATION")
|
||||
vibrate(errorPatternTimings, -1)
|
||||
} else {
|
||||
vibrate(
|
||||
VibrationEffect.createWaveform(
|
||||
errorPatternTimings,
|
||||
errorPatternAmplitudes,
|
||||
-1
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,43 @@ package de.markusfisch.android.binaryeye.preference
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Build
|
||||
import android.preference.PreferenceManager
|
||||
import android.support.annotation.RequiresApi
|
||||
|
||||
class Preferences {
|
||||
lateinit var preferences: SharedPreferences
|
||||
|
||||
var cropHandleX = -1
|
||||
var barcodeFormats = setOf(
|
||||
"AZTEC",
|
||||
"CODABAR",
|
||||
"CODE_39",
|
||||
"CODE_93",
|
||||
"CODE_128",
|
||||
"DATA_MATRIX",
|
||||
"EAN_8",
|
||||
"EAN_13",
|
||||
"ITF",
|
||||
"MAXICODE",
|
||||
"PDF_417",
|
||||
"QR_CODE",
|
||||
"RSS_14",
|
||||
"RSS_EXPANDED",
|
||||
"UPC_A",
|
||||
"UPC_E",
|
||||
"UPC_EAN_EXTENSION"
|
||||
)
|
||||
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
set(value) {
|
||||
apply(BARCODE_FORMATS, value)
|
||||
field = value
|
||||
}
|
||||
var cropHandleX = -2 // -2 means set default roi.
|
||||
set(value) {
|
||||
apply(CROP_HANDLE_X, value)
|
||||
field = value
|
||||
}
|
||||
var cropHandleY = -1
|
||||
var cropHandleY = -2
|
||||
set(value) {
|
||||
apply(CROP_HANDLE_Y, value)
|
||||
field = value
|
||||
@@ -34,18 +60,39 @@ class Preferences {
|
||||
}
|
||||
var autoRotate = false
|
||||
set(value) {
|
||||
// immediately save this setting before it shouldn't change
|
||||
// on the fly while scanning
|
||||
// Immediately save this setting before it shouldn't change
|
||||
// on the fly while scanning.
|
||||
commit(AUTO_ROTATE, value)
|
||||
field = value
|
||||
}
|
||||
var tryHarder = false
|
||||
set(value) {
|
||||
// immediately save this setting because it's only ever read
|
||||
// before the camera is opened
|
||||
// Immediately save this setting because it's only ever read
|
||||
// before the camera is opened.
|
||||
commit(TRY_HARDER, value)
|
||||
field = value
|
||||
}
|
||||
var bulkMode = false
|
||||
set(value) {
|
||||
// Immediately save this setting because it's only ever read
|
||||
// before the camera is opened.
|
||||
commit(BULK_MODE, value)
|
||||
field = value
|
||||
}
|
||||
var bulkModeDelay = "500"
|
||||
set(value) {
|
||||
// Immediately save this setting because it's only ever read
|
||||
// before the camera is opened.
|
||||
commit(BULK_MODE_DELAY, value)
|
||||
field = value
|
||||
}
|
||||
var showToastInBulkMode = true
|
||||
set(value) {
|
||||
// Immediately save this setting because it's only ever read
|
||||
// before the camera is opened.
|
||||
commit(SHOW_TOAST_IN_BULK_MODE, value)
|
||||
field = value
|
||||
}
|
||||
var vibrate = true
|
||||
set(value) {
|
||||
apply(VIBRATE, value)
|
||||
@@ -61,6 +108,11 @@ class Preferences {
|
||||
apply(IGNORE_CONSECUTIVE_DUPLICATES, value)
|
||||
field = value
|
||||
}
|
||||
var copyImmediately = false
|
||||
set(value) {
|
||||
apply(COPY_IMMEDIATELY, value)
|
||||
field = value
|
||||
}
|
||||
var openImmediately = false
|
||||
set(value) {
|
||||
apply(OPEN_IMMEDIATELY, value)
|
||||
@@ -76,11 +128,36 @@ class Preferences {
|
||||
apply(SHOW_HEX_DUMP, value)
|
||||
field = value
|
||||
}
|
||||
var closeAutomatically = false
|
||||
set(value) {
|
||||
apply(CLOSE_AUTOMATICALLY, value)
|
||||
field = value
|
||||
}
|
||||
var defaultSearchUrl = ""
|
||||
set(value) {
|
||||
apply(DEFAULT_SEARCH_URL, value)
|
||||
field = value
|
||||
}
|
||||
var openWithUrl: String = ""
|
||||
set(value) {
|
||||
apply(OPEN_WITH_URL, value)
|
||||
field = value
|
||||
}
|
||||
var sendScanUrl: String = ""
|
||||
set(value) {
|
||||
apply(SEND_SCAN_URL, value)
|
||||
field = value
|
||||
}
|
||||
var sendScanType: String = "0"
|
||||
set(value) {
|
||||
apply(SEND_SCAN_TYPE, value)
|
||||
field = value
|
||||
}
|
||||
var customLocale: String = ""
|
||||
set(value) {
|
||||
apply(CUSTOM_LOCALE, value)
|
||||
field = value
|
||||
}
|
||||
var indexOfLastSelectedFormat: Int = 0
|
||||
set(value) {
|
||||
apply(INDEX_OF_LAST_SELECTED_FORMAT, value)
|
||||
@@ -88,8 +165,8 @@ class Preferences {
|
||||
}
|
||||
var forceCompat: Boolean = false
|
||||
set(value) {
|
||||
// since the app may be about to crash when forceCompat is set,
|
||||
// it's necessary to `commit()` this synchronously
|
||||
// Since the app may be about to crash when forceCompat is set,
|
||||
// it's necessary to `commit()` this synchronously.
|
||||
commit(FORCE_COMPAT, value)
|
||||
field = value
|
||||
}
|
||||
@@ -100,31 +177,68 @@ class Preferences {
|
||||
}
|
||||
|
||||
fun update() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
preferences.getStringSet(BARCODE_FORMATS, barcodeFormats)?.let {
|
||||
barcodeFormats = it
|
||||
}
|
||||
}
|
||||
cropHandleX = preferences.getInt(CROP_HANDLE_X, cropHandleX)
|
||||
cropHandleY = preferences.getInt(CROP_HANDLE_Y, cropHandleY)
|
||||
cropHandleOrientation = preferences.getInt(
|
||||
CROP_HANDLE_ORIENTATION,
|
||||
cropHandleOrientation
|
||||
)
|
||||
showCropHandle = preferences.getBoolean(SHOW_CROP_HANDLE, showCropHandle)
|
||||
showCropHandle = preferences.getBoolean(
|
||||
SHOW_CROP_HANDLE,
|
||||
showCropHandle
|
||||
)
|
||||
zoomBySwiping = preferences.getBoolean(ZOOM_BY_SWIPING, zoomBySwiping)
|
||||
autoRotate = preferences.getBoolean(AUTO_ROTATE, autoRotate)
|
||||
tryHarder = preferences.getBoolean(TRY_HARDER, tryHarder)
|
||||
bulkMode = preferences.getBoolean(BULK_MODE, bulkMode)
|
||||
bulkModeDelay = preferences.getString(
|
||||
BULK_MODE_DELAY,
|
||||
bulkModeDelay
|
||||
) ?: bulkModeDelay
|
||||
showToastInBulkMode = preferences.getBoolean(
|
||||
SHOW_TOAST_IN_BULK_MODE,
|
||||
showToastInBulkMode
|
||||
)
|
||||
vibrate = preferences.getBoolean(VIBRATE, vibrate)
|
||||
useHistory = preferences.getBoolean(USE_HISTORY, useHistory)
|
||||
ignoreConsecutiveDuplicates = preferences.getBoolean(
|
||||
IGNORE_CONSECUTIVE_DUPLICATES,
|
||||
ignoreConsecutiveDuplicates
|
||||
)
|
||||
copyImmediately = preferences.getBoolean(
|
||||
COPY_IMMEDIATELY,
|
||||
copyImmediately
|
||||
)
|
||||
openImmediately = preferences.getBoolean(
|
||||
OPEN_IMMEDIATELY,
|
||||
openImmediately
|
||||
)
|
||||
showMetaData = preferences.getBoolean(SHOW_META_DATA, showMetaData)
|
||||
showHexDump = preferences.getBoolean(SHOW_HEX_DUMP, showHexDump)
|
||||
closeAutomatically = preferences.getBoolean(
|
||||
CLOSE_AUTOMATICALLY,
|
||||
closeAutomatically
|
||||
)
|
||||
preferences.getString(DEFAULT_SEARCH_URL, defaultSearchUrl)?.also {
|
||||
defaultSearchUrl = it
|
||||
}
|
||||
preferences.getString(OPEN_WITH_URL, openWithUrl)?.also {
|
||||
openWithUrl = it
|
||||
}
|
||||
preferences.getString(SEND_SCAN_URL, sendScanUrl)?.also {
|
||||
sendScanUrl = it
|
||||
}
|
||||
preferences.getString(SEND_SCAN_TYPE, sendScanType)?.also {
|
||||
sendScanType = it
|
||||
}
|
||||
preferences.getString(CUSTOM_LOCALE, customLocale)?.also {
|
||||
customLocale = it
|
||||
}
|
||||
indexOfLastSelectedFormat = preferences.getInt(
|
||||
INDEX_OF_LAST_SELECTED_FORMAT,
|
||||
indexOfLastSelectedFormat
|
||||
@@ -135,10 +249,17 @@ class Preferences {
|
||||
private fun put(label: String, value: Boolean) =
|
||||
preferences.edit().putBoolean(label, value)
|
||||
|
||||
private fun put(label: String, value: String) =
|
||||
preferences.edit().putString(label, value)
|
||||
|
||||
private fun commit(label: String, value: Boolean) {
|
||||
put(label, value).commit()
|
||||
}
|
||||
|
||||
private fun commit(label: String, value: String) {
|
||||
put(label, value).commit()
|
||||
}
|
||||
|
||||
private fun apply(label: String, value: Boolean) {
|
||||
put(label, value).apply()
|
||||
}
|
||||
@@ -151,7 +272,13 @@ class Preferences {
|
||||
preferences.edit().putInt(label, value).apply()
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
private fun apply(label: String, value: Set<String>) {
|
||||
preferences.edit().putStringSet(label, value).apply()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val BARCODE_FORMATS = "barcode_formats"
|
||||
const val CROP_HANDLE_X = "crop_handle_x"
|
||||
const val CROP_HANDLE_Y = "crop_handle_y"
|
||||
const val CROP_HANDLE_ORIENTATION = "crop_handle_orientation"
|
||||
@@ -159,13 +286,22 @@ class Preferences {
|
||||
const val ZOOM_BY_SWIPING = "zoom_by_swiping"
|
||||
const val AUTO_ROTATE = "auto_rotate"
|
||||
const val TRY_HARDER = "try_harder"
|
||||
const val BULK_MODE = "bulk_mode"
|
||||
const val BULK_MODE_DELAY = "bulk_mode_delay"
|
||||
const val SHOW_TOAST_IN_BULK_MODE = "show_toast_in_bulk_mode"
|
||||
const val VIBRATE = "vibrate"
|
||||
const val USE_HISTORY = "use_history"
|
||||
const val IGNORE_CONSECUTIVE_DUPLICATES = "ignore_consecutive_duplicates"
|
||||
const val OPEN_IMMEDIATELY = "open_immediately"
|
||||
const val SHOW_HEX_DUMP = "show_hex_dump"
|
||||
const val COPY_IMMEDIATELY = "copy_immediately"
|
||||
const val SHOW_META_DATA = "show_meta_data"
|
||||
const val SHOW_HEX_DUMP = "show_hex_dump"
|
||||
const val CLOSE_AUTOMATICALLY = "close_automatically"
|
||||
const val DEFAULT_SEARCH_URL = "default_search_url"
|
||||
const val OPEN_WITH_URL = "open_with_url"
|
||||
const val SEND_SCAN_URL = "send_scan_url"
|
||||
const val SEND_SCAN_TYPE = "send_scan_type"
|
||||
const val CUSTOM_LOCALE = "custom_locale"
|
||||
const val INDEX_OF_LAST_SELECTED_FORMAT = "index_of_last_selected_format"
|
||||
const val FORCE_COMPAT = "force_compat"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package de.markusfisch.android.binaryeye.preference
|
||||
|
||||
import android.content.Context
|
||||
import android.support.v7.preference.DialogPreference
|
||||
import android.util.AttributeSet
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
|
||||
class UrlPreference(
|
||||
context: Context?,
|
||||
attrs: AttributeSet?
|
||||
) : DialogPreference(context, attrs) {
|
||||
private var url: String? = null
|
||||
|
||||
init {
|
||||
dialogLayoutResource = R.layout.dialog_url
|
||||
}
|
||||
|
||||
fun getUrl() = url
|
||||
|
||||
fun setUrl(url: String) {
|
||||
this.url = url
|
||||
persistString(url)
|
||||
}
|
||||
|
||||
override fun onSetInitialValue(
|
||||
restorePersistedValue: Boolean,
|
||||
defaultValue: Any?
|
||||
) {
|
||||
setUrl(
|
||||
if (restorePersistedValue) {
|
||||
getPersistedString(url)
|
||||
} else {
|
||||
defaultValue as String
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package de.markusfisch.android.binaryeye.rs
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Canvas
|
||||
import android.support.v8.renderscript.Allocation
|
||||
import android.support.v8.renderscript.RenderScript
|
||||
|
||||
fun fixTransparency(rs: RenderScript, bitmap: Bitmap?): Bitmap? {
|
||||
bitmap ?: return null
|
||||
val result = analyze(rs, bitmap)
|
||||
return if (result.hasTransparentPixels) {
|
||||
val copy = Bitmap.createBitmap(
|
||||
bitmap.width,
|
||||
bitmap.height,
|
||||
bitmap.config
|
||||
)
|
||||
Canvas(copy).apply {
|
||||
drawColor(result.backgroundColor)
|
||||
drawBitmap(bitmap, 0f, 0f, null)
|
||||
}
|
||||
copy
|
||||
} else {
|
||||
bitmap
|
||||
}
|
||||
}
|
||||
|
||||
private fun analyze(rs: RenderScript, bitmap: Bitmap): Result {
|
||||
val analyzeScript = ScriptC_analyze(rs)
|
||||
val bitmapAllocation = Allocation.createFromBitmap(rs, bitmap)
|
||||
val result = analyzeScript.reduce_analyze(bitmapAllocation).get()
|
||||
bitmapAllocation.destroy()
|
||||
analyzeScript.destroy()
|
||||
return Result(
|
||||
result.x > 0,
|
||||
if (result.y > 0) 0xff000000.toInt() else 0xffffffff.toInt()
|
||||
)
|
||||
}
|
||||
|
||||
private data class Result(
|
||||
val hasTransparentPixels: Boolean,
|
||||
val backgroundColor: Int
|
||||
)
|
||||
@@ -1,6 +1,5 @@
|
||||
package de.markusfisch.android.binaryeye.rs
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Rect
|
||||
import android.support.v8.renderscript.*
|
||||
import kotlin.math.max
|
||||
@@ -9,7 +8,7 @@ import kotlin.math.roundToInt
|
||||
private const val SCALE_FACTOR = .75f
|
||||
|
||||
class Preprocessor(
|
||||
context: Context,
|
||||
rs: RenderScript,
|
||||
width: Int,
|
||||
height: Int,
|
||||
private val roi: Rect?
|
||||
@@ -17,7 +16,6 @@ class Preprocessor(
|
||||
var outWidth = 0
|
||||
var outHeight = 0
|
||||
|
||||
private val rs = RenderScript.create(context)
|
||||
private val resizeScript = ScriptIntrinsicResize.create(rs)
|
||||
private val rotateScript = ScriptC_rotate(rs)
|
||||
|
||||
@@ -62,11 +60,11 @@ class Preprocessor(
|
||||
outWidth = (roiWidth * SCALE_FACTOR).roundToInt()
|
||||
outHeight = (roiHeight * SCALE_FACTOR).roundToInt()
|
||||
|
||||
// make sure the dimensions are always a multiple of 4
|
||||
// Make sure the dimensions are always a multiple of 4.
|
||||
outWidth -= outWidth % 4
|
||||
outHeight -= outHeight % 4
|
||||
|
||||
// make sure the dimensions are always greater than 4
|
||||
// Make sure the dimensions are always greater than 4.
|
||||
outWidth = max(4, outWidth)
|
||||
outHeight = max(4, outHeight)
|
||||
} else {
|
||||
@@ -118,7 +116,6 @@ class Preprocessor(
|
||||
rotatedAlloc = null
|
||||
resizeScript.destroy()
|
||||
rotateScript.destroy()
|
||||
rs.destroy()
|
||||
}
|
||||
|
||||
fun resizeOnly(frame: ByteArray) {
|
||||
@@ -133,7 +130,7 @@ class Preprocessor(
|
||||
rotateScript._inWidth = t.x
|
||||
rotateScript._inHeight = t.y
|
||||
rotateScript.forEach_rotate90(
|
||||
rotatedAlloc, // ignored in kernel, just to satisfy forEach
|
||||
rotatedAlloc, // Ignored in kernel, just to satisfy forEach.
|
||||
rotatedAlloc
|
||||
)
|
||||
rotatedAlloc?.copyTo(frame)
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package de.markusfisch.android.binaryeye.service
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.service.quicksettings.TileService
|
||||
import android.support.annotation.RequiresApi
|
||||
import de.markusfisch.android.binaryeye.activity.CameraActivity
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
class ScanTileService : TileService() {
|
||||
@RequiresApi(Build.VERSION_CODES.N)
|
||||
override fun onClick() {
|
||||
super.onClick()
|
||||
val intent = Intent(applicationContext, CameraActivity::class.java)
|
||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
startActivityAndCollapse(intent)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
package de.markusfisch.android.binaryeye.view
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
+24
-16
@@ -1,4 +1,4 @@
|
||||
package de.markusfisch.android.binaryeye.app
|
||||
package de.markusfisch.android.binaryeye.view
|
||||
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
@@ -6,36 +6,44 @@ import android.graphics.drawable.ColorDrawable
|
||||
import android.os.Build
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.LinearLayoutManager
|
||||
import android.support.v7.widget.RecyclerView
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.widget.AbsListView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
|
||||
val systemBarScrollListener = object : AbsListView.OnScrollListener {
|
||||
val systemBarListViewScrollListener = object : AbsListView.OnScrollListener {
|
||||
override fun onScroll(
|
||||
view: AbsListView,
|
||||
firstVisibleItem: Int,
|
||||
visibleItemCount: Int,
|
||||
totalItemCount: Int
|
||||
) {
|
||||
// give Android some time to settle down before running this,
|
||||
// not putting it on the queue makes it only work sometimes
|
||||
// Give Android some time to settle down before running this,
|
||||
// not putting it on the queue makes it only work sometimes.
|
||||
view.post {
|
||||
val scrolled = firstVisibleItem > 0 ||
|
||||
(totalItemCount > 0 && firstChildScrolled(view))
|
||||
val scrollable = if (scrolled) {
|
||||
true
|
||||
} else {
|
||||
totalItemCount > 0 && lastChildOutOfView(view)
|
||||
}
|
||||
val scrollable = scrolled || totalItemCount > 0 && lastChildOutOfView(view)
|
||||
colorSystemAndToolBars(view.context, scrolled, scrollable)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onScrollStateChanged(
|
||||
view: AbsListView,
|
||||
scrollState: Int
|
||||
) {
|
||||
override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {
|
||||
}
|
||||
}
|
||||
|
||||
val systemBarRecyclerViewScrollListener = object : RecyclerView.OnScrollListener() {
|
||||
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
||||
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
|
||||
val scrolled = layoutManager.findFirstCompletelyVisibleItemPosition() != 0
|
||||
val scrollable = scrolled || layoutManager.findLastVisibleItemPosition() <
|
||||
recyclerView.adapter.itemCount - 1
|
||||
colorSystemAndToolBars(recyclerView.context, scrolled, scrollable)
|
||||
}
|
||||
|
||||
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,7 +59,7 @@ private fun lastChildOutOfView(listView: AbsListView): Boolean {
|
||||
|
||||
fun initSystemBars(activity: AppCompatActivity) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
// keeps the soft keyboard from repositioning the layout
|
||||
// Keeps the soft keyboard from repositioning the layout.
|
||||
val window = activity.window
|
||||
window.setSoftInputMode(
|
||||
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE
|
||||
@@ -101,11 +109,11 @@ fun colorSystemAndToolBars(
|
||||
}
|
||||
activity.supportActionBar?.setBackgroundDrawable(
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
// avoid allocation on Honeycomb and better
|
||||
// Avoid allocation on Honeycomb and better.
|
||||
actionBarBackground.color = topColor
|
||||
actionBarBackground
|
||||
} else {
|
||||
// ColorDrawable.setColor() doesn't exist pre Honeycomb
|
||||
// ColorDrawable.setColor() doesn't exist pre Honeycomb.
|
||||
ColorDrawable(topColor)
|
||||
}
|
||||
)
|
||||
@@ -29,10 +29,10 @@ fun View.doOnApplyWindowInsets(f: (View, Rect) -> Unit) {
|
||||
f(v, insetsWithToolbar(insets))
|
||||
insets
|
||||
}
|
||||
// it's important to explicitly request the insets (again) in
|
||||
// It's important to explicitly request the insets (again) in
|
||||
// case the view was created in Fragment.onCreateView() because
|
||||
// setOnApplyWindowInsetsListener() won't fire when the view
|
||||
// isn't attached
|
||||
// isn't attached.
|
||||
requestApplyInsetsWhenAttached()
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Rect
|
||||
import android.util.AttributeSet
|
||||
import de.markusfisch.android.binaryeye.app.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.view.colorSystemAndToolBars
|
||||
import de.markusfisch.android.scalingimageview.widget.ScalingImageView
|
||||
|
||||
open class ConfinedScalingImageView : ScalingImageView {
|
||||
|
||||
@@ -3,7 +3,7 @@ package de.markusfisch.android.binaryeye.widget
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.widget.ScrollView
|
||||
import de.markusfisch.android.binaryeye.app.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.view.colorSystemAndToolBars
|
||||
|
||||
class ConfinedScrollView : ScrollView {
|
||||
private var scrollable = false
|
||||
@@ -23,8 +23,8 @@ class ConfinedScrollView : ScrollView {
|
||||
) {
|
||||
super.onLayout(changed, left, top, right, bottom)
|
||||
if (changed) {
|
||||
// give Android some time to settle down before running this,
|
||||
// not putting it on the queue makes it only work sometimes
|
||||
// Give Android some time to settle down before running this,
|
||||
// not putting it on the queue makes it only work sometimes.
|
||||
post {
|
||||
getChildAt(0)?.also { child ->
|
||||
scrollable = height < child.height + paddingTop + paddingBottom
|
||||
|
||||
@@ -2,53 +2,18 @@ package de.markusfisch.android.binaryeye.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.graphics.Canvas
|
||||
import android.graphics.Point
|
||||
import android.graphics.Rect
|
||||
import android.graphics.RectF
|
||||
import android.util.AttributeSet
|
||||
import de.markusfisch.android.binaryeye.graphics.Dots
|
||||
import de.markusfisch.android.binaryeye.graphics.getDashedBorderPaint
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class CropImageView(context: Context, attr: AttributeSet) :
|
||||
ConfinedScalingImageView(context, attr) {
|
||||
val windowInsets = Rect()
|
||||
|
||||
var onScan: (() -> Unit)? = null
|
||||
|
||||
private val dots = Dots(context)
|
||||
private val boundsPaint = context.getDashedBorderPaint()
|
||||
private val lastMappedRect = RectF()
|
||||
private val padding: Int = (24f * context.resources.displayMetrics.density).roundToInt()
|
||||
private val onScanRunnable = Runnable { onScan?.invoke() }
|
||||
|
||||
private var resultPoints: List<Point>? = null
|
||||
|
||||
init {
|
||||
scaleType = ScaleType.CENTER_CROP
|
||||
}
|
||||
|
||||
fun updateResultPoints(points: List<Point>) {
|
||||
resultPoints = points
|
||||
invalidate()
|
||||
}
|
||||
|
||||
override fun onLayout(
|
||||
changed: Boolean,
|
||||
left: Int,
|
||||
top: Int,
|
||||
right: Int,
|
||||
bottom: Int
|
||||
) {
|
||||
super.onLayout(changed, left, top, right, bottom)
|
||||
setBoundsWithPadding(
|
||||
left + windowInsets.left,
|
||||
top + windowInsets.top,
|
||||
right - windowInsets.right,
|
||||
bottom - windowInsets.bottom
|
||||
)
|
||||
}
|
||||
|
||||
fun getBoundsRect() = Rect(
|
||||
bounds.left.roundToInt(),
|
||||
bounds.top.roundToInt(),
|
||||
@@ -56,40 +21,12 @@ class CropImageView(context: Context, attr: AttributeSet) :
|
||||
bounds.bottom.roundToInt()
|
||||
)
|
||||
|
||||
private fun setBoundsWithPadding(
|
||||
left: Int,
|
||||
top: Int,
|
||||
right: Int,
|
||||
bottom: Int
|
||||
) {
|
||||
val width = right - left
|
||||
val height = bottom - top
|
||||
val size = if (width < height)
|
||||
width - padding * 2
|
||||
else
|
||||
height - padding * 2
|
||||
val hpad = (width - size) / 2
|
||||
val vpad = (height - size) / 2
|
||||
setBounds(
|
||||
left.toFloat() + hpad,
|
||||
top.toFloat() + vpad,
|
||||
right.toFloat() - hpad,
|
||||
bottom.toFloat() - vpad
|
||||
)
|
||||
center(bounds)
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
super.onDraw(canvas)
|
||||
canvas.drawRect(bounds, boundsPaint)
|
||||
resultPoints?.let {
|
||||
dots.draw(canvas, it)
|
||||
}
|
||||
resultPoints = null
|
||||
val mr = mappedRect ?: return
|
||||
if (mr != lastMappedRect) {
|
||||
removeCallbacks(onScanRunnable)
|
||||
postDelayed(onScanRunnable, 500)
|
||||
postDelayed(onScanRunnable, 300)
|
||||
lastMappedRect.set(mr)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,12 +6,12 @@ import android.graphics.*
|
||||
import android.os.Build
|
||||
import android.os.Parcel
|
||||
import android.os.Parcelable
|
||||
import android.support.v4.content.ContextCompat
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.graphics.Dots
|
||||
import de.markusfisch.android.binaryeye.graphics.getBitmapFromDrawable
|
||||
import de.markusfisch.android.binaryeye.graphics.getDashedBorderPaint
|
||||
import kotlin.math.abs
|
||||
@@ -20,19 +20,23 @@ import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class DetectorView : View {
|
||||
val currentOrientation = resources.configuration.orientation
|
||||
val coordinates = FloatArray(32)
|
||||
val roi = Rect()
|
||||
|
||||
var onRoiChange: (() -> Unit)? = null
|
||||
var onRoiChanged: (() -> Unit)? = null
|
||||
|
||||
private val orientation = resources.configuration.orientation
|
||||
private val dots = Dots(context)
|
||||
private val currentOrientation = resources.configuration.orientation
|
||||
private val invalidateRunnable: Runnable = Runnable {
|
||||
marks = null
|
||||
coordinatesLast = 0
|
||||
invalidate()
|
||||
}
|
||||
private val roiPaint = context.getDashedBorderPaint()
|
||||
private val dotPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
color = ContextCompat.getColor(context, R.color.dot)
|
||||
style = Paint.Style.FILL
|
||||
}
|
||||
private val dotRadius: Float
|
||||
private val handleBitmap = resources.getBitmapFromDrawable(
|
||||
R.drawable.button_crop
|
||||
)
|
||||
@@ -48,7 +52,7 @@ class DetectorView : View {
|
||||
private val fabHeight: Int
|
||||
private val padding: Int
|
||||
|
||||
private var marks: List<Point>? = null
|
||||
private var coordinatesLast = 0
|
||||
private var handleGrabbed = false
|
||||
private var handleActive = false
|
||||
private var minY = 0
|
||||
@@ -58,6 +62,7 @@ class DetectorView : View {
|
||||
|
||||
init {
|
||||
val dp = context.resources.displayMetrics.density
|
||||
dotRadius = 8f * dp
|
||||
distToFull = (24f * dp).roundToInt()
|
||||
val minMoveThreshold = (8f * dp).roundToInt()
|
||||
minMoveThresholdSq = minMoveThreshold * minMoveThreshold
|
||||
@@ -73,7 +78,28 @@ class DetectorView : View {
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) :
|
||||
super(context, attrs, defStyleAttr)
|
||||
|
||||
fun setCropHandlePos(x: Int, y: Int, orientation: Int) {
|
||||
fun saveCropHandlePos() {
|
||||
val pos = getCropHandlePos()
|
||||
prefs.cropHandleX = pos.x
|
||||
prefs.cropHandleY = pos.y
|
||||
prefs.cropHandleOrientation = currentOrientation
|
||||
}
|
||||
|
||||
private fun getCropHandlePos() = if (handleActive) {
|
||||
handlePos
|
||||
} else {
|
||||
Point(-1, -1)
|
||||
}
|
||||
|
||||
fun restoreCropHandlePos() {
|
||||
setCropHandlePos(
|
||||
prefs.cropHandleX,
|
||||
prefs.cropHandleY,
|
||||
prefs.cropHandleOrientation
|
||||
)
|
||||
}
|
||||
|
||||
private fun setCropHandlePos(x: Int, y: Int, orientation: Int) {
|
||||
if (orientation == currentOrientation) {
|
||||
handlePos.set(x, y)
|
||||
} else {
|
||||
@@ -84,14 +110,8 @@ class DetectorView : View {
|
||||
}
|
||||
}
|
||||
|
||||
fun getCropHandlePos() = if (handleActive) {
|
||||
handlePos
|
||||
} else {
|
||||
Point(-1, -1)
|
||||
}
|
||||
|
||||
fun mark(points: List<Point>) {
|
||||
marks = points
|
||||
fun update(numberOfCoordinates: Int) {
|
||||
coordinatesLast = numberOfCoordinates
|
||||
invalidate()
|
||||
removeCallbacks(invalidateRunnable)
|
||||
postDelayed(invalidateRunnable, 500)
|
||||
@@ -144,11 +164,12 @@ class DetectorView : View {
|
||||
MotionEvent.ACTION_MOVE -> {
|
||||
if (handleGrabbed) {
|
||||
handlePos.set(x, y)
|
||||
if (distSq(handlePos, touchDown) > minMoveThresholdSq) {
|
||||
handleActive = true
|
||||
handleActive =
|
||||
handleActive or (distSq(handlePos, touchDown) > minMoveThresholdSq)
|
||||
if (handleActive) {
|
||||
updateClipRect()
|
||||
invalidate()
|
||||
}
|
||||
updateClipRect()
|
||||
invalidate()
|
||||
true
|
||||
} else {
|
||||
false
|
||||
@@ -164,17 +185,14 @@ class DetectorView : View {
|
||||
MotionEvent.ACTION_UP -> {
|
||||
if (handleGrabbed) {
|
||||
if (!handleActive) {
|
||||
val mn = min(center.x, center.y) * .8f
|
||||
handlePos.set(
|
||||
(center.x + mn).roundToInt(),
|
||||
(center.y + mn).roundToInt()
|
||||
)
|
||||
handleActive = true
|
||||
invalidate()
|
||||
setHandleToDefaultRoi()
|
||||
} else {
|
||||
snap(x, y)
|
||||
}
|
||||
updateClipRect()
|
||||
if (handleActive) {
|
||||
updateClipRect()
|
||||
invalidate()
|
||||
}
|
||||
onRoiChanged?.invoke()
|
||||
handleGrabbed = false
|
||||
}
|
||||
@@ -184,6 +202,15 @@ class DetectorView : View {
|
||||
}
|
||||
}
|
||||
|
||||
private fun setHandleToDefaultRoi() {
|
||||
val mn = min(center.x, center.y) * .8f
|
||||
handlePos.set(
|
||||
(center.x + mn).roundToInt(),
|
||||
(center.y + mn).roundToInt()
|
||||
)
|
||||
handleActive = true
|
||||
}
|
||||
|
||||
private fun snap(x: Int, y: Int) {
|
||||
val cx = clampX(x)
|
||||
val cy = clampY(y)
|
||||
@@ -193,10 +220,8 @@ class DetectorView : View {
|
||||
if (dx < distToFull ||
|
||||
dy < distToFull ||
|
||||
// check if handle is close to a screen corner
|
||||
(
|
||||
(abs(cy - minY) < distToFull || abs(maxY - cy) < distToFull) &&
|
||||
abs(dx - center.x) < distToFull
|
||||
)
|
||||
((abs(cy - minY) < distToFull || abs(maxY - cy) < distToFull) &&
|
||||
abs(dx - center.x) < distToFull)
|
||||
) {
|
||||
reset()
|
||||
invalidate()
|
||||
@@ -211,9 +236,6 @@ class DetectorView : View {
|
||||
|
||||
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||
super.onLayout(changed, left, top, right, bottom)
|
||||
if (!changed) {
|
||||
return
|
||||
}
|
||||
val width = right - left
|
||||
val height = bottom - top
|
||||
center.set(
|
||||
@@ -226,6 +248,9 @@ class DetectorView : View {
|
||||
width - handleXRadius - paddingRight - padding,
|
||||
height - handleYRadius - paddingBottom - fabHeight
|
||||
)
|
||||
if (handlePos.x == -2) {
|
||||
setHandleToDefaultRoi()
|
||||
}
|
||||
if (handleActive) {
|
||||
updateClipRect()
|
||||
} else {
|
||||
@@ -234,13 +259,10 @@ class DetectorView : View {
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
canvas.drawColor(0, PorterDuff.Mode.CLEAR)
|
||||
if (handleActive) {
|
||||
drawClip(canvas)
|
||||
}
|
||||
marks?.let {
|
||||
dots.draw(canvas, it)
|
||||
}
|
||||
drawDots(canvas)
|
||||
if (prefs.showCropHandle) {
|
||||
canvas.drawBitmap(
|
||||
handleBitmap,
|
||||
@@ -251,11 +273,23 @@ class DetectorView : View {
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawDots(canvas: Canvas) {
|
||||
var i = 0
|
||||
while (i < coordinatesLast) {
|
||||
canvas.drawCircle(
|
||||
coordinates[i++],
|
||||
coordinates[i++],
|
||||
dotRadius,
|
||||
dotPaint
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawClip(canvas: Canvas) {
|
||||
if (minDist < 1) {
|
||||
return
|
||||
}
|
||||
// canvas.clipRect() doesn't work reliably below KITKAT
|
||||
// canvas.clipRect() doesn't work reliably below KITKAT.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
val radius = min(minDist / 2, cornerRadius).toFloat()
|
||||
canvas.save()
|
||||
@@ -269,7 +303,7 @@ class DetectorView : View {
|
||||
radius
|
||||
)
|
||||
)
|
||||
canvas.drawColor(shadeColor, PorterDuff.Mode.SRC)
|
||||
canvas.drawColor(shadeColor)
|
||||
canvas.restore()
|
||||
} else {
|
||||
canvas.drawRect(roi, roiPaint)
|
||||
|
||||
@@ -4,13 +4,19 @@ import android.content.Context
|
||||
import android.widget.Toast
|
||||
|
||||
fun Context.toast(message: Int) = Toast.makeText(
|
||||
this,
|
||||
applicationContext,
|
||||
message,
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
|
||||
fun Context.toast(message: String) = Toast.makeText(
|
||||
this,
|
||||
message,
|
||||
applicationContext,
|
||||
message.ellipsize(128),
|
||||
Toast.LENGTH_LONG
|
||||
).show()
|
||||
|
||||
private fun String.ellipsize(max: Int) = if (length < max) {
|
||||
this
|
||||
} else {
|
||||
"${take(max)}…"
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package de.markusfisch.android.binaryeye.zxing
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import com.google.zxing.*
|
||||
import com.google.zxing.common.BitMatrix
|
||||
import com.google.zxing.common.HybridBinarizer
|
||||
import java.util.*
|
||||
|
||||
@@ -10,44 +11,30 @@ class Zxing(possibleResultPoint: ResultPointCallback? = null) {
|
||||
private val multiFormatReader = MultiFormatReader()
|
||||
|
||||
init {
|
||||
val decodeFormats = EnumSet.noneOf<BarcodeFormat>(
|
||||
BarcodeFormat::class.java
|
||||
)
|
||||
decodeFormats.addAll(
|
||||
EnumSet.copyOf(
|
||||
listOf(
|
||||
BarcodeFormat.AZTEC,
|
||||
BarcodeFormat.CODABAR,
|
||||
BarcodeFormat.CODE_39,
|
||||
BarcodeFormat.CODE_93,
|
||||
BarcodeFormat.CODE_128,
|
||||
BarcodeFormat.DATA_MATRIX,
|
||||
BarcodeFormat.EAN_8,
|
||||
BarcodeFormat.EAN_13,
|
||||
BarcodeFormat.ITF,
|
||||
BarcodeFormat.MAXICODE,
|
||||
BarcodeFormat.PDF_417,
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.RSS_14,
|
||||
BarcodeFormat.RSS_EXPANDED,
|
||||
BarcodeFormat.UPC_A,
|
||||
BarcodeFormat.UPC_E,
|
||||
BarcodeFormat.UPC_EAN_EXTENSION
|
||||
)
|
||||
)
|
||||
)
|
||||
hints[DecodeHintType.POSSIBLE_FORMATS] = decodeFormats
|
||||
possibleResultPoint?.let {
|
||||
hints[DecodeHintType.NEED_RESULT_POINT_CALLBACK] = it
|
||||
}
|
||||
}
|
||||
|
||||
fun updateHints(tryHarder: Boolean) {
|
||||
fun updateHints(tryHarder: Boolean, formats: Set<String>) {
|
||||
if (tryHarder) {
|
||||
hints[DecodeHintType.TRY_HARDER] = java.lang.Boolean.TRUE
|
||||
} else {
|
||||
hints.remove(DecodeHintType.TRY_HARDER)
|
||||
}
|
||||
setDecodeFormats(formats)
|
||||
}
|
||||
|
||||
private fun setDecodeFormats(formats: Set<String>) {
|
||||
val decodeFormats = EnumSet.noneOf(
|
||||
BarcodeFormat::class.java
|
||||
)
|
||||
decodeFormats.addAll(
|
||||
EnumSet.copyOf(
|
||||
formats.map { BarcodeFormat.valueOf(it) }
|
||||
)
|
||||
)
|
||||
hints[DecodeHintType.POSSIBLE_FORMATS] = decodeFormats
|
||||
}
|
||||
|
||||
fun decode(
|
||||
@@ -112,86 +99,110 @@ class Zxing(possibleResultPoint: ResultPointCallback? = null) {
|
||||
val bitmap = BinaryBitmap(HybridBinarizer(source))
|
||||
return try {
|
||||
multiFormatReader.decode(bitmap, hints)
|
||||
} catch (e: ReaderException) {
|
||||
} catch (e: Exception) {
|
||||
// Usually it's bad practice to blindly catch *all* exceptions
|
||||
// because this can hide problems we want to know about. But
|
||||
// since ZXing has some errors (like all software) and I don't
|
||||
// want this app to break in the hands of my users, which won't
|
||||
// see the stack trace anyway, it's better to just catch all
|
||||
// exceptions here and live on.
|
||||
null
|
||||
} finally {
|
||||
multiFormatReader.reset()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val BLACK = 0xff000000.toInt()
|
||||
private const val WHITE = 0xffffffff.toInt()
|
||||
private const val BLACK = 0xff000000.toInt()
|
||||
private const val WHITE = 0xffffffff.toInt()
|
||||
|
||||
fun encodeAsBitmap(
|
||||
text: String,
|
||||
format: BarcodeFormat,
|
||||
width: Int,
|
||||
height: Int
|
||||
): Bitmap? {
|
||||
val hints = EnumMap<EncodeHintType, Any>(EncodeHintType::class.java)
|
||||
hints[EncodeHintType.CHARACTER_SET] = "utf-8"
|
||||
val result = MultiFormatWriter().encode(
|
||||
text,
|
||||
format,
|
||||
width,
|
||||
height,
|
||||
hints
|
||||
)
|
||||
val w = result.width
|
||||
val h = result.height
|
||||
val pixels = IntArray(w * h)
|
||||
var offset = 0
|
||||
for (y in 0 until h) {
|
||||
for (x in 0 until w) {
|
||||
pixels[offset + x] = if (result.get(x, y)) {
|
||||
BLACK
|
||||
} else {
|
||||
WHITE
|
||||
}
|
||||
}
|
||||
offset += w
|
||||
fun encodeAsBitmap(
|
||||
text: String,
|
||||
format: BarcodeFormat,
|
||||
width: Int,
|
||||
height: Int,
|
||||
hints: EnumMap<EncodeHintType, Any>? = null
|
||||
): Bitmap? {
|
||||
val bitMatrix = encode(text, format, hints, width, height)
|
||||
val w = bitMatrix.width
|
||||
val h = bitMatrix.height
|
||||
val pixels = IntArray(w * h)
|
||||
var offset = 0
|
||||
for (y in 0 until h) {
|
||||
for (x in 0 until w) {
|
||||
pixels[offset + x] = if (bitMatrix.get(x, y)) {
|
||||
BLACK
|
||||
} else {
|
||||
WHITE
|
||||
}
|
||||
val bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
|
||||
bitmap.setPixels(pixels, 0, w, 0, 0, w, h)
|
||||
return bitmap
|
||||
}
|
||||
offset += w
|
||||
}
|
||||
val bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)
|
||||
bitmap.setPixels(pixels, 0, w, 0, 0, w, h)
|
||||
return bitmap
|
||||
}
|
||||
|
||||
fun encodeAsSvg(
|
||||
text: String,
|
||||
format: BarcodeFormat,
|
||||
width: Int,
|
||||
height: Int
|
||||
): String {
|
||||
val hints = EnumMap<EncodeHintType, Any>(EncodeHintType::class.java)
|
||||
hints[EncodeHintType.CHARACTER_SET] = "utf-8"
|
||||
val result = MultiFormatWriter().encode(
|
||||
text,
|
||||
format,
|
||||
0,
|
||||
0,
|
||||
hints
|
||||
)
|
||||
val sb = StringBuilder()
|
||||
sb.append("<svg width=\"$width\" height=\"$height\"")
|
||||
sb.append(" viewBox=\"0 0 $width $height\"")
|
||||
sb.append(" xmlns=\"http://www.w3.org/2000/svg\">\n")
|
||||
val w = result.width
|
||||
val h = result.height
|
||||
val xf = width.toFloat() / w
|
||||
val yf = height.toFloat() / h
|
||||
for (y in 0 until h) {
|
||||
for (x in 0 until w) {
|
||||
if (result.get(x, y)) {
|
||||
val ox = x * xf
|
||||
val oy = y * yf
|
||||
sb.append("<rect x=\"$ox\" y=\"$oy\"")
|
||||
sb.append(" width=\"$xf\" height=\"$yf\"/>\n")
|
||||
}
|
||||
}
|
||||
fun encodeAsSvg(
|
||||
text: String,
|
||||
format: BarcodeFormat,
|
||||
hints: EnumMap<EncodeHintType, Any>? = null
|
||||
): String {
|
||||
val bitMatrix = encode(text, format, hints)
|
||||
val sb = StringBuilder()
|
||||
val w = bitMatrix.width
|
||||
var h = bitMatrix.height
|
||||
val moduleHeight = if (h == 1) w / 2 else 1
|
||||
for (y in 0 until h) {
|
||||
for (x in 0 until w) {
|
||||
if (bitMatrix.get(x, y)) {
|
||||
sb.append(" M${x},${y}h1v${moduleHeight}h-1z")
|
||||
}
|
||||
sb.append("</svg>\n")
|
||||
return sb.toString()
|
||||
}
|
||||
}
|
||||
h *= moduleHeight
|
||||
return """<svg width="$w" height="$h"
|
||||
viewBox="0 0 $w $h"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="$sb"/>
|
||||
</svg>
|
||||
"""
|
||||
}
|
||||
|
||||
fun encodeAsText(
|
||||
text: String,
|
||||
format: BarcodeFormat,
|
||||
hints: EnumMap<EncodeHintType, Any>? = null
|
||||
): String {
|
||||
val bitMatrix = encode(text, format, hints)
|
||||
val w = bitMatrix.width
|
||||
val h = bitMatrix.height
|
||||
val sb = StringBuilder()
|
||||
for (y in 0 until h) {
|
||||
for (x in 0 until w) {
|
||||
sb.append(if (bitMatrix.get(x, y)) "█" else " ")
|
||||
}
|
||||
sb.append("\n")
|
||||
}
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
private fun encode(
|
||||
text: String,
|
||||
format: BarcodeFormat,
|
||||
encodeHints: EnumMap<EncodeHintType, Any>? = null,
|
||||
width: Int = 0,
|
||||
height: Int = 0
|
||||
): BitMatrix {
|
||||
val hints = encodeHints ?: EnumMap<EncodeHintType, Any>(EncodeHintType::class.java)
|
||||
if (!hints.contains(EncodeHintType.CHARACTER_SET)) {
|
||||
hints[EncodeHintType.CHARACTER_SET] = "utf-8"
|
||||
}
|
||||
return MultiFormatWriter().encode(
|
||||
text,
|
||||
format,
|
||||
width,
|
||||
height,
|
||||
hints
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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_decode_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,4 @@
|
||||
<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="M48.281 55.787a5.719 5.719 0 1 1 11.438 0 5.719 5.719 0 1 1-11.438 0" android:fillColor="#ffffff"/>
|
||||
<path android:pathData="M48.639 37.916l-3.271 3.575h-5.665c-1.965 0-3.574 1.608-3.574 3.574v21.444c0 1.966 1.609 3.575 3.574 3.575h28.594c1.965 0 3.574-1.609 3.574-3.575V45.065c0-1.966-1.609-3.574-3.574-3.574h-5.665l-3.271-3.575zM54 64.722c-4.932 0-8.935-4.003-8.935-8.935s4.003-8.935 8.935-8.935 8.935 4.003 8.935 8.935-4.003 8.935-8.935 8.935z" android:fillColor="#ffffff"/>
|
||||
</vector>
|
||||
@@ -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_encode_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,3 @@
|
||||
<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="M69.75 56.25h-13.5v13.5h-4.5v-13.5h-13.5v-4.5h13.5v-13.5h4.5v13.5h13.5z" android:fillColor="#FFFFFF"/>
|
||||
</vector>
|
||||
@@ -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_preferences_foreground"/>
|
||||
</adaptive-icon>
|
||||
@@ -0,0 +1,3 @@
|
||||
<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="M70.057 56.114c0.09-0.675 0.135-1.372 0.135-2.114 0-0.719-0.045-1.439-0.158-2.114l4.566-3.553c0.405-0.315 0.517-0.922 0.27-1.372l-4.318-7.466C70.282 39 69.72 38.843 69.225 39l-5.375 2.159c-1.124-0.854-2.316-1.574-3.643-2.114l-0.81-5.712c-0.09-0.54-0.539-0.922-1.079-0.922h-8.636c-0.54 0-0.967 0.382-1.057 0.922l-0.809 5.712c-1.327 0.54-2.542 1.282-3.644 2.114L38.798 39c-0.495-0.18-1.057 0-1.327 0.495l-4.296 7.466c-0.269 0.472-0.179 1.057 0.27 1.372l4.566 3.553c-0.113 0.675-0.203 1.417-0.203 2.114 0 0.697 0.045 1.439 0.158 2.114L33.4 59.667c-0.404 0.315-0.517 0.922-0.27 1.372l4.318 7.466C37.718 69 38.28 69.158 38.775 69l5.375-2.159c1.124 0.855 2.316 1.574 3.643 2.114l0.81 5.712c0.112 0.54 0.539 0.922 1.079 0.922h8.636c0.54 0 0.989-0.382 1.057-0.922l0.809-5.712c1.327-0.54 2.542-1.259 3.644-2.114L69.202 69c0.495 0.18 1.057 0 1.327-0.495l4.318-7.466c0.27-0.495 0.158-1.057-0.27-1.372zM54 62.096c-4.453 0-8.096-3.643-8.096-8.096s3.643-8.096 8.096-8.096 8.096 3.643 8.096 8.096-3.643 8.096-8.096 8.096z" android:fillColor="#ffffff"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FFFFFF" android:pathData="M12.65 10C11.83 7.67 9.61 6 7 6c-3.31 0-6 2.69-6 6s2.69 6 6 6c2.61 0 4.83-1.67 5.65-4H17v4h4v-4h2v-4H12.65zM7 14c-1.1 0-2-0.9-2-2s0.9-2 2-2 2 0.9 2 2-0.9 2-2 2z"/>
|
||||
</vector>
|
||||
@@ -1,3 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M4.413 15.067h-0.88v1.93h-1.37v-5.69h2.27c0.433 0 0.817 0.08 1.15 0.24 0.34 0.16 0.6 0.39 0.78 0.69 0.187 0.293 0.28 0.627 0.28 1 0 0.553-0.2 0.997-0.6 1.33-0.4 0.333-0.943 0.5-1.63 0.5zm-0.88-2.7v1.64h0.9c0.267 0 0.47-0.067 0.61-0.2s0.21-0.32 0.21-0.56c0-0.267-0.073-0.48-0.22-0.64-0.14-0.16-0.337-0.24-0.59-0.24h-0.91zm8.587-1.06v5.69h-1.36l-2.02-3.54v3.54H7.37v-5.69h1.37l2.01 3.54v-3.54h1.37zm5.527 2.65v2.34c-0.213 0.233-0.523 0.42-0.93 0.56-0.407 0.147-0.853 0.22-1.34 0.22-0.74 0-1.333-0.23-1.78-0.69-0.447-0.453-0.687-1.087-0.72-1.9v-0.49c0-0.56 0.1-1.05 0.3-1.47 0.193-0.413 0.477-0.733 0.85-0.96 0.367-0.227 0.793-0.34 1.28-0.34 0.707 0 1.257 0.163 1.65 0.49 0.387 0.32 0.613 0.803 0.68 1.45h-1.32c-0.047-0.32-0.147-0.547-0.3-0.68-0.16-0.133-0.383-0.2-0.67-0.2-0.34 0-0.603 0.143-0.79 0.43-0.193 0.293-0.29 0.71-0.29 1.25v0.35c0 0.567 0.097 0.993 0.29 1.28 0.193 0.28 0.5 0.42 0.92 0.42 0.353 0 0.617-0.077 0.79-0.23v-0.89h-0.95v-0.94h2.33zm4.733-6.991L18.481 6.96l1.463 1.464-2.065 2.066 0.975 0.975L20.921 9.4l1.463 1.464-0.005-3.898z"/>
|
||||
</vector>
|
||||
@@ -1,3 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#FFFFFFFF" android:pathData="M5.45 15.487c0-0.2-0.07-0.357-0.21-0.47-0.14-0.113-0.39-0.23-0.75-0.35-0.353-0.12-0.643-0.237-0.87-0.35-0.74-0.36-1.11-0.857-1.11-1.49 0-0.313 0.093-0.59 0.28-0.83 0.18-0.24 0.44-0.427 0.78-0.56 0.333-0.14 0.71-0.21 1.13-0.21 0.407 0 0.773 0.073 1.1 0.22 0.327 0.147 0.577 0.357 0.75 0.63 0.18 0.267 0.27 0.573 0.27 0.92H5.46c0-0.233-0.073-0.413-0.22-0.54-0.14-0.127-0.33-0.19-0.57-0.19-0.247 0-0.44 0.053-0.58 0.16-0.14 0.107-0.21 0.243-0.21 0.41 0 0.147 0.077 0.28 0.23 0.4 0.153 0.12 0.427 0.243 0.82 0.37 0.393 0.127 0.717 0.263 0.97 0.41 0.613 0.353 0.92 0.84 0.92 1.46 0 0.5-0.187 0.89-0.56 1.17-0.373 0.287-0.887 0.43-1.54 0.43-0.46 0-0.877-0.083-1.25-0.25-0.373-0.167-0.657-0.393-0.85-0.68-0.187-0.287-0.28-0.617-0.28-0.99h1.38c0 0.3 0.077 0.523 0.23 0.67 0.16 0.147 0.417 0.22 0.77 0.22 0.227 0 0.407-0.05 0.54-0.15 0.127-0.1 0.19-0.237 0.19-0.41zm3.158-4.18l1.13 4.14 1.13-4.14h1.53l-1.91 5.69h-1.5l-1.9-5.69h1.52zm8.814 2.65v2.34c-0.213 0.233-0.523 0.42-0.93 0.56-0.407 0.147-0.853 0.22-1.34 0.22-0.74 0-1.333-0.23-1.78-0.69-0.447-0.453-0.687-1.087-0.72-1.9v-0.49c0-0.56 0.1-1.05 0.3-1.47 0.193-0.413 0.477-0.733 0.85-0.96 0.367-0.227 0.793-0.34 1.28-0.34 0.707 0 1.257 0.163 1.65 0.49 0.387 0.32 0.613 0.803 0.68 1.45h-1.32c-0.047-0.32-0.147-0.547-0.3-0.68-0.16-0.133-0.383-0.2-0.67-0.2-0.34 0-0.603 0.143-0.79 0.43-0.193 0.293-0.29 0.71-0.29 1.25v0.35c0 0.567 0.097 0.993 0.29 1.28 0.193 0.28 0.5 0.42 0.92 0.42 0.353 0 0.617-0.077 0.79-0.23v-0.89h-0.95v-0.94h2.33zm4.164-7.051L17.69 6.9l1.463 1.464-2.065 2.066 0.975 0.975 2.065-2.066 1.464 1.464-0.005-3.898z"/>
|
||||
</vector>
|
||||
@@ -1,3 +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="M15.5 14h-0.79l-0.28-0.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-0.59 4.23-1.57L14 14.71v0.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>
|
||||
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M3 11h8V3H3v8zm2-6h4v4H5V5zM3 21h8v-8H3v8zm2-6h4v4H5v-4zm8-12v8h8V3h-8zm6 6h-4V5h4v4zm0 10h2v2h-2zm-6-6h2v2h-2zm2 2h2v2h-2zm-2 2h2v2h-2zm2 2h2v2h-2zm2-2h2v2h-2zm0-4h2v2h-2zm2 2h2v2h-2z"/>
|
||||
</vector>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="#b6d46f"/>
|
||||
</shape>
|
||||
@@ -4,6 +4,10 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:contentDescription="@string/view_barcode"/>
|
||||
<de.markusfisch.android.binaryeye.widget.DetectorView
|
||||
android:id="@+id/detector_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
@@ -13,6 +17,6 @@
|
||||
style="@style/FAB"
|
||||
android:id="@+id/scan"
|
||||
android:contentDescription="@string/scan_code"
|
||||
android:src="@drawable/ic_action_scan"/>
|
||||
android:src="@drawable/ic_action_search"/>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</merge>
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
<EditText
|
||||
tools:targetApi="o"
|
||||
android:id="@+id/url"
|
||||
android:inputType="textUri"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/url_hint"
|
||||
android:importantForAutofill="no"/>
|
||||
<Button
|
||||
android:id="@+id/test_url"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/test_url"/>
|
||||
</LinearLayout>
|
||||
@@ -38,7 +38,7 @@
|
||||
android:layout_marginBottom="16dp"
|
||||
android:gravity="end|top"/>
|
||||
<TableLayout
|
||||
android:id="@+id/meta"
|
||||
android:id="@+id/data"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/format"
|
||||
@@ -46,6 +46,15 @@
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"/>
|
||||
<TableLayout
|
||||
android:id="@+id/meta"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/data"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"/>
|
||||
<TextView
|
||||
android:id="@+id/hex"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -23,6 +23,18 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"/>
|
||||
<TextView
|
||||
android:id="@+id/error_correction_label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@string/error_correction_level"/>
|
||||
<Spinner
|
||||
android:id="@+id/error_correction_level"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:entries="@array/error_correction_levels"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
<de.markusfisch.android.binaryeye.widget.ConfinedScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/scroll_view"
|
||||
android:clipToPadding="false"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp"
|
||||
android:orientation="vertical">
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/show_crop_handle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/show_crop_handle"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/zoom_by_swiping"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/zoom_by_swiping"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/auto_rotate"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/auto_rotate"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/try_harder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/try_harder"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/vibrate"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/vibrate"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/use_history"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/use_history"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/ignore_consecutive_duplicates"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/ignore_consecutive_duplicates"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/open_immediately"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/open_immediately"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/show_meta_data"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/show_meta_data"/>
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/show_hex_dump"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/show_hex_dump"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/open_with_url"/>
|
||||
<EditText
|
||||
tools:targetApi="o"
|
||||
android:id="@+id/open_with_url"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:gravity="start|top"
|
||||
android:typeface="monospace"
|
||||
android:imeOptions="flagNoExtractUi"
|
||||
android:inputType="textUri"
|
||||
android:hint="@string/open_with_url_hint"
|
||||
android:importantForAutofill="no"/>
|
||||
</LinearLayout>
|
||||
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
|
||||
@@ -2,13 +2,13 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:material="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/export_svg"
|
||||
android:title="@string/export_svg"
|
||||
android:icon="@drawable/ic_action_save_svg"
|
||||
android:id="@+id/copy_to_clipboard"
|
||||
android:title="@string/copy_to_clipboard"
|
||||
android:icon="@drawable/ic_action_copy"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/export_png"
|
||||
android:title="@string/export_png"
|
||||
android:icon="@drawable/ic_action_save_png"
|
||||
android:id="@+id/export_to_file"
|
||||
android:title="@string/export_to_file"
|
||||
android:icon="@drawable/ic_action_save"
|
||||
material:showAsAction="ifRoom"/>
|
||||
</menu>
|
||||
|
||||
@@ -6,20 +6,26 @@
|
||||
android:title="@string/remove_scan"
|
||||
android:icon="@drawable/ic_action_remove"
|
||||
android:visible="false"
|
||||
material:showAsAction="always"/>
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/copy_password"
|
||||
android:title="@string/copy_password"
|
||||
android:icon="@drawable/ic_action_copy_password"
|
||||
android:visible="false"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/copy_to_clipboard"
|
||||
android:title="@string/copy_to_clipboard"
|
||||
android:icon="@drawable/ic_action_copy"
|
||||
material:showAsAction="always"/>
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/share"
|
||||
android:title="@string/share"
|
||||
android:icon="@drawable/ic_action_share"
|
||||
material:showAsAction="always"/>
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/create"
|
||||
android:title="@string/compose_barcode"
|
||||
android:icon="@drawable/ic_action_create"
|
||||
material:showAsAction="always"/>
|
||||
material:showAsAction="ifRoom"/>
|
||||
</menu>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background"/>
|
||||
<background android:drawable="@color/accent"/>
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
|
||||
</adaptive-icon>
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">এই অ্যাপ ক্যামেরা অনুমতি ছাড়া কোনো কাজের না। বিদায়।</string>
|
||||
<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">কম (~৭% ঠিককরণ)</string>
|
||||
<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="issue_number">সমস্যা ক্রম</string>
|
||||
<string name="orientation">দিক</string>
|
||||
<string name="other_meta_data">মেটাতথ্য</string>
|
||||
<string name="pdf417_extra_metadata">পিডিএফ৪১৭ মেটাতথ্য</string>
|
||||
<string name="possible_country">তৈরির সম্ভাব্য দেশ</string>
|
||||
<string name="suggested_price">প্রস্তসবিত দাম</string>
|
||||
<string name="upc_ean_extension">ইউপিসি ইএএন বর্ধিত</string>
|
||||
<string name="toggle_flash">আলো</string>
|
||||
<string name="share">ভাগ করো</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="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="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">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">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">Barcode formats</string>
|
||||
<string name="zoom_by_swiping">ওপরে/নিচে টানো বড়ো করার জন্য</string>
|
||||
<string name="zoom_by_swiping_summary">ক্যামেরার ছোটো-বড় নিয়ন্ত্রণের জন্য উপরে-নিচে টানো।</string>
|
||||
<string name="auto_rotate">খাড়া ১ডি বারকোড সনাক্ত করো</string>
|
||||
<string name="auto_rotate_summary">১ডি বারকোড সনাক্ত করতে স্বয়ংক্রিয়ভাবে ঘুরাও। যন্ত্রনির্ভরে এটি কার্যসম্পাদনের হার কমাতে পারে।</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="use_history">ইতিহাস সংরক্ষণ করো।</string>
|
||||
<string name="use_history_summary">সনাক্তকৃত সংকেত যন্ত্রে সংরক্ষণ করো।</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="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">ষড়(hex) সংকেত দেখাও</string>
|
||||
<string name="show_hex_dump_summary">পড়া তথ্যের ষড় সংকেত দেখাও</string>
|
||||
<string name="close_automatically">অনুলিপি/ভাগ করার পরে পিছনে যাও</string>
|
||||
<string name="close_automatically_summary">তথ্য অনুলিপি/ভাগ করার পরে স্বয়ংক্রিয়ভাবে পিছনে যাও।</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">অজানা ইউআরএল খুলো</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">অন্যকে পাঠাও</string>
|
||||
<string name="send_scan_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="test_url">পরীক্ষার জন্য ইউআরএল</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="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">ওয়াইফাইর সাথে যুক্ত করো</string>
|
||||
<string name="wifi_config_failed">ওয়াইফাইয়ে ঠিক করে যুক্ত হওয়া যায়নি</string>
|
||||
<string name="wifi_added">ওয়াইফাই যোগকৃত</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="otpauth_add">২এফএ যোগ করো</string>
|
||||
<string name="search_web">ওয়েবে খুঁজো</string>
|
||||
<string name="search_scan">আগেরগুলোতে খুঁজো</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">জেসন নথি</string>
|
||||
<string name="export_database">এসকিউলাইট তথ্যভিত্তি</string>
|
||||
<string name="saved_in_downloads">ডাউনলোডে সংরক্ষিত</string>
|
||||
<string name="rotate_image_cw">ছবি ঘড়ির দিকে ঘুরাও</string>
|
||||
<string name="pick_file">ছবি নাও</string>
|
||||
<string name="pick_code_to_scan">খুঁজার জন্য কোড নাও</string>
|
||||
<string name="shortcut_decode">বারকোড খুজো</string>
|
||||
<string name="shortcut_encode">বারকোড বানাও</string>
|
||||
<string name="shortcut_preferences">পছন্দসমূহ</string>
|
||||
<string name="background_request_failed">পটভূমির অনুরোধ ব্যর্থ</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,161 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Bez oprávnění k fotoaparátu tato aplikace nemá smysl. Na viděnou.</string>
|
||||
<string name="camera_error">Nepodařilo se otevřít fotoaparát, prosím zkuste to znovu</string>
|
||||
<string name="scan_code">Skenovat kód</string>
|
||||
<string name="compose_barcode">Vytvořit čárový kód</string>
|
||||
<string name="decode_barcode">Dekódovat čárový kód</string>
|
||||
<string name="content">Obsah</string>
|
||||
<string name="binary_data">(binární data)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d znak, %1$s</item>
|
||||
<item quantity="few">%2$d znaky, %1$s</item>
|
||||
<item quantity="other">%2$d znaků, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Stupeň korekce chyb</string>
|
||||
<string name="error_correction_level_l" formatted="false">Nízký (~7% korekce)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Střední (~15% korekce)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Čtvrtinový (~25% korekce)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Vysoký (~30% korekce)</string>
|
||||
<string name="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientace</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Možná země původu</string>
|
||||
<string name="suggested_price">Doporučená cena</string>
|
||||
<string name="upc_ean_extension">rozšíření UPC EAN</string>
|
||||
<string name="toggle_flash">Zap/vyp blesk</string>
|
||||
<string name="share">Sdílet</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>
|
||||
<string name="copy_password">Zkopírovat heslo do schránky</string>
|
||||
<string name="copied_password_to_clipboard">Heslo zkopírováno do schránky</string>
|
||||
<string name="open_url">Otevřít URL</string>
|
||||
<string name="cannot_resolve_action">Nemáte aplikaci, která by to 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="input_content_here">Sem vložte obsah</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="switch_camera">Přepnout kameru</string>
|
||||
<string name="bulk_mode">Skenovat nepřetržitě</string>
|
||||
<string name="bulk_mode_summary">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">Historie</string>
|
||||
<string name="preferences">Nastavení</string>
|
||||
<string name="scan_category">Skenování</string>
|
||||
<string name="content_category">Obsah</string>
|
||||
<string name="locale_category">Jazyk</string>
|
||||
<string name="custom_locale">Zvolit jazyk</string>
|
||||
<string name="follow_system_settings">Řídit se nastavením systému</string>
|
||||
<string name="show_crop_handle">Zobrazovat hrany výřezu</string>
|
||||
<string name="show_crop_handle_summary">Omezí skenování na zvolenou oblast.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="zoom_by_swiping">Potáhnutím nahoru/dolů přiblížit</string>
|
||||
<string name="zoom_by_swiping_summary">Přetáhnutím nahoru nebo dolů se zvětší / zmenší úroveň přiblížení.</string>
|
||||
<string name="auto_rotate">Rozpoznávat otočené 1D čárové kódy</string>
|
||||
<string name="auto_rotate_summary">Automaticky otočí obraz a tak detekuje 1D čárové kódy na výšku. Na některých zařízeních může snížit výkonnost.</string>
|
||||
<string name="try_harder">Optimalizovat pro přesnost</string>
|
||||
<string name="try_harder_summary">Použijte pro velmi nečitelné kódy. Sníží výkonnost.</string>
|
||||
<string name="show_toast_in_bulk_mode">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</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="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_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="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>
|
||||
<string name="copy_immediately_summary">Automaticky zkopírovat naskenovaný obsah do schránky. Pozor, jiné aplikace jej mohou ze schránky přečíst, i když neběží.</string>
|
||||
<string name="show_meta_data">Zobrazit metadata</string>
|
||||
<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="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">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">Otevřít neznámá data pomocí URL</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">Přesměrování</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_type_get_add_content">GET a simply add content</string>
|
||||
<string name="send_type_get_query_string">GET with compelete 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="test_url">Otestovat URL</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="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>
|
||||
<string name="no_barcode_found">Čárový kód nenalezen</string>
|
||||
<string name="pick_list_separator">Jak mají být odděleny položky?</string>
|
||||
<string name="separator_line_break">Nový řádek</string>
|
||||
<string name="separator_ruler">Svislice</string>
|
||||
<string name="save_as_file_name">Uložit jako do složky Stahování</string>
|
||||
<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="sms_send">Poslat SMS</string>
|
||||
<string name="sms_error">Nepodařilo se poslat SMS</string>
|
||||
<string name="tel_dial">Vytočit číslo</string>
|
||||
<string name="tel_error">Nepodařilo se vytočit číslo</string>
|
||||
<string name="mail_send">Poslat email</string>
|
||||
<string name="mail_error">Nepodařilo se poslat email</string>
|
||||
<string name="vcard_add">Přidat do kontaktů</string>
|
||||
<string name="vcard_failed">Nepodařilo se přidat do kontaktů</string>
|
||||
<string name="vevent_add">Vložit do kalendáře</string>
|
||||
<string name="vevent_failed">Nepodařilo se vložit do kalendáře</string>
|
||||
<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="export_to_file">Exportovat do souboru</string>
|
||||
<string name="export_as">Exportovat jako</string>
|
||||
<string name="export_csv_comma">CSV oddělené čárkami</string>
|
||||
<string name="export_csv_semicolon">CSV oddělené středníky</string>
|
||||
<string name="export_json">soubor JSON</string>
|
||||
<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="pick_file">Zvolte obrázek</string>
|
||||
<string name="pick_code_to_scan">Zvolte 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_preferences">Nastavení</string>
|
||||
<string name="background_request_failed">Požadavek na pozadí selhal</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
@@ -11,6 +11,10 @@
|
||||
<item quantity="other">%2$d Zeichen, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Fehlerkorrektur-Level</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% wiederherstellbar)</string>
|
||||
<string name="issue_number">Ausgabe Nummer</string>
|
||||
<string name="orientation">Orientierung</string>
|
||||
<string name="other_meta_data">Metadaten</string>
|
||||
@@ -20,8 +24,10 @@
|
||||
<string name="upc_ean_extension">UPC EAN Erweiterung</string>
|
||||
<string name="toggle_flash">Licht an/ausschalten</string>
|
||||
<string name="share">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>
|
||||
<string name="copy_password">Passwort in die Zwischenablage kopieren</string>
|
||||
<string name="copied_password_to_clipboard">Passwort wurde in die Zwischenablage kopiert</string>
|
||||
<string name="open_url">URL öffnen</string>
|
||||
<string name="cannot_resolve_action">Keine App kann das öffnen</string>
|
||||
@@ -37,19 +43,63 @@
|
||||
<string name="info">Info</string>
|
||||
<string name="switch_camera">Kamera wechseln</string>
|
||||
<string name="bulk_mode">Fortlaufend Scannen</string>
|
||||
<string name="bulk_mode_summary">Immer mit fortlaufendem Scannen starten.</string>
|
||||
<string name="bulk_mode_delay">Pause zwischen fortlaufenden Scans</string>
|
||||
<string name="quarter_second">Eine Viertelsekunde</string>
|
||||
<string name="half_second">Eine halbe Sekunde</string>
|
||||
<string name="a_second">Eine Sekunde</string>
|
||||
<string name="two_seconds">Zwei Sekunden</string>
|
||||
<string name="five_seconds">Fünf Sekunden</string>
|
||||
<string name="history">Gespeicherte Codes</string>
|
||||
<string name="preferences">Einstellungen</string>
|
||||
<string name="show_crop_handle">Bereich verkleinern anzeigen</string>
|
||||
<string name="zoom_by_swiping">Hoch/Runter streichen um zu zoomen</string>
|
||||
<string name="auto_rotate">Vertikale Erkennung von 1D Barcodes</string>
|
||||
<string name="try_harder">Suche länger und gründlicher nach Barcodes</string>
|
||||
<string name="scan_category">Scannen</string>
|
||||
<string name="content_category">Inhalt</string>
|
||||
<string name="locale_category">Sprache</string>
|
||||
<string name="custom_locale">Spracheinstellung</string>
|
||||
<string name="follow_system_settings">Systemeinstellung übernehmen</string>
|
||||
<string name="show_crop_handle">Ausschnitt verkleinern anzeigen</string>
|
||||
<string name="show_crop_handle_summary">Scannen auf einen anpassbaren Bereich einschränken.</string>
|
||||
<string name="barcode_formats">Barcode Formate</string>
|
||||
<string name="zoom_by_swiping">Geste für Kamerazoom</string>
|
||||
<string name="zoom_by_swiping_summary">Im Kamerabildschirm nach oben oder unten streichen, um den Kamerazoom zu steuern.</string>
|
||||
<string name="auto_rotate">Vertikale Erkennung</string>
|
||||
<string name="auto_rotate_summary">Das Kamerabild automatisch drehen um vertikale 1D Barcodes zu erkennen. Je nach Gerät kann dies die Leistung beeinträchtigen.</string>
|
||||
<string name="try_harder">Gründliche Suche</string>
|
||||
<string name="try_harder_summary">Aktivieren Sie diese Option für sehr schwer lesbare Codes. Beeinträchtigt die Leistung.</string>
|
||||
<string name="show_toast_in_bulk_mode">Daten einblenden</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Die gescannten Daten werden kurz eingeblenet, wenn fortlaufend gescannt wird.</string>
|
||||
<string name="vibrate">Bei Erkennung vibrieren</string>
|
||||
<string name="vibrate_summary">Das Gerät soll vibrieren wenn ein Code erkannt wird.</string>
|
||||
<string name="use_history">Codes speichern</string>
|
||||
<string name="ignore_consecutive_duplicates">Keine aufeinanderfolgenden Duplikate speichern</string>
|
||||
<string name="open_immediately">Inspektion überspringen und Inhalte sofort öffnen</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="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>
|
||||
<string name="copy_immediately_summary">Eingelesene Inhalte werden automatisch in die Zwischenablage kopiert. Bitte beachten Sie, dass andere Anwendungen die Zwischenablage im Hintergrund auslesen können.</string>
|
||||
<string name="show_meta_data">Meta Daten anzeigen</string>
|
||||
<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="close_automatically">Automatisch zurückkehren</string>
|
||||
<string name="close_automatically_summary">Nach dem Kopieren/Teilen automatisch zum Scanbildschirm zurückkehren.</string>
|
||||
<string name="default_search_engine">Unbekannte Daten öffnen mit</string>
|
||||
<string name="always_ask">Immer fragen</string>
|
||||
<string name="open_with_url">URL zum Öffnen unbekannter Daten</string>
|
||||
<string name="clear_network_suggestions">WiFi Netzwerkvorschläge entfernen</string>
|
||||
<string name="clear_network_suggestions_summary">Betrifft alle WiFi Netzwerke, die zuvor mit dieser App bereitgestellt wurden.</string>
|
||||
<string name="really_remove_all_networks">Alle Netzwerkvorschläge entfernen?</string>
|
||||
<string name="clear_network_suggestions_success">Netzwerkvorschläge entfernt</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nichts zu entfernen</string>
|
||||
<string name="send_category">Weiterleitung</string>
|
||||
<string name="send_scan_url">URL die für jeden Scan aufgerufen werden soll</string>
|
||||
<string name="send_scan_type">Typ des Requests für jeden Scan</string>
|
||||
<string name="send_type_get_add_content">GET mit an die URL angehängtem Inhalt</string>
|
||||
<string name="send_type_get_query_string">GET mit vollständigem 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="test_url">Test URL</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>
|
||||
@@ -84,18 +134,27 @@
|
||||
<string name="search_web">Suche im Internet</string>
|
||||
<string name="search_scan">Code suchen</string>
|
||||
<string name="export_to_file">In Datei exportieren</string>
|
||||
<string name="export_png">Als PNG exportieren</string>
|
||||
<string name="export_svg">Als SVG exportieren</string>
|
||||
<string name="export_as">Exportieren als?</string>
|
||||
<string name="export_csv_comma">CSV mit Kommas</string>
|
||||
<string name="export_csv_semicolon">CSV mit Semikolons</string>
|
||||
<string name="export_json">Als JSON exportieren</string>
|
||||
<string name="export_database">SQLite Datenbank exportieren</string>
|
||||
<string name="export_csv_comma">CSV Datei mit Kommas</string>
|
||||
<string name="export_csv_semicolon">CSV Datei mit Semikolons</string>
|
||||
<string name="export_json">JSON Datei</string>
|
||||
<string name="export_database">SQLite Datenbank</string>
|
||||
<string name="saved_in_downloads">In den Downloads gespeichert</string>
|
||||
<string name="rotate_image_cw">Bild im Uhrzeigersinn rotieren</string>
|
||||
<string name="pick_file">Bilddatei auswählen</string>
|
||||
<string name="pick_code_to_scan">Code im Bild auswählen</string>
|
||||
<string name="shortcut_decode">Barcode einlesen</string>
|
||||
<string name="shortcut_decode">Barcode lesen</string>
|
||||
<string name="shortcut_encode">Barcode erstellen</string>
|
||||
<string name="shortcut_preferences">Einstellungen</string>
|
||||
<string name="background_request_failed">Hintergrundanfrage fehlgeschlagen</string>
|
||||
<string name="entry_type">Typ</string>
|
||||
<string name="wifi_network">Wi-Fi Netzwerk</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentifizierungstyp</string>
|
||||
<string name="wifi_password">Passwort</string>
|
||||
<string name="wifi_hidden">Verstecktes Netzwerk</string>
|
||||
<string name="wifi_eap">EAP Methode</string>
|
||||
<string name="wifi_anonymous_identity">Anonyme Identität</string>
|
||||
<string name="wifi_identity">Identität</string>
|
||||
<string name="wifi_phase2">Phase 2 Methode</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,30 +1,36 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Esta aplicación no tendría sentido usar sin acceso a la cámara. Adiós.</string>
|
||||
<string name="camera_error">Sin acceso a la cámara, por favor, inténtelo de nuevo</string>
|
||||
<string name="no_camera_no_fun">Esta aplicación no tiene sentido usar sin acceso a la cámara. Adiós.</string>
|
||||
<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="decode_barcode">Decodificar código de barras</string>
|
||||
<string name="content">Contenido</string>
|
||||
<string name="binary_data">(binario)</string>
|
||||
<string name="binary_data">(datos binarios)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d caracter, %1$s</item>
|
||||
<item quantity="one">%2$d carácter, %1$s</item>
|
||||
<item quantity="other">%2$d caracteres, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Nivel de corrección de errores</string>
|
||||
<string name="error_correction_level_l" formatted="false">Bajo (~7% de correción)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medio (~15% de correción)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Cuartil (~25% de correción)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (~30% de correción)</string>
|
||||
<string name="issue_number">Número de emisión</string>
|
||||
<string name="orientation">Orientación</string>
|
||||
<string name="other_meta_data">Metadatos</string>
|
||||
<string name="pdf417_extra_metadata">Metadatos PDF417</string>
|
||||
<string name="possible_country">Posible país de fabricación</string>
|
||||
<string name="suggested_price">Precio sugerido</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="upc_ean_extension">Extensión UPC EAN</string>
|
||||
<string name="toggle_flash">Activar la linterna</string>
|
||||
<string name="share">Compartir</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>
|
||||
<string name="copy_password">Copiar contraseña al portapapeles</string>
|
||||
<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 esto</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="format">Formato</string>
|
||||
<string name="size">Tamaño en píxeles</string>
|
||||
@@ -32,28 +38,72 @@
|
||||
<string name="input_content_here">Introduzca el contenido aquí</string>
|
||||
<string name="encode">CODIFICAR</string>
|
||||
<string name="error_no_content">Contenido no disponible</string>
|
||||
<string name="error_encoding_barcode">No pudo generar el código de barras</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">Scan continuously</string>
|
||||
<string name="bulk_mode">Escanear constantemente</string>
|
||||
<string name="bulk_mode_summary">Siempre iniciar escaneando constantemente</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">Historial</string>
|
||||
<string name="preferences">Configuración</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Aumento de cámara al deslizar hacia arriba/abajo</string>
|
||||
<string name="scan_category">Escanear</string>
|
||||
<string name="content_category">Contenido</string>
|
||||
<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="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="try_harder">Optimizar el lector para la precisión, no la velocidad</string>
|
||||
<string name="vibrate">Vibración en la detección</string>
|
||||
<string name="use_history">Guardar historial de escaneados</string>
|
||||
<string name="ignore_consecutive_duplicates">No guardar duplicados consecutivos</string>
|
||||
<string name="open_immediately">Saltar la inspección y abrir el contenido inmediatamente</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="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="use_history">Guardar historial de escaneo</string>
|
||||
<string name="use_history_summary">Guardar códigos reconocidos en su dispositivo.</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="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="show_meta_data">Mostrar metadatos</string>
|
||||
<string name="show_hex_dump">Mostrar volcado hexagonal</string>
|
||||
<string name="open_with_url">Abrir datos desconocidos con URL</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="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="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="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_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>
|
||||
<string name="send_type_get_query_string">GET con consulta completa</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="test_url">URL de prueba</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 historial</string>
|
||||
<string name="clear_history">Borrar el historial</string>
|
||||
<string name="copy_scan">Copiar escaneo</string>
|
||||
<string name="edit_scan">Editar etiqueta</string>
|
||||
<string name="remove_scan">Borrar escaneo</string>
|
||||
@@ -67,35 +117,44 @@
|
||||
<string name="file_name">Nombre del archivo</string>
|
||||
<string name="error_saving_file">No se puede guardar el archivo</string>
|
||||
<string name="error_file_exists">El archivo ya existe</string>
|
||||
<string name="connect_to_wifi">Conectar a WiFi</string>
|
||||
<string name="wifi_config_failed">No se pudo configurar el WiFi</string>
|
||||
<string name="wifi_added">WiFi añadido</string>
|
||||
<string name="connect_to_wifi">Conectar al Wifi</string>
|
||||
<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="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>
|
||||
<string name="mail_error">No se pudo enviar correo</string>
|
||||
<string name="mail_error">No se pudo enviar el correo</string>
|
||||
<string name="vcard_add">Añadir a contactos</string>
|
||||
<string name="vcard_failed">No se pudo añadir a los contactos</string>
|
||||
<string name="vevent_add">Añadir se pudo calendario</string>
|
||||
<string name="vevent_add">Añadir al calendario</string>
|
||||
<string name="vevent_failed">No se pudo añadir al calendario</string>
|
||||
<string name="otpauth_add">Añadir 2FA</string>
|
||||
<string name="search_web">Buscar en la web</string>
|
||||
<string name="search_scan">Buscar escaneos</string>
|
||||
<string name="search_scan">Buscar escaneo</string>
|
||||
<string name="export_to_file">Exportar a archivo</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">¿Dónde desea exportar?</string>
|
||||
<string name="export_csv_comma">CSV con comas</string>
|
||||
<string name="export_csv_semicolon">CSV con punto y coma</string>
|
||||
<string name="export_json">Exportar como JSON</string>
|
||||
<string name="export_database">Exportar base de datos SQLite</string>
|
||||
<string name="export_as">¿Exportar como?</string>
|
||||
<string name="export_csv_comma">Archivo CSV con comas</string>
|
||||
<string name="export_csv_semicolon">Archivo CSV con punto y coma</string>
|
||||
<string name="export_json">Archivo JSON</string>
|
||||
<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 el sentido de las agujas del reloj</string>
|
||||
<string name="pick_file">Seleccionar archivo de imagen</string>
|
||||
<string name="pick_code_to_scan">Escoge el código para escanear</string>
|
||||
<string name="shortcut_decode">Escanear un código de barras</string>
|
||||
<string name="shortcut_encode">Crear un código de barras</string>
|
||||
<string name="rotate_image_cw">Rotar la imagen en sentido horario</string>
|
||||
<string name="pick_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_preferences">Ajustes</string>
|
||||
<string name="background_request_failed">Solicitud de fondo fallida</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,101 +1,161 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Cette application n\'a aucun sens sans accès possible à la caméra. Au revoir.</string>
|
||||
<string name="no_camera_no_fun">Cette application ne peut pas fonctionner sans accès à la caméra. Au revoir.</string>
|
||||
<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="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">(binary data)</string>
|
||||
<string name="binary_data">(données binaires)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d characters, %1$s</item>
|
||||
<item quantity="other">%2$d characters, %1$s</item>
|
||||
<item quantity="one">%2$d caractère, %1$s</item>
|
||||
<item quantity="other">%2$d caractères, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="error_correction_level">Niveau de correction d\'erreur</string>
|
||||
<string name="error_correction_level_l" formatted="false">Faible (~7% de correction)</string>
|
||||
<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="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientation</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Possible country of manufacture</string>
|
||||
<string name="suggested_price">Suggested price</string>
|
||||
<string name="other_meta_data">Métadonnées</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 métadonnées</string>
|
||||
<string name="possible_country">Pays de fabrication possible</string>
|
||||
<string name="suggested_price">Prix suggéré</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="toggle_flash">Toggle flash</string>
|
||||
<string name="share">Share</string>
|
||||
<string name="copy_to_clipboard">Copier dans le presse-papier</string>
|
||||
<string name="copied_to_clipboard">Mis dans le presse-papiers</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="toggle_flash">Activer le flash</string>
|
||||
<string name="share">Partager</string>
|
||||
<string name="share_as">Partager comme ?</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="cannot_resolve_action">Aucune application ne peut ouvrir ça</string>
|
||||
<string name="pick_search_engine">Pick a search engine</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">Entrez votre contenu ici</string>
|
||||
<string name="input_content_here">Votre contenu ici</string>
|
||||
<string name="encode">ENCODER</string>
|
||||
<string name="error_no_content">Contenu manquant</string>
|
||||
<string name="error_encoding_barcode">Barcode cannot be generated</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 continuously</string>
|
||||
<string name="bulk_mode">Scan continu</string>
|
||||
<string name="bulk_mode_summary">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">Historique</string>
|
||||
<string name="preferences">Preferences</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Zoom camera by swiping up/down</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Optimize reader for accuracy, not speed</string>
|
||||
<string name="vibrate">Vibrate on detection</string>
|
||||
<string name="use_history">Sauvegarder l\'histoire des scans</string>
|
||||
<string name="ignore_consecutive_duplicates">Do not save consecutive duplicates</string>
|
||||
<string name="open_immediately">Skip inspection and open contents immediately</string>
|
||||
<string name="show_meta_data">Show metadata</string>
|
||||
<string name="show_hex_dump">Show hex dump</string>
|
||||
<string name="open_with_url">Open unknown data with URL</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">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="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>
|
||||
<string name="preferences">Préférences</string>
|
||||
<string name="scan_category">Scan</string>
|
||||
<string name="content_category">Contenu</string>
|
||||
<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">Restreindre le scan à une région personnalisée.</string>
|
||||
<string name="barcode_formats">Barcode formats</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="auto_rotate">Reconnaître les codes-barres 1D verticaux</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="show_toast_in_bulk_mode">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</string>
|
||||
<string name="vibrate">Vibrer à la détection</string>
|
||||
<string name="vibrate_summary">Activez ceci si vous voulez que votre appareil vibre lorsqu’un code est reconnu.</string>
|
||||
<string name="use_history">Sauvegarder l\'historique des scans</string>
|
||||
<string name="use_history_summary">Sauvegarder les codes reconnus sur votre appareil.</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorer les doublons</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Ne pas sauvegarder les doublons dans l\'historique des scans.</string>
|
||||
<string name="open_immediately">Ouvrir immédiatement</string>
|
||||
<string name="open_immediately_summary">Sauter l\'inspection et ouvrir 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">Copier 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">Afficher 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 un dump hexadécimal 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="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">Ouvrir des données inconnues avec l’URL</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">Transfert</string>
|
||||
<string name="send_scan_url">Envoyer chaque scan vers une URL</string>
|
||||
<string name="send_scan_type">Type de requête pour chaque scan</string>
|
||||
<string name="send_type_get_add_content">GET et ajouter simplement le contenu</string>
|
||||
<string name="send_type_get_query_string">GET avec chaîne de requête complète</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="test_url">Tester l\'URL</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="copy_scan">Copier le scan</string>
|
||||
<string name="edit_scan">Éditer 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>
|
||||
<string name="no_barcode_found">Aucun code-barres trouvé</string>
|
||||
<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 in Downloads as file?</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="sms_send">Send SMS</string>
|
||||
<string name="sms_error">Could not send SMS</string>
|
||||
<string name="tel_dial">Dial number</string>
|
||||
<string name="tel_error">Could not dial number</string>
|
||||
<string name="mail_send">Send mail</string>
|
||||
<string name="mail_error">Could not send mail</string>
|
||||
<string name="vcard_add">Add to contacts</string>
|
||||
<string name="vcard_failed">Could not add to contacts</string>
|
||||
<string name="vevent_add">Add to calendar</string>
|
||||
<string name="vevent_failed">Could not add to calendar</string>
|
||||
<string name="otpauth_add">Add 2FA</string>
|
||||
<string name="search_web">Search the web</string>
|
||||
<string name="search_scan">Search scan</string>
|
||||
<string name="export_to_file">Export to file</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV with commas</string>
|
||||
<string name="export_csv_semicolon">CSV with semicolons</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">Export SQLite database</string>
|
||||
<string name="saved_in_downloads">Saved in downloads</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="pick_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_preferences">Settings</string>
|
||||
<string name="pick_list_separator">Comment séparer les éléments listés ?</string>
|
||||
<string name="separator_line_break">Saut de ligne</string>
|
||||
<string name="separator_ruler">Règle</string>
|
||||
<string name="save_as_file_name">Sauvegarder dans les Téléchargements ?</string>
|
||||
<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="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>
|
||||
<string name="tel_error">Impossible de composer le numéro</string>
|
||||
<string name="mail_send">Envoyer le mail</string>
|
||||
<string name="mail_error">Impossible d\'envoyer le mail</string>
|
||||
<string name="vcard_add">Ajouter aux contacts</string>
|
||||
<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="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="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_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="pick_file">Choisir un fichier image</string>
|
||||
<string name="pick_code_to_scan">Choisissez 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_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>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
|
||||
@@ -10,19 +10,25 @@
|
||||
<item quantity="one">%2$d karakter, %1$s</item>
|
||||
<item quantity="other">%2$d karakter, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientation</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Possible country of manufacture</string>
|
||||
<string name="suggested_price">Suggested price</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="error_correction_level">Hibajavítási szint</string>
|
||||
<string name="error_correction_level_l" formatted="false">Alacsony (~7% javítás)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Közepes (~15% javítás)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kvartilis (~25% javítás)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Magas (~30% javítás)</string>
|
||||
<string name="issue_number">Hibaszám</string>
|
||||
<string name="orientation">Tájolás</string>
|
||||
<string name="other_meta_data">Metaadat</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metaadat</string>
|
||||
<string name="possible_country">Gyártó lehetséges országa</string>
|
||||
<string name="suggested_price">Ajánlott ár</string>
|
||||
<string name="upc_ean_extension">UPC EAN kiterjesztés</string>
|
||||
<string name="toggle_flash">Vaku be- vagy kikapcsolása</string>
|
||||
<string name="share">Megosztás</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>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="copy_password">Jelszó másolása a vágólapra</string>
|
||||
<string name="copied_password_to_clipboard">Jelszó kimásolva a vágólapra</string>
|
||||
<string name="open_url">URL megnyitása</string>
|
||||
<string name="cannot_resolve_action">Nincs alkalmazás, amely meg tudná nyitni azt</string>
|
||||
<string name="pick_search_engine">Válasszon keresőmotort</string>
|
||||
@@ -36,29 +42,73 @@
|
||||
<string name="view_barcode">Vonalkód megtekintése</string>
|
||||
<string name="info">Információ</string>
|
||||
<string name="switch_camera">Kamera átkapcsolása</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="bulk_mode">Beolvasás folyamatosan</string>
|
||||
<string name="bulk_mode_summary">Mindig folyamatos beolvasást indítson.</string>
|
||||
<string name="bulk_mode_delay">Folyamatos beolvasások közti késleltetés</string>
|
||||
<string name="quarter_second">Negyed másodperc</string>
|
||||
<string name="half_second">Fél másodperc</string>
|
||||
<string name="a_second">Egy másodperc</string>
|
||||
<string name="two_seconds">Két másodperc</string>
|
||||
<string name="five_seconds">Öt másodperc</string>
|
||||
<string name="history">Előzmények</string>
|
||||
<string name="preferences">Beállítások</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Zoom camera by swiping up/down</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Optimize reader for accuracy, not speed</string>
|
||||
<string name="vibrate">Vibrate on detection</string>
|
||||
<string name="scan_category">Beolvasás</string>
|
||||
<string name="content_category">Tartalom</string>
|
||||
<string name="locale_category">Nyelv</string>
|
||||
<string name="custom_locale">Egyéni nyelv</string>
|
||||
<string name="follow_system_settings">Rendszerbeállítások követése</string>
|
||||
<string name="show_crop_handle">Levágási korlátozó megjelenítése</string>
|
||||
<string name="show_crop_handle_summary">Beolvasás korlátozása egy személyre szabható területre.</string>
|
||||
<string name="barcode_formats">Vonalkód formátumok</string>
|
||||
<string name="zoom_by_swiping">Kamera nagyítása fel/le pöccintéssel</string>
|
||||
<string name="zoom_by_swiping_summary">Pöccintsen fel vagy le a kamera képernyőjén a kamera nagyításának vezérléséhez.</string>
|
||||
<string name="auto_rotate">1D vonalkódok felismerése függőlegesen</string>
|
||||
<string name="auto_rotate_summary">A kamera keretének automatikus forgatása a függőleges 1D vonalkódok felismeréséhez. Az eszköztől függően ez hatással lehet a teljesítményre.</string>
|
||||
<string name="try_harder">Olvasó optimalizálása a pontossághoz a sebesség helyett</string>
|
||||
<string name="try_harder_summary">Nagyon nehezen olvasható kódoknál engedélyezze ezt a lehetőséget. Hatással lesz a teljesítményre.</string>
|
||||
<string name="show_toast_in_bulk_mode">Adatok megjelenítése folyamatos módban</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">A beolvasott adatok gyors megjelenítése folyamatos beolvasáskor.</string>
|
||||
<string name="vibrate">Rezgetés felismeréskor</string>
|
||||
<string name="vibrate_summary">Akkor engedélyezze ezt, ha rezgetni szeretné az eszközét egy kód felismerésekor.</string>
|
||||
<string name="use_history">Beolvasási előzmények mentése</string>
|
||||
<string name="ignore_consecutive_duplicates">Do not save consecutive duplicates</string>
|
||||
<string name="use_history_summary">Felismert kódok mentése a saját eszközén.</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="open_immediately">Vizsgálat kihagyása és a tartalom azonnali megnyitása</string>
|
||||
<string name="show_meta_data">Show metadata</string>
|
||||
<string name="show_hex_dump">Show hex dump</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>
|
||||
<string name="copy_immediately_summary">Beolvasott tartalom automatikus másolása a vágólapra. Ne feledje, hogy más alkalmazások megfigyelhetik a vágólapját a háttérben.</string>
|
||||
<string name="show_meta_data">Metaadatok megjelenítése</string>
|
||||
<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="close_automatically">Ugrás vissza másolás vagy megosztás után</string>
|
||||
<string name="close_automatically_summary">Automatikus visszatérés a beolvasási képernyőre a beolvasott tartalom másolása vagy megosztása után.</string>
|
||||
<string name="default_search_engine">Ismeretlen adatok megnyitása ebben</string>
|
||||
<string name="always_ask">Mindig kérdezzen</string>
|
||||
<string name="open_with_url">Ismeretlen adat megnyitása URL-lel</string>
|
||||
<string name="clear_network_suggestions">Hálózati javaslatok törlése</string>
|
||||
<string name="clear_network_suggestions_summary">Az alkalmazás által korábban biztosított összes hálózati javaslat eltávolítása.</string>
|
||||
<string name="really_remove_all_networks">Valóban eltávolítja az összes hálózatot?</string>
|
||||
<string name="clear_network_suggestions_success">Hálózati javaslatok törölve</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nincs mit eltávolítani</string>
|
||||
<string name="send_category">Továbbítás</string>
|
||||
<string name="send_scan_url">Összes beolvasás küldése egy URL-re</string>
|
||||
<string name="send_scan_type">Kérés típusa az egyes beolvasásoknál</string>
|
||||
<string name="send_type_get_add_content">GET és a tartalom egyszerű hozzáadása</string>
|
||||
<string name="send_type_get_query_string">GET a teljes lekérdezési karakterlánccal</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="test_url">Test URL</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">Really remove selected scans?</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">Copy scan</string>
|
||||
<string name="edit_scan">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>
|
||||
<string name="copy_scan">Beolvasás másolása</string>
|
||||
<string name="edit_scan">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>
|
||||
<string name="no_barcode_found">Nem található vonalkód</string>
|
||||
<string name="pick_list_separator">Hogyan kell elválasztani a listaelemeket?</string>
|
||||
<string name="separator_line_break">Sortörés</string>
|
||||
@@ -67,9 +117,9 @@
|
||||
<string name="file_name">Fájlnév</string>
|
||||
<string name="error_saving_file">Nem lehet elmenteni a fájlt</string>
|
||||
<string name="error_file_exists">A fájl már létezik</string>
|
||||
<string name="connect_to_wifi">Kapcsolódás WiFi-hez</string>
|
||||
<string name="wifi_config_failed">Nem sikerült beállítani a WiFi-t</string>
|
||||
<string name="wifi_added">WiFi hozzáadva</string>
|
||||
<string name="connect_to_wifi">Kapcsolódás Wi-Fi-hez</string>
|
||||
<string name="wifi_config_failed">Nem sikerült beállítani a Wi-Fi-t</string>
|
||||
<string name="wifi_added">Wi-Fi hozzáadva</string>
|
||||
<string name="sms_send">SMS küldése</string>
|
||||
<string name="sms_error">Nem sikerült elküldeni az SMS-t</string>
|
||||
<string name="tel_dial">Szám tárcsázása</string>
|
||||
@@ -82,20 +132,29 @@
|
||||
<string name="vevent_failed">Nem sikerült hozzáadni a naptárhoz</string>
|
||||
<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">Search scan</string>
|
||||
<string name="search_scan">Beolvasás keresése</string>
|
||||
<string name="export_to_file">Exportálás fájlba</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV with commas</string>
|
||||
<string name="export_csv_semicolon">CSV with semicolons</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">Export SQLite database</string>
|
||||
<string name="export_as">Exportálja másként?</string>
|
||||
<string name="export_csv_comma">CSV-fájl vesszővel</string>
|
||||
<string name="export_csv_semicolon">CSV-fájl pontosvesszővel</string>
|
||||
<string name="export_json">JSON-fájl</string>
|
||||
<string name="export_database">SQLite adatbázis</string>
|
||||
<string name="saved_in_downloads">Elmentve a letöltésekbe</string>
|
||||
<string name="rotate_image_cw">Kép forgatása jobbra</string>
|
||||
<string name="pick_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">Scan a barcode</string>
|
||||
<string name="shortcut_encode">Create a barcode</string>
|
||||
<string name="shortcut_preferences">Settings</string>
|
||||
<string name="shortcut_decode">Vonalkód beolvasása</string>
|
||||
<string name="shortcut_encode">Vonalkód létrehozása</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>
|
||||
<string name="wifi_network">Wi-Fi hálózat</string>
|
||||
<string name="wifi_ssid">Név</string>
|
||||
<string name="wifi_type">Hitelesítés típusa</string>
|
||||
<string name="wifi_password">Jelszó</string>
|
||||
<string name="wifi_hidden">Rejtett hálózat</string>
|
||||
<string name="wifi_eap">EAP módszer</string>
|
||||
<string name="wifi_anonymous_identity">Névtelen személyazonosság</string>
|
||||
<string name="wifi_identity">Személyazonosság</string>
|
||||
<string name="wifi_phase2">Phase 2 módszer</string>
|
||||
</resources>
|
||||
|
||||
@@ -10,18 +10,24 @@
|
||||
<item quantity="other">%1$s, %2$d karakter</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Level koreksi kesalahan</string>
|
||||
<string name="issue_number">Nomor pemindaian</string>
|
||||
<string name="error_correction_level_l" formatted="false">Rendah (~7% koreksi)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% koreksi)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kuartil (~25% koreksi)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Tinggi (~30% koreksi)</string>
|
||||
<string name="issue_number">Nomor pindaian</string>
|
||||
<string name="orientation">Orientasi</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">Metadata PDF417</string>
|
||||
<string name="possible_country">Kemungkinan negara pembuat</string>
|
||||
<string name="suggested_price">Harga yang disarankan</string>
|
||||
<string name="upc_ean_extension">Ekstensi UPC EAN</string>
|
||||
<string name="toggle_flash">Nyala/Matikan blitz</string>
|
||||
<string name="toggle_flash">Nyala/matikan blitz</string>
|
||||
<string name="share">Bagikan</string>
|
||||
<string name="copy_to_clipboard">Salin ke papan klip</string>
|
||||
<string name="copied_to_clipboard">Simpan ke papan klip</string>
|
||||
<string name="copied_password_to_clipboard">Sandi disalin ke papan klip</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>
|
||||
<string name="copy_password">Salin sandi ke clipboard</string>
|
||||
<string name="copied_password_to_clipboard">Sandi disalin ke clipboard</string>
|
||||
<string name="open_url">Buka url</string>
|
||||
<string name="cannot_resolve_action">Tidak ada aplikasi yang bisa membukanya</string>
|
||||
<string name="pick_search_engine">Pilih mesin pencari</string>
|
||||
@@ -35,34 +41,78 @@
|
||||
<string name="view_barcode">Lihat barcode</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="switch_camera">Ganti kamera</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="bulk_mode">Pindai tanpa henti</string>
|
||||
<string name="bulk_mode_summary">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">Riwayat</string>
|
||||
<string name="preferences">Preferensi</string>
|
||||
<string name="scan_category">Pemindaian</string>
|
||||
<string name="content_category">Konten</string>
|
||||
<string name="locale_category">Bahasa</string>
|
||||
<string name="custom_locale">Bahasa lainnya</string>
|
||||
<string name="follow_system_settings">Ikuti pengaturan sistem</string>
|
||||
<string name="show_crop_handle">Tampilkan pembatas pemotongan</string>
|
||||
<string name="zoom_by_swiping">Perbesar kamera dengan menggeser ke atas/bawah</string>
|
||||
<string name="auto_rotate">Kenali barcode 1D secara vertikal</string>
|
||||
<string name="try_harder">Optimalkan akurasi, bukan kecepatan</string>
|
||||
<string name="show_crop_handle_summary">Batasi pemindaian ke batas area tertentu.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="zoom_by_swiping">Geser ke atas/bawah untuk memperbesar</string>
|
||||
<string name="zoom_by_swiping_summary">Geser layar kamera ke atas atau ke bawah untuk mengontrol perbesaran gambar.</string>
|
||||
<string name="auto_rotate">Kenali barcode vertikal 1D</string>
|
||||
<string name="auto_rotate_summary">Otomatis putar frame kamera mengenali barcode vertikal 1D. Tergantung pada perangkat, mungkin akan berpengaruh pada performa.</string>
|
||||
<string name="try_harder">Optimalkan akurasi pembaca</string>
|
||||
<string name="try_harder_summary">Aktifkan opsi ini untuk kode yang susah dibaca. Akan berpengaruh pada performa.</string>
|
||||
<string name="show_toast_in_bulk_mode">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</string>
|
||||
<string name="vibrate">Bergetar saat mendeteksi</string>
|
||||
<string name="vibrate_summary">Aktifkan opsi ini jika anda ingin perangkat anda bergetar ketika kode berhasil dipindai.</string>
|
||||
<string name="use_history">Simpan riwayat pemindaian</string>
|
||||
<string name="ignore_consecutive_duplicates">Jangan simpan duplikat berturutan</string>
|
||||
<string name="open_immediately">Lewati inspeksi dan segera buka konten</string>
|
||||
<string name="use_history_summary">Simpan kode yang berhasil dipindai pada perangkat anda.</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="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>
|
||||
<string name="copy_immediately_summary">Otomatis menyalin konten yang dipindai ke dalam clipboard. Harap diingat bahwa apl lain bisa melihat isi dari clipboard anda di latar belakang.</string>
|
||||
<string name="show_meta_data">Tampilkan metadata</string>
|
||||
<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="close_automatically">Go back after Copy/Share</string>
|
||||
<string name="close_automatically_summary">Automatically return to the scan screen after copying or sharing the read contents.</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">Buka data tak dikenal dengan URL</string>
|
||||
<string name="really_remove_scan">Yakin menghapus pemindaian?</string>
|
||||
<string name="really_remove_all_scans">Yakin menghapus semua pemindaian?</string>
|
||||
<string name="really_remove_selected_scans">Yakin menghapus semua pemindaian?</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">Penerusan</string>
|
||||
<string name="send_scan_url">Kirim setiap pindaian ke URL</string>
|
||||
<string name="send_scan_type">Tipe permintaan untuk setiap pindaian</string>
|
||||
<string name="send_type_get_add_content">GET dan tambahkan konten</string>
|
||||
<string name="send_type_get_query_string">GET dengan kueri lema lengkap</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="test_url">Test URL</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 pemindaian</string>
|
||||
<string name="copy_scan">Salin pindaian</string>
|
||||
<string name="edit_scan">Sunting label</string>
|
||||
<string name="remove_scan">Buang pindaian</string>
|
||||
<string name="enter_name">Masukkan keterangan pemindaian</string>
|
||||
<string name="enter_name">Masukkan keterangan pindaian</string>
|
||||
<string name="enter_name_hint">Nama pindaian</string>
|
||||
<string name="no_barcode_found">Tidak ada barcode yang ditemukan</string>
|
||||
<string name="pick_list_separator">Pilih pemisah daftar item?</string>
|
||||
<string name="separator_line_break">Baris baru</string>
|
||||
<string name="separator_ruler">Penggaris</string>
|
||||
<string name="save_as_file_name">Simpan sebagai berkas?</string>
|
||||
<string name="save_as_file_name">Simpan sebagai berkas Unduhan?</string>
|
||||
<string name="file_name">Nama berkas</string>
|
||||
<string name="error_saving_file">Tidak bisa menyimpan berkas</string>
|
||||
<string name="error_file_exists">Berkas sudah ada</string>
|
||||
@@ -83,8 +133,6 @@
|
||||
<string name="search_web">Cari secara daring</string>
|
||||
<string name="search_scan">Cari pindaian</string>
|
||||
<string name="export_to_file">Ekspor ke berkas</string>
|
||||
<string name="export_png">Ekspor sebagai PNG</string>
|
||||
<string name="export_svg">Ekspor sebagai SVG</string>
|
||||
<string name="export_as">Ekspor sebagai?</string>
|
||||
<string name="export_csv_comma">CSV dengan koma</string>
|
||||
<string name="export_csv_semicolon">CSV dengan titik koma</string>
|
||||
@@ -97,4 +145,15 @@
|
||||
<string name="shortcut_decode">Pindai barcode</string>
|
||||
<string name="shortcut_encode">Buat barcode</string>
|
||||
<string name="shortcut_preferences">Pengaturan</string>
|
||||
<string name="background_request_failed">Permintaan latar belakang gagal</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
@@ -11,17 +11,23 @@
|
||||
<item quantity="other">%2$d caratteri, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Livello di correzione errori</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="issue_number">Numero di edizione</string>
|
||||
<string name="orientation">Orientamento</string>
|
||||
<string name="other_meta_data">Metadati</string>
|
||||
<string name="pdf417_extra_metadata">Metadati PDF417</string>
|
||||
<string name="possible_country">Probabile paese di fabbricazione</string>
|
||||
<string name="possible_country">Probabile Paese di fabbricazione</string>
|
||||
<string name="suggested_price">Prezzo consigliato</string>
|
||||
<string name="upc_ean_extension">Estensione UPC EAN</string>
|
||||
<string name="toggle_flash">Flash</string>
|
||||
<string name="share">Condividi</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="copy_to_clipboard">Copia negli appunti</string>
|
||||
<string name="copied_to_clipboard">Metti negli appunti</string>
|
||||
<string name="copied_to_clipboard">Copiato negli appunti</string>
|
||||
<string name="copy_password">Copia password negli appunti</string>
|
||||
<string name="copied_password_to_clipboard">Password copiata negli appunti</string>
|
||||
<string name="open_url">Apri URL</string>
|
||||
<string name="cannot_resolve_action">Nessuna app può aprirlo</string>
|
||||
@@ -36,25 +42,69 @@
|
||||
<string name="view_barcode">Vedi codice a barre</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="switch_camera">Cambia fotocamera</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="bulk_mode">Scansione continua</string>
|
||||
<string name="bulk_mode_summary">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">Cronologia</string>
|
||||
<string name="preferences">Preferenze</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="scan_category">Scansione</string>
|
||||
<string name="content_category">Contenuto</string>
|
||||
<string name="locale_category">Language</string>
|
||||
<string name="custom_locale">Custom language</string>
|
||||
<string name="follow_system_settings">Follow system settings</string>
|
||||
<string name="show_crop_handle">Mostra riquadro di limite</string>
|
||||
<string name="show_crop_handle_summary">Limita la scansione ad una regione personalizzata.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="zoom_by_swiping">Zoom fotocamera scorrendo su/giù</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="zoom_by_swiping_summary">Scorri su o giù per controllare lo zoom della fotocamera.</string>
|
||||
<string name="auto_rotate">Riconosci i codici a barre 1D verticalmente</string>
|
||||
<string name="auto_rotate_summary">Ruota automaticamente la fotocamera per riconoscere i codici a barre 1D verticali. In base al dispositivo, potrebbe ridurre le prestazioni.</string>
|
||||
<string name="try_harder">Ottimizza il lettore per accuratezza, non velocità</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">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</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="use_history">Salva cronologia delle scansioni</string>
|
||||
<string name="use_history_summary">Salva i codici riconosciuti sul dispositivo.</string>
|
||||
<string name="ignore_consecutive_duplicates">Non salvare doppi consecutivi</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Non salvare doppi consecutivi nella cronologia di scansione.</string>
|
||||
<string name="open_immediately">Salta l\'analisi e apri i contenuti direttamente</string>
|
||||
<string name="open_immediately_summary">Salta l\'analisi e apri i contenuti direttamente. Se attivo potrebbe 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">Mostra metadati</string>
|
||||
<string name="show_meta_data_summary">Mostra dati aggiuntivi sul codice a barre scansionato.</string>
|
||||
<string name="show_hex_dump">Mostra dump esadecimale</string>
|
||||
<string name="show_hex_dump_summary">Mostra un dump esadecimale dei contenuti scansionati.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<string name="close_automatically_summary">Automatically return to the scan screen after copying or sharing the read contents.</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">Apri dati sconosciuti con URL</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">Inoltro</string>
|
||||
<string name="send_scan_url">Invia ogni scansione ad un URL</string>
|
||||
<string name="send_scan_type">Tipo di richiesta per ogni scansione</string>
|
||||
<string name="send_type_get_add_content">GET e aggiungi il contenuto</string>
|
||||
<string name="send_type_get_query_string">GET con stringa completa della 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="test_url">Test URL</string>
|
||||
<string name="really_remove_scan">Vuoi veramente rimuovere la scansione?</string>
|
||||
<string name="really_remove_all_scans">Vuoi veramente rimuovere tutte le scansioni?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
<string name="really_remove_selected_scans">Vuoi veramente rimuovere le scansioni selezionate?</string>
|
||||
<string name="clear_history">Pulisci cronologia</string>
|
||||
<string name="copy_scan">Copy scan</string>
|
||||
<string name="copy_scan">Copia scansione</string>
|
||||
<string name="edit_scan">Modifica etichetta</string>
|
||||
<string name="remove_scan">Rimuovi scansione</string>
|
||||
<string name="enter_name">Inserisci un nome per descrivere la scansione</string>
|
||||
@@ -84,12 +134,10 @@
|
||||
<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_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</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">Export as JSON</string>
|
||||
<string name="export_json">Esporta come JSON</string>
|
||||
<string name="export_database">Esporta database SQLite</string>
|
||||
<string name="saved_in_downloads">Salvato nei download</string>
|
||||
<string name="rotate_image_cw">Ruota immagine in senso orario</string>
|
||||
@@ -98,4 +146,15 @@
|
||||
<string name="shortcut_decode">Scansiona un codice a barre</string>
|
||||
<string name="shortcut_encode">Crea un codice a barre</string>
|
||||
<string name="shortcut_preferences">Impostazioni</string>
|
||||
<string name="background_request_failed">Richiesta in secondo piano fallita</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">このアプリはカメラへのアクセス許可なしでは動作しません。終了します。</string>
|
||||
<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% の正確性)</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="issue_number">発行番号</string>
|
||||
<string name="orientation">方向</string>
|
||||
<string name="other_meta_data">メタデータ</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 メタデータ</string>
|
||||
<string name="possible_country">製造国</string>
|
||||
<string name="suggested_price">価格</string>
|
||||
<string name="upc_ean_extension">UPC/EAN 拡張型</string>
|
||||
<string name="toggle_flash">フラッシュを切り替え</string>
|
||||
<string name="share">共有</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">大きさ(ピクセル)</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="input_content_here">ここに内容を入力</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">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">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">縦向きの一次元バーコードを読み取る</string>
|
||||
<string name="auto_rotate_summary">自動的に画像を回転させ、縦方向の一次元バーコードを読み取れるようにします。端末によっては処理速度に影響が出る場合があります。</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="use_history">スキャン履歴を保存する</string>
|
||||
<string name="use_history_summary">認識されたバーコードを端末に保存しておきます。</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="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">16進数を表示</string>
|
||||
<string name="show_hex_dump_summary">スキャンされたコンテンツの16進数データを確認できるようにします。</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_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="test_url">URLをテスト</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="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">WiFiに接続</string>
|
||||
<string name="wifi_config_failed">WiFiに接続できませんでした</string>
|
||||
<string name="wifi_added">WiFiは登録されました</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">二段階認証を追加</string>
|
||||
<string name="search_web">ウェブで検索</string>
|
||||
<string name="search_scan">スキャン結果を検索</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="pick_file">画像を選択して読み込み</string>
|
||||
<string name="pick_code_to_scan">スキャンするバーコードを選択</string>
|
||||
<string name="shortcut_decode">バーコードをスキャン</string>
|
||||
<string name="shortcut_encode">バーコードを作成</string>
|
||||
<string name="shortcut_preferences">設定</string>
|
||||
<string name="background_request_failed">バックグラウンド要求に失敗しました</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,162 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">ამ აპლიკაციის გამოყენება შეუძლებელია კამერაზე ნებართვის მინიჭების გარეშე</string>
|
||||
<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="few">%2$d სიმბოლო, %1$s</item>
|
||||
<item quantity="many">%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">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="issue_number">გამოშვების ნომერი</string>
|
||||
<string name="orientation">ორიენტაცია</string>
|
||||
<string name="other_meta_data">მეტამონაცემები</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 მეტამონაცემები</string>
|
||||
<string name="possible_country">შესაძლო მწარმოებელი ქვეყანა</string>
|
||||
<string name="suggested_price">დაახლოებითი ფასი</string>
|
||||
<string name="upc_ean_extension">UPC EAN გაფართოება</string>
|
||||
<string name="toggle_flash">განათების ჩართვა</string>
|
||||
<string name="share">გაზიარება</string>
|
||||
<string name="share_as">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="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="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">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">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">Language</string>
|
||||
<string name="custom_locale">Custom language</string>
|
||||
<string name="follow_system_settings">Follow system settings</string>
|
||||
<string name="show_crop_handle">სკანირების არეალის ჩვენება</string>
|
||||
<string name="show_crop_handle_summary">სკანირების შეზღუდვა შერჩეული არეალით.</string>
|
||||
<string name="barcode_formats">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">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</string>
|
||||
<string name="vibrate">ვიბრირება პოვნისას</string>
|
||||
<string name="vibrate_summary">ჩართეთ ეს პარამეტრი, თუ გსურთ მოწყობილობის ვიბრირება,როდესაც შტრიხ-კოდი ამოცნობილი იქნება.</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="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">თექვსმეტობითი dump-ის ჩვენება</string>
|
||||
<string name="show_hex_dump_summary">სკანირებული შტრიხ-კოდის კონტენტის თექვსმეტობითი dump-ის ჩვენება.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<string name="close_automatically_summary">Automatically return to the scan screen after copying or sharing the read contents.</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">უცნობი მონაცემების ამ ბმულის საშუალებით გახსნა</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">გადაგზავნა</string>
|
||||
<string name="send_scan_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="test_url">Test URL</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="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">დაკავშირება WiFi-სთან</string>
|
||||
<string name="wifi_config_failed">WiFi კონფიგურაცია ვერ მოხერხდა</string>
|
||||
<string name="wifi_added">WiFi დამატებულია</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="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="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="pick_file">აირჩიეთ ფაილი გამოსახულებით</string>
|
||||
<string name="pick_code_to_scan">აირჩიეთ შტრიხ-კოდი სკანირებისთვის</string>
|
||||
<string name="shortcut_decode">შტრიხ-კოდის სკანირება</string>
|
||||
<string name="shortcut_encode">შტრიხ-კოდის შექმნა</string>
|
||||
<string name="shortcut_preferences">პარამეტრები</string>
|
||||
<string name="background_request_failed">ფონური მოთხოვნა ვერ მოხერხდა</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
@@ -1,101 +1,160 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Deze app kan niet werken zonder cameratoegang. Tot ziens.</string>
|
||||
<string name="camera_error">Kan camera niet openen; probeer het opnieuw.</string>
|
||||
<string name="camera_error">De camera kan niet worden geopend. Probeer het opnieuw.</string>
|
||||
<string name="scan_code">Scan een code</string>
|
||||
<string name="compose_barcode">Scan een barcode</string>
|
||||
<string name="decode_barcode">Barcode decoderen</string>
|
||||
<string name="content">Inhoud</string>
|
||||
<string name="binary_data">(binaire data)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d character, %1$s</item>
|
||||
<item quantity="other">%2$d characters, %1$s</item>
|
||||
<item quantity="one">%2$d teken, %1$s</item>
|
||||
<item quantity="other">%2$d tekens, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientation</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Possible country of manufacture</string>
|
||||
<string name="suggested_price">Suggested price</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="toggle_flash">Flitslicht schakelen</string>
|
||||
<string name="error_correction_level">Foutcorrectieniveau</string>
|
||||
<string name="error_correction_level_l" formatted="false">Laag (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Gemiddeld (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Hoger (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Hoog (~30% correction)</string>
|
||||
<string name="issue_number">Getal toekennen</string>
|
||||
<string name="orientation">Oriëntatie</string>
|
||||
<string name="other_meta_data">Metagegevens</string>
|
||||
<string name="pdf417_extra_metadata">PDF417-metagegevens</string>
|
||||
<string name="possible_country">Mogelijk land van herkomst</string>
|
||||
<string name="suggested_price">Adviesprijs</string>
|
||||
<string name="upc_ean_extension">UPC EAN-extensie</string>
|
||||
<string name="toggle_flash">Flits aan/uit</string>
|
||||
<string name="share">Delen</string>
|
||||
<string name="share_as">Delen als?</string>
|
||||
<string name="copy_to_clipboard">Kopiëren naar klembord</string>
|
||||
<string name="copied_to_clipboard">Kopieer de inhoud naar het klembord</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="copied_to_clipboard">De inhoud is gekopieerd naar het klembord</string>
|
||||
<string name="copy_password">Wachtwoord kopiëren naar klembord</string>
|
||||
<string name="copied_password_to_clipboard">Het wachtwoord is gekopieerd naar het klembord</string>
|
||||
<string name="open_url">URL openen</string>
|
||||
<string name="cannot_resolve_action">Er is geen app aangetroffen die dit kan openen</string>
|
||||
<string name="pick_search_engine">Een zoekmachine kiezen</string>
|
||||
<string name="pick_search_engine">Zoekmachine kiezen</string>
|
||||
<string name="format">Formaat</string>
|
||||
<string name="size">Grootte, in pixels</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="input_content_here">Voer hier de inhoud in</string>
|
||||
<string name="encode">CODEREN</string>
|
||||
<string name="error_no_content">Inhoud ontbreekt</string>
|
||||
<string name="error_encoding_barcode">Barcode kan niet gegenereerd worden</string>
|
||||
<string name="error_no_content">De inhoud ontbreekt</string>
|
||||
<string name="error_encoding_barcode">De barcode kan niet worden gegenereerd</string>
|
||||
<string name="view_barcode">Barcode bekijken</string>
|
||||
<string name="info">Informatie</string>
|
||||
<string name="switch_camera">Camera wisselen</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="switch_camera">Andere camera</string>
|
||||
<string name="bulk_mode">Continu scannen</string>
|
||||
<string name="bulk_mode_summary">Blijf continu scannen.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">Geschiedenis</string>
|
||||
<string name="preferences">Voorkeuren</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Zoom camera by swiping up/down</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Optimize reader for accuracy, not speed</string>
|
||||
<string name="vibrate">Vibrate on detection</string>
|
||||
<string name="use_history">Scan-geschiedenis behouden</string>
|
||||
<string name="ignore_consecutive_duplicates">Do not save consecutive duplicates</string>
|
||||
<string name="open_immediately">Skip inspection and open contents immediately</string>
|
||||
<string name="show_meta_data">Show metadata</string>
|
||||
<string name="show_hex_dump">Show hex dump</string>
|
||||
<string name="really_remove_scan">Scan echt verwijderen?</string>
|
||||
<string name="really_remove_all_scans">Echt alle scans verwijderen?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
<string name="preferences">Instellingen</string>
|
||||
<string name="scan_category">Scannen</string>
|
||||
<string name="content_category">Inhoud</string>
|
||||
<string name="locale_category">Taal</string>
|
||||
<string name="custom_locale">Andere taal</string>
|
||||
<string name="follow_system_settings">Systeeminstellingen gebruiken</string>
|
||||
<string name="show_crop_handle">Bijsnijdhulpmiddel tonen</string>
|
||||
<string name="show_crop_handle_summary">Beperk scannen tot een aanpasbaar gebied.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="zoom_by_swiping">Camera zoomen door omhoog/omlaag te vegen</string>
|
||||
<string name="zoom_by_swiping_summary">Veeg omhoog of omlaag op het camerascherm om in en uit te zoomen.</string>
|
||||
<string name="auto_rotate">1D-barcodes verticaal scannen</string>
|
||||
<string name="auto_rotate_summary">Draai de camera automatisch 1D-barcodes verticaal te scannen. Let op: dit kan van invloed zijn op de prestaties.</string>
|
||||
<string name="try_harder">Scanner optimaliseren voor juistheid i.p.v. snelheid</string>
|
||||
<string name="try_harder_summary">Schakel deze optie in voor moeilijk afleesbare codes. Let op: de prestaties leiden hieronder.</string>
|
||||
<string name="show_toast_in_bulk_mode">Data tonen in continumodus</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Toon de gescande data in continumodus.</string>
|
||||
<string name="vibrate">Trillen na herkennen</string>
|
||||
<string name="vibrate_summary">Schakel deze optie in als je wilt dat je apparaat trilt na het herkennen van een barcode.</string>
|
||||
<string name="use_history">Scangeschiedenis bewaren</string>
|
||||
<string name="use_history_summary">Bewaar herkende codes op je apparaat.</string>
|
||||
<string name="ignore_consecutive_duplicates">Opeenvolgende duplicaten niet bewaren</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Bewaar opeenvolgende duplicaten niet in de scangeschiedenis.</string>
|
||||
<string name="open_immediately">Inspectie overslaan en inhoud direct tonen</string>
|
||||
<string name="open_immediately_summary">Sla de inspectie over en open de inhoud direct. Let op: sommige inhoud kan schadelijk zijn.</string>
|
||||
<string name="copy_immediately">Inhoud automatisch kopiëren naar klembord</string>
|
||||
<string name="copy_immediately_summary">Kopieer de gescande inhoud automatisch naar het klembord. Let op: andere apps kunnen mogelijk meelezen op de achtergrond.</string>
|
||||
<string name="show_meta_data">Metagegevens tonen</string>
|
||||
<string name="show_meta_data_summary">Toon aanvullende gegevens over de gescande barcode.</string>
|
||||
<string name="show_hex_dump">Hexdump tonen</string>
|
||||
<string name="show_hex_dump_summary">Toon een hexdump van de gescande inhoud.</string>
|
||||
<string name="close_automatically">Terugkeren na kopiëren/delen</string>
|
||||
<string name="close_automatically_summary">Keer automatisch terug naar naar het scanscherm na het kopiëren/delen van een item.</string>
|
||||
<string name="really_remove_scan">Weet je zeker dat je de scan wilt verwijderen?</string>
|
||||
<string name="really_remove_all_scans">Weet je zeker dat je de scans wilt verwijderen?</string>
|
||||
<string name="really_remove_selected_scans">Weet je zeker dat je de selectie wilt verwijderen?</string>
|
||||
<string name="clear_history">Geschiedenis wissen</string>
|
||||
<string name="copy_scan">Copy scan</string>
|
||||
<string name="edit_scan">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>
|
||||
<string name="no_barcode_found">Geen barcode gevonden</string>
|
||||
<string name="copy_scan">Scan kopiëren</string>
|
||||
<string name="edit_scan">Label aanpassen</string>
|
||||
<string name="remove_scan">Scan verwijderen</string>
|
||||
<string name="enter_name">Geef de scan een naam</string>
|
||||
<string name="enter_name_hint">Naam</string>
|
||||
<string name="no_barcode_found">Geen barcode aangetroffen</string>
|
||||
<string name="separator_line_break">Nieuwe regel</string>
|
||||
<string name="separator_ruler">Horizontale streep</string>
|
||||
<string name="save_as_file_name">Als bestand opslaan?</string>
|
||||
<string name="file_name">Naam van het bestand</string>
|
||||
<string name="error_file_exists">Bestand bestaat al</string>
|
||||
<string name="connect_to_wifi">Met WiFi verbinden</string>
|
||||
<string name="wifi_config_failed">Kon WiFi niet configureren</string>
|
||||
<string name="wifi_added">WiFi toegevoegd</string>
|
||||
<string name="save_as_file_name">Opslaan als bestand?</string>
|
||||
<string name="file_name">Bestandsnaam</string>
|
||||
<string name="error_file_exists">Het bestand bestaat al</string>
|
||||
<string name="connect_to_wifi">Verbinden met wifi-netwerk</string>
|
||||
<string name="wifi_config_failed">Het wifi-netwerk kan niet worden ingesteld</string>
|
||||
<string name="wifi_added">Het wifi-netwerk is toegevoegd</string>
|
||||
<string name="sms_send">SMS versturen</string>
|
||||
<string name="sms_error">Kon SMS niet versturen</string>
|
||||
<string name="sms_error">De sms kan niet worden verstuurd</string>
|
||||
<string name="tel_dial">Nummer bellen</string>
|
||||
<string name="tel_error">Kon nummer niet bellen</string>
|
||||
<string name="mail_send">Mail versturen</string>
|
||||
<string name="mail_error">Kon mail niet versturen</string>
|
||||
<string name="vcard_add">Aan contacten toevoegen</string>
|
||||
<string name="vcard_failed">Kon niet aan contacten toevoegen</string>
|
||||
<string name="vevent_add">Aan kalender toevoegen</string>
|
||||
<string name="tel_error">Het nummer kan niet worden gebeld</string>
|
||||
<string name="mail_send">E-mail versturen</string>
|
||||
<string name="mail_error">De e-mail kan niet worden verstuurd</string>
|
||||
<string name="vcard_add">Toevoegen aan contactpersoon</string>
|
||||
<string name="vcard_failed">Het toevoegen is mislukt</string>
|
||||
<string name="vevent_add">Toevoegen aan kalender</string>
|
||||
<string name="otpauth_add">2FA toevoegen</string>
|
||||
<string name="search_web">Het net doorzoeken</string>
|
||||
<string name="search_scan">Search scan</string>
|
||||
<string name="export_to_file">Naar bestand exporteren</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV with commas</string>
|
||||
<string name="export_csv_semicolon">CSV with semicolons</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">Export SQLite database</string>
|
||||
<string name="error_saving_file">Kon bestand niet opslaan</string>
|
||||
<string name="open_with_url">Niet herkende data met URL openen</string>
|
||||
<string name="pick_list_separator">Hoe de lijstonderdelen te separeren?</string>
|
||||
<string name="saved_in_downloads">In downloads opgeslagen</string>
|
||||
<string name="vevent_failed">Kon niet aan kalender toevoegen</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="pick_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_preferences">Settings</string>
|
||||
<string name="search_web">Zoeken op internet</string>
|
||||
<string name="search_scan">Scan zoeken</string>
|
||||
<string name="export_to_file">Exporteren naar bestand</string>
|
||||
<string name="export_as">Exporteren als?</string>
|
||||
<string name="export_csv_comma">Kommagescheiden csv-bestand</string>
|
||||
<string name="export_csv_semicolon">Puntkommagescheiden csv-bestand</string>
|
||||
<string name="export_json">JSON-bestand</string>
|
||||
<string name="export_database">SQLite-databank</string>
|
||||
<string name="error_saving_file">Het bestand kan niet worden opgeslagen</string>
|
||||
<string name="default_search_engine">Onbekende data openen in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">Niet-herkende data met url openen</string>
|
||||
<string name="clear_network_suggestions">Netwerksuggesties wissen</string>
|
||||
<string name="clear_network_suggestions_summary">Wis alle eerder getoonde netwerksuggesties.</string>
|
||||
<string name="really_remove_all_networks">Weet je zeker dat je alle netwerken wilt verwijderen?</string>
|
||||
<string name="clear_network_suggestions_success">De netwersuggesties zijn gewist</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Er valt niks te wissen</string>
|
||||
<string name="send_category">Doorsturen</string>
|
||||
<string name="send_scan_url">Elke scan doorsturen naar url</string>
|
||||
<string name="send_scan_type">Soort verzoek van elke scan</string>
|
||||
<string name="send_type_get_add_content">GET met toegevoegde inhoud</string>
|
||||
<string name="send_type_get_query_string">GET met volledige opvraging</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="test_url">URL testen</string>
|
||||
<string name="pick_list_separator">Hoe moeten lijstonderdelen worden gescheiden?</string>
|
||||
<string name="saved_in_downloads">Opgeslagen in downloadmap</string>
|
||||
<string name="vevent_failed">Toevoegen mislukt</string>
|
||||
<string name="rotate_image_cw">Afbeelding rechtsom draaien</string>
|
||||
<string name="pick_file">Kies een afbeeldingsbestand</string>
|
||||
<string name="pick_code_to_scan">Kies de te scannen code</string>
|
||||
<string name="shortcut_decode">Barcode scannen</string>
|
||||
<string name="shortcut_encode">Barcode genereren</string>
|
||||
<string name="shortcut_preferences">Instellingen</string>
|
||||
<string name="background_request_failed">Het achtergrondverzoek is mislukt</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
@@ -8,14 +8,13 @@
|
||||
<string name="vevent_add">Dodaj do kalendarza</string>
|
||||
<string name="shortcut_preferences">Ustawienia</string>
|
||||
<string name="share">Udostępnij</string>
|
||||
<string name="share_as">Share as?</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="export_to_file">Eksportuj do pliku</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="file_name">Nazwa pliku</string>
|
||||
<string name="export_json">Eksportuj jako JSON</string>
|
||||
<string name="pick_search_engine">Wybierz wyszukiwarkę</string>
|
||||
@@ -27,6 +26,10 @@
|
||||
<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">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="export_csv_comma">CSV z przecinkami</string>
|
||||
<string name="export_csv_semicolon">CSV z średnikami</string>
|
||||
<string name="shortcut_encode">Stwórz kod kreskowy</string>
|
||||
@@ -53,12 +56,24 @@
|
||||
<string name="really_remove_selected_scans">Czy naprawdę usunąć wybrane skany?</string>
|
||||
<string name="binary_data">(dane binarne)</string>
|
||||
<string name="show_hex_dump">Pokazuj zrzut szesnastkowy</string>
|
||||
<string name="show_hex_dump_summary">Show a hex dump of the scanned contents.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<string name="close_automatically_summary">Automatically return to the scan screen after copying or sharing the read contents.</string>
|
||||
<string name="show_meta_data">Pokazuj metadane</string>
|
||||
<string name="show_meta_data_summary">Show additional data about the scanned barcoded.</string>
|
||||
<string name="switch_camera">Przełącz aparat</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="bulk_mode_summary">Always start scanning continuously.</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="toggle_flash">Przełącz lampę błyskową</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">Swipe up or down in camera screen to control the camera zoom.</string>
|
||||
<string name="view_barcode">Wyświetl kod kreskowy</string>
|
||||
<string name="orientation">Orientacja</string>
|
||||
<string name="error_encoding_barcode">Nie można utworzyć kodu kreskowego</string>
|
||||
@@ -68,30 +83,74 @@
|
||||
<string name="separator_line_break">Przerwanie linii</string>
|
||||
<string name="shortcut_decode">Zeskanuj kod kreskowy</string>
|
||||
<string name="use_history">Zapisuj historię skanowania</string>
|
||||
<string name="use_history_summary">Save recognized codes on your device.</string>
|
||||
<string name="vibrate">Wibruj po wykryciu</string>
|
||||
<string name="vibrate_summary">Enable this if you want your device to vibrate when a code is recognized.</string>
|
||||
<string name="open_immediately">Pomiń kontrolę i natychmiast otwórz zawartość</string>
|
||||
<string name="open_immediately_summary">Skip inspection and open contents immediately. May open harmful content if enabled.</string>
|
||||
<string name="copy_immediately">Automatically copy contents into clipboard</string>
|
||||
<string name="copy_immediately_summary">Automatically copy scanned contents into clipboard. Please note that other apps may snoop on your clipboard in the background.</string>
|
||||
<string name="show_crop_handle">Pokazuj ogranicznik przycinania</string>
|
||||
<string name="show_crop_handle_summary">Restrict scanning to a customizable region.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<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_consecutive_duplicates">Nie zapisuj kolejnych duplikatów</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Do not save consecutive duplicates in the scan history.</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">Otwieraj nieznane dane za pomocą adresu URL</string>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">Forwarding</string>
|
||||
<string name="send_scan_url">Send every scan to URL</string>
|
||||
<string name="send_scan_type">Type of request for every scan</string>
|
||||
<string name="send_type_get_add_content">GET and simply add content</string>
|
||||
<string name="send_type_get_query_string">GET with compelete 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="test_url">Test URL</string>
|
||||
<string name="copy_password">Copy password into clipboard</string>
|
||||
<string name="copied_password_to_clipboard">Hasło skopiowane do schowka</string>
|
||||
<string name="pdf417_extra_metadata">Metadane PDF417</string>
|
||||
<string name="suggested_price">Sugerowana cena</string>
|
||||
<string name="preferences">Ustawienia</string>
|
||||
<string name="scan_category">Scan</string>
|
||||
<string name="content_category">Content</string>
|
||||
<string name="locale_category">Language</string>
|
||||
<string name="custom_locale">Custom language</string>
|
||||
<string name="follow_system_settings">Follow system settings</string>
|
||||
<string name="decode_barcode">Dekoduj kod kreskowy</string>
|
||||
<string name="upc_ean_extension">Dodatek UPC EAN</string>
|
||||
<string name="possible_country">Możliwy kraj produkcji</string>
|
||||
<string name="encode">ZAKODUJ</string>
|
||||
<string name="error_no_content">Brak zawartości</string>
|
||||
<string name="try_harder">Zoptymalizuj czytnik pod kątem dokładności, a nie prędkości</string>
|
||||
<string name="try_harder_summary">Enable this option for very hard to read codes. Will affect performance.</string>
|
||||
<string name="show_toast_in_bulk_mode">Show data in continuous mode</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Briefly show the scanned data when scanning continuously.</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="input_content_here">Wprowadź zawartość tutaj</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>
|
||||
<string name="auto_rotate_summary">Automatically rotate the camera frame to recognize vertical 1D barcodes. Depending on the device, this may affect performance.</string>
|
||||
<string name="save_as_file_name">Jak zapisać plik w pobranych?</string>
|
||||
<string name="issue_number">Numer wydania</string>
|
||||
<string name="background_request_failed">Background request failed</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Esse aplicativo não faz sentido de uso sem acesso para a câmera. Adeus.</string>
|
||||
<string name="camera_error">Sem acesso a câmera, por favor tente novamente</string>
|
||||
<string name="scan_code">Escaneie o código de barras</string>
|
||||
<string name="compose_barcode">Compor código de barras</string>
|
||||
<string name="no_camera_no_fun">Não faz nenhum sentido usar este aplicativo sem acesso à câmera. Tchau.</string>
|
||||
<string name="camera_error">Não foi possível acessar a câmera, por favor tente novamente</string>
|
||||
<string name="scan_code">Escaneie código</string>
|
||||
<string name="compose_barcode">Criar código</string>
|
||||
<string name="decode_barcode">Decodificar código de barras</string>
|
||||
<string name="content">Conteúdo</string>
|
||||
<string name="binary_data">(binários)</string>
|
||||
@@ -10,62 +10,112 @@
|
||||
<item quantity="one">%2$d caractere, %1$s</item>
|
||||
<item quantity="other">%2$d caracteres, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientation</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Possible country of manufacture</string>
|
||||
<string name="suggested_price">Suggested price</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="error_correction_level">Nível de correção de erros</string>
|
||||
<string name="error_correction_level_l" formatted="false">Baixo (~7% correção)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Médio (~15% correção)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartil (~25% correção)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (~30% correção)</string>
|
||||
<string name="issue_number">Número de emissão</string>
|
||||
<string name="orientation">Orientação</string>
|
||||
<string name="other_meta_data">Metadados</string>
|
||||
<string name="pdf417_extra_metadata">Metadados PDF417</string>
|
||||
<string name="possible_country">Possível país de fabricação</string>
|
||||
<string name="suggested_price">Preço sugerido</string>
|
||||
<string name="upc_ean_extension">Extensão UPC EAN</string>
|
||||
<string name="toggle_flash">Ativar lanterna</string>
|
||||
<string name="share">Compartilhar</string>
|
||||
<string name="copy_to_clipboard">Copiar para área de transferência</string>
|
||||
<string name="copied_to_clipboard">Colocar na área de transferência</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="open_url">Abrir url</string>
|
||||
<string name="share_as">Compartilhar como?</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 URL</string>
|
||||
<string name="cannot_resolve_action">Nenhuma aplicativo pode abrir isso</string>
|
||||
<string name="pick_search_engine">Escolha um mecanismo de busca</string>
|
||||
<string name="format">Formatar</string>
|
||||
<string name="size">Tamanho em pixels</string>
|
||||
<string name="pick_search_engine">Escolha um site de busca</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="input_content_here">Insira o conteúdo aqui</string>
|
||||
<string name="input_content_here">Digite um conteúdo aqui</string>
|
||||
<string name="encode">CODIFICAR</string>
|
||||
<string name="error_no_content">Conteúdo não disponível</string>
|
||||
<string name="error_no_content">Conteúdo indisponível</string>
|
||||
<string name="error_encoding_barcode">Não foi possível gerar o código de barras</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">Scan continuously</string>
|
||||
<string name="switch_camera">Alterar câmera</string>
|
||||
<string name="bulk_mode">Escanear continuamente</string>
|
||||
<string name="bulk_mode_summary">Sempre comece em modo contínuo.</string>
|
||||
<string name="bulk_mode_delay">Atrasar em escaneamentos contínuos</string>
|
||||
<string name="quarter_second">Um quarto de segundo</string>
|
||||
<string name="half_second">Meio segundo</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="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Zoom camera by swiping up/down</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Optimize reader for accuracy, not speed</string>
|
||||
<string name="vibrate">Vibrate on detection</string>
|
||||
<string name="use_history">Salvar histórico de escaneamento</string>
|
||||
<string name="ignore_consecutive_duplicates">Do not save consecutive duplicates</string>
|
||||
<string name="open_immediately">Skip inspection and open contents immediately</string>
|
||||
<string name="show_meta_data">Show metadata</string>
|
||||
<string name="show_hex_dump">Show hex dump</string>
|
||||
<string name="scan_category">Escanear</string>
|
||||
<string name="content_category">Conteúdo</string>
|
||||
<string name="locale_category">Idioma</string>
|
||||
<string name="custom_locale">Idioma personalizado</string>
|
||||
<string name="follow_system_settings">Seguir configurações do sistema</string>
|
||||
<string name="show_crop_handle">Mostrar limitador de corte</string>
|
||||
<string name="show_crop_handle_summary">Restringir escaneamento a uma área personalizável.</string>
|
||||
<string name="barcode_formats">Formatos de código de barras</string>
|
||||
<string name="zoom_by_swiping">Deslize para baixo/cima para usar 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ódigo de barras 1D vertical</string>
|
||||
<string name="auto_rotate_summary">Girar automaticamente a posição da câmera para reconhecer código de barras 1D vertical. Dependendo do dispositivo, isto pode afetar o desempenho.</string>
|
||||
<string name="try_harder">Otimizar o leitor para precisão, não velocidade</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 escaneados durante escaneamento contínuo.</string>
|
||||
<string name="vibrate">Vibrar na detecção</string>
|
||||
<string name="vibrate_summary">Ative isto se quiser que seu dispositivo vibre quando um código for reconhecido.</string>
|
||||
<string name="use_history">Salvar histórico de escaneamentos</string>
|
||||
<string name="use_history_summary">Salve códigos reconhecidos em seu dispositivo.</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorar duplicatas consecutivas</string>
|
||||
<string name="ignore_consecutive_duplicates_summary">Não salvar duplicatas consecutivas no histórico de escaneamentos.</string>
|
||||
<string name="open_immediately">Abrir conteúdo imediatamente</string>
|
||||
<string name="open_immediately_summary">Pular a inspeção e abrir o conteúdo imediatamente. Pode abrir conteúdo nocivo, se ativado.</string>
|
||||
<string name="copy_immediately">Copiar ao Clipboard</string>
|
||||
<string name="copy_immediately_summary">Copiar automaticamente o conteúdo escaneado ao Clipboard. Observe que outros aplicativos podem examinar seu Clipboard em segundo plano.</string>
|
||||
<string name="show_meta_data">Mostrar metadados</string>
|
||||
<string name="show_meta_data_summary">Mostrar dados adicionais sobre o código de barras escaneado.</string>
|
||||
<string name="show_hex_dump">Mostrar impressão hexadecimal</string>
|
||||
<string name="show_hex_dump_summary">Mostrar uma impressão hexadecimal do conteúdo escaneado.</string>
|
||||
<string name="close_automatically">Voltar depois de Copiar/Compartilhar</string>
|
||||
<string name="close_automatically_summary">Voltar automaticamente à tela de digitalização após copiar ou compartilhar o conteúdo visualizado.</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 com URL</string>
|
||||
<string name="really_remove_scan">Realmente deseja remover o escaneamento?</string>
|
||||
<string name="really_remove_all_scans">Realmente deseja remover todos escaneamentos?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</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 fornecidas anteriormente por este aplicativo.</string>
|
||||
<string name="really_remove_all_networks">Realmente remover todas as redes?</string>
|
||||
<string name="clear_network_suggestions_success">Sugestões da rede removidas</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nada para remover</string>
|
||||
<string name="send_category">Encaminhar</string>
|
||||
<string name="send_scan_url">Enviar cada escaneamento para URL</string>
|
||||
<string name="send_scan_type">Tipo de pedido para cada escaneamento</string>
|
||||
<string name="send_type_get_add_content">GET e simplesmente adicionar conteúdo</string>
|
||||
<string name="send_type_get_query_string">GET com cadeia de consulta completa</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="test_url">Testar URL</string>
|
||||
<string name="really_remove_scan">Realmente quer remover o escaneamento?</string>
|
||||
<string name="really_remove_all_scans">Realmente quer remover todos os escaneamentos?</string>
|
||||
<string name="really_remove_selected_scans">Realmente remover escaneamentos selecionados?</string>
|
||||
<string name="clear_history">Limpar histórico</string>
|
||||
<string name="copy_scan">Copy scan</string>
|
||||
<string name="edit_scan">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>
|
||||
<string name="no_barcode_found">Código de barras não encontrado</string>
|
||||
<string name="copy_scan">Copiar escaneamento</string>
|
||||
<string name="edit_scan">Editar ID</string>
|
||||
<string name="remove_scan">Remover escaneamento</string>
|
||||
<string name="enter_name">Digite um nome para descrever o escaneamento</string>
|
||||
<string name="enter_name_hint">Nome do escaneamento</string>
|
||||
<string name="no_barcode_found">Nenhum código de barras encontrado</string>
|
||||
<string name="pick_list_separator">Como separar 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 como arquivo de imagem?</string>
|
||||
<string name="save_as_file_name">Salvar arquivo em Downloads?</string>
|
||||
<string name="file_name">Nome do arquivo</string>
|
||||
<string name="error_saving_file">Arquivo não pode ser salvo</string>
|
||||
<string name="error_saving_file">Não foi possível salvar o arquivo</string>
|
||||
<string name="error_file_exists">Arquivo já existe</string>
|
||||
<string name="connect_to_wifi">Conectar para o WiFi</string>
|
||||
<string name="wifi_config_failed">Não foi possível configurar o WiFi</string>
|
||||
@@ -77,25 +127,34 @@
|
||||
<string name="mail_send">Enviar e-mail</string>
|
||||
<string name="mail_error">Não foi possível enviar o e-mail</string>
|
||||
<string name="vcard_add">Adicionar para os contatos</string>
|
||||
<string name="vcard_failed">NNão foi possível adicionar para os contatos</string>
|
||||
<string name="vcard_failed">Não foi possível adicionar para os 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">Add 2FA</string>
|
||||
<string name="search_web">Search the web</string>
|
||||
<string name="search_scan">Search scan</string>
|
||||
<string name="export_to_file">Export to file</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV with commas</string>
|
||||
<string name="export_csv_semicolon">CSV with semicolons</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">Export SQLite database</string>
|
||||
<string name="saved_in_downloads">Saved in downloads</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="pick_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_preferences">Settings</string>
|
||||
<string name="otpauth_add">Adicionar 2FA</string>
|
||||
<string name="search_web">Pesquisar na internet</string>
|
||||
<string name="search_scan">Pesquisar em escaneamentos</string>
|
||||
<string name="export_to_file">Exportar para arquivo</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="rotate_image_cw">Girar a imagem no sentido horário</string>
|
||||
<string name="pick_file">Escolha um arquivo de imagem</string>
|
||||
<string name="pick_code_to_scan">Escolha o código para escanear</string>
|
||||
<string name="shortcut_decode">Escanear um código de barras</string>
|
||||
<string name="shortcut_encode">Criar um código</string>
|
||||
<string name="shortcut_preferences">Configurações</string>
|
||||
<string name="background_request_failed">A solicitação de segundo plano falhou</string>
|
||||
<string name="entry_type">Tipo</string>
|
||||
<string name="wifi_network">Rede Wi-Fi</string>
|
||||
<string name="wifi_ssid">Nome</string>
|
||||
<string name="wifi_type">Tipo de autenticação</string>
|
||||
<string name="wifi_password">Senha</string>
|
||||
<string name="wifi_hidden">Rede oculta</string>
|
||||
<string name="wifi_eap">Método EAP</string>
|
||||
<string name="wifi_anonymous_identity">Identidade anônima</string>
|
||||
<string name="wifi_identity">Identidade</string>
|
||||
<string name="wifi_phase2">Método Phase 2</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Это приложение не имеет никакого смысла без доступа к камере</string>
|
||||
<string name="camera_error">Не удается получить доступ к камере, пожалуйста, попробуйте еще раз</string>
|
||||
<string name="scan_code">Сканирование штрих-кода</string>
|
||||
<string name="compose_barcode">Создание штрих-кода</string>
|
||||
<string name="decode_barcode">Декодирование штрих-кода</string>
|
||||
<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">
|
||||
@@ -13,17 +13,23 @@
|
||||
<item quantity="other">%2$d символов, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Уровень коррекции ошибок</string>
|
||||
<string name="issue_number">Номер выпуская</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="issue_number">Номер выпуска</string>
|
||||
<string name="orientation">Ориентация</string>
|
||||
<string name="other_meta_data">Метаданные</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 метаданные</string>
|
||||
<string name="pdf417_extra_metadata">Метаданные PDF417</string>
|
||||
<string name="possible_country">Возможная страна изготовления</string>
|
||||
<string name="suggested_price">Предположительная цена</string>
|
||||
<string name="upc_ean_extension">UPC EAN расширение</string>
|
||||
<string name="upc_ean_extension">Расширение UPC EAN</string>
|
||||
<string name="toggle_flash">Включить вспышку</string>
|
||||
<string name="share">Поделиться</string>
|
||||
<string name="share_as">Поделиться как?</string>
|
||||
<string name="copy_to_clipboard">Скопировать в буфер обмена</string>
|
||||
<string name="copied_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>
|
||||
@@ -38,66 +44,119 @@
|
||||
<string name="view_barcode">Просмотр штрих-кода</string>
|
||||
<string name="info">Информация</string>
|
||||
<string name="switch_camera">Переключить камеру</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="bulk_mode">Непрерывное сканирование</string>
|
||||
<string name="bulk_mode_summary">Всегда запускать непрерывное сканирование.</string>
|
||||
<string name="bulk_mode_delay">Задержка непрерывного сканирования</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="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Масштабировать движением пальцем вверх/вниз</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Оптимизировать считывание на точность, а не скорость</string>
|
||||
<string name="vibrate">Вибрировать при обнаружении</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="use_history">Сохранять историю сканирования</string>
|
||||
<string name="ignore_consecutive_duplicates">Не сохранять последовательные дубликаты</string>
|
||||
<string name="open_immediately">Пропускать проверку и сразу открыть содержимое</string>
|
||||
<string name="use_history_summary">Сохранять распознанные штрих-коды на устройстве.</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="copy_immediately">Автокопирование в буфер обмена</string>
|
||||
<string name="copy_immediately_summary">Автоматически копировать содержимое считанного штрих-кода в буфер обмена. Имейте в виду, что другие приложения могут иметь доступ к буферу обмена в фоне.</string>
|
||||
<string name="show_meta_data">Показывать метаданные</string>
|
||||
<string name="show_hex_dump">Показать шестнадцатеричный дамп</string>
|
||||
<string name="open_with_url">Открыть неизвестные данные с помощью URL</string>
|
||||
<string name="really_remove_scan">Действительно удалить сканирование?</string>
|
||||
<string name="really_remove_all_scans">Действительно удалить все сканирования?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
<string name="show_meta_data_summary">Показывать дополнительную информацию о считанных штрих-кодах.</string>
|
||||
<string name="show_hex_dump">Показывать шестнадцатеричный дамп</string>
|
||||
<string name="show_hex_dump_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_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="test_url">Проверка URL</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">Copy scan</string>
|
||||
<string name="copy_scan">Копировать</string>
|
||||
<string name="edit_scan">Редактировать</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="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_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="sms_send">Отправить СМС</string>
|
||||
<string name="sms_error">Не удалось отправить СМС</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="tel_error">Невозможно набрать номер</string>
|
||||
<string name="mail_send">Отправить письмо</string>
|
||||
<string name="mail_error">Не удалось отправить почту</string>
|
||||
<string name="mail_error">Невозможно отправить почту</string>
|
||||
<string name="vcard_add">Добавить в контакты</string>
|
||||
<string name="vcard_failed">Не удалось добавить в контакты</string>
|
||||
<string name="vcard_failed">Невозможно добавить в контакты</string>
|
||||
<string name="vevent_add">Добавить в календарь</string>
|
||||
<string name="vevent_failed">Не удалось добавить в календарь</string>
|
||||
<string name="vevent_failed">Невозможно добавить в календарь</string>
|
||||
<string name="otpauth_add">Добавить 2FA</string>
|
||||
<string name="search_web">Искать в сети</string>
|
||||
<string name="search_web">Поиск в сети</string>
|
||||
<string name="search_scan">Поиск сканирования</string>
|
||||
<string name="export_to_file">Экспортировать в файл</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Формат экспортируемого файла</string>
|
||||
<string name="export_csv_comma">CSV (разделитель - запятая)</string>
|
||||
<string name="export_csv_semicolon">CSV (разделитель - точка с запятой)</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">SQLite база данных</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="pick_file">Выберите файл с изображением</string>
|
||||
<string name="pick_file">Открыть файл с изображением</string>
|
||||
<string name="pick_code_to_scan">Выберите штрих-код для сканирования</string>
|
||||
<string name="shortcut_decode">Сканировать штрих-код</string>
|
||||
<string name="shortcut_encode">Создать штрих-код</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">Двухэтапный метод</string>
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Bu uygulama kamera izni olmadan anlamsızdır. Güle güle.</string>
|
||||
<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="decode_barcode">Barkod çöz</string>
|
||||
<string name="content">İçerik</string>
|
||||
<string name="binary_data">(ikili veri)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d karakter, %1$s</item>
|
||||
<item quantity="other">%2$d karakter, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Hata düzeltme düzeyi</string>
|
||||
<string name="error_correction_level_l" formatted="false">Düşük (~%7 düzeltim)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Orta (~%15 düzeltim)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Dörtte Bir (~%25 düzeltim)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Yüksek (~%30 düzeltim)</string>
|
||||
<string name="issue_number">Basım sayısı</string>
|
||||
<string name="orientation">Yönelim</string>
|
||||
<string name="other_meta_data">Üst veri</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 üst verisi</string>
|
||||
<string name="possible_country">Olası üretim yeri</string>
|
||||
<string name="suggested_price">Önerilen fiyat</string>
|
||||
<string name="upc_ean_extension">UPC EAN eklentisi</string>
|
||||
<string name="toggle_flash">Flaşı aç</string>
|
||||
<string name="share">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>
|
||||
<string name="copy_password">Parolayı panoya kopyala</string>
|
||||
<string name="copied_password_to_clipboard">Parola panoya kopyalandı</string>
|
||||
<string name="open_url">URL\'yi aç</string>
|
||||
<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="input_content_here">İçeriği buraya gir</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="view_barcode">Barkodu gör</string>
|
||||
<string name="info">Bilgi</string>
|
||||
<string name="switch_camera">Kamerayı değiştir</string>
|
||||
<string name="bulk_mode">Sürekli tara</string>
|
||||
<string name="bulk_mode_summary">Her zaman sürekli taramaya başla.</string>
|
||||
<string name="bulk_mode_delay">Sürekli taramalar arasındaki gecikme</string>
|
||||
<string name="quarter_second">Çeyrek saniye</string>
|
||||
<string name="half_second">Yarım saniye</string>
|
||||
<string name="a_second">Bir saniye</string>
|
||||
<string name="two_seconds">İki saniye</string>
|
||||
<string name="five_seconds">Beş saniye</string>
|
||||
<string name="history">Geçmiş</string>
|
||||
<string name="preferences">Tercihler</string>
|
||||
<string name="scan_category">Tarama</string>
|
||||
<string name="content_category">İçerik</string>
|
||||
<string name="locale_category">Dil</string>
|
||||
<string name="custom_locale">Özel yerel</string>
|
||||
<string name="follow_system_settings">Sistem ayarlarını izle</string>
|
||||
<string name="show_crop_handle">Kırpım kısıtlayıcıyı göster</string>
|
||||
<string name="show_crop_handle_summary">Taramayı özelleştirilebilir bölgeyle sınırla.</string>
|
||||
<string name="barcode_formats">Barkod biçimleri</string>
|
||||
<string name="zoom_by_swiping">Aşağı/yukarı kaydırarak yakınlaştır</string>
|
||||
<string name="zoom_by_swiping_summary">Kamera yakınlığını denetlemek için kamera ekranında aşağı veya yukarı kaydır.</string>
|
||||
<string name="auto_rotate">Yatay 1B barkodları tanı</string>
|
||||
<string name="auto_rotate_summary">Yatay 1B barkodları tanımak için kamera çerçevesini kendiliğinden döndür. Bu, aygıta bağlı olarak performansı etkileyebilir.</string>
|
||||
<string name="try_harder">Kesinlik için okuyucuyu iyileştir</string>
|
||||
<string name="try_harder_summary">Okuması zor barkodlar için bu seçeneği etkinleştirin. Performansı etkileyecektir.</string>
|
||||
<string name="show_toast_in_bulk_mode">Sürekli kipte verileri göster</string>
|
||||
<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="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_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="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>
|
||||
<string name="copy_immediately_summary">Taranan içerikleri kendiliğinden panoya kopyala. Unutmayın ki, diğer uygulamalar arka planda panonuzu gözetleyebilir.</string>
|
||||
<string name="show_meta_data">Üst veriyi göster</string>
|
||||
<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="close_automatically">Kopyala/Paylaş\'tan sonra geri dön</string>
|
||||
<string name="close_automatically_summary">Okunan içeriği kopyaladıktan veya paylaştıktan sonra kendiliğinden tarama ekranına dön.</string>
|
||||
<string name="default_search_engine">Bilinmeyen verileri şurada aç</string>
|
||||
<string name="always_ask">Her zaman sor</string>
|
||||
<string name="open_with_url">URL\'si olan bilinmeyen veriyi aç</string>
|
||||
<string name="clear_network_suggestions">Ağ önerilerini temizle</string>
|
||||
<string name="clear_network_suggestions_summary">Bu uygulama tarafından daha önce sağlanan tüm ağ önerilerini kaldır.</string>
|
||||
<string name="really_remove_all_networks">Tüm ağlar gerçekten kaldırılsın mı?</string>
|
||||
<string name="clear_network_suggestions_success">Ağ önerileri temizlendi</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Kaldırılacak bir şey yok</string>
|
||||
<string name="send_category">Yönlendirme</string>
|
||||
<string name="send_scan_url">Her taramayı URL\'ye gönder</string>
|
||||
<string name="send_scan_type">Her tarama için isteğin türü</string>
|
||||
<string name="send_type_get_add_content">GET ve basitçe içeriği ekle</string>
|
||||
<string name="send_type_get_query_string">GET ile tam sorgu dizgesi</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="test_url">URL\'yi sına</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="remove_scan">Taramayı sil</string>
|
||||
<string name="enter_name">Taramayı açıklayacak ad gir</string>
|
||||
<string name="enter_name_hint">Taramanın adı</string>
|
||||
<string name="no_barcode_found">Barkod bulunamadı</string>
|
||||
<string name="pick_list_separator">Liste ögeleri nasıl ayrılsın?</string>
|
||||
<string name="separator_line_break">Satır kesmesi</string>
|
||||
<string name="separator_ruler">Çizgi</string>
|
||||
<string name="save_as_file_name">Hangi adla İndirilenler\'e kaydedilsin?</string>
|
||||
<string name="file_name">Dosya adı</string>
|
||||
<string name="error_saving_file">Dosya kaydedilemedi</string>
|
||||
<string name="error_file_exists">Dosya zaten var</string>
|
||||
<string name="connect_to_wifi">WiFi\'ye bağlan</string>
|
||||
<string name="wifi_config_failed">WiFi yapılandırılamadı</string>
|
||||
<string name="wifi_added">WiFi eklendi</string>
|
||||
<string name="sms_send">SMS gönder</string>
|
||||
<string name="sms_error">SMS gönderilemedi</string>
|
||||
<string name="tel_dial">Numarayı çevir</string>
|
||||
<string name="tel_error">Numara çevrilemedi</string>
|
||||
<string name="mail_send">Posta gönder</string>
|
||||
<string name="mail_error">Posta gönderilemedi</string>
|
||||
<string name="vcard_add">Kişilere ekle</string>
|
||||
<string name="vcard_failed">Kişilere eklenemedi</string>
|
||||
<string name="vevent_add">Takvime ekle</string>
|
||||
<string name="vevent_failed">Takvime eklenemedi</string>
|
||||
<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="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>
|
||||
<string name="export_csv_semicolon">Noktalı virgüller ile CSV</string>
|
||||
<string name="export_json">JSON olarak dışa aktar</string>
|
||||
<string name="export_database">SQLite veri tabanı olarak dışa aktar</string>
|
||||
<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="pick_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_preferences">Ayarlar</string>
|
||||
<string name="background_request_failed">Arka plan isteği başarısız</string>
|
||||
<string name="entry_type">Tür</string>
|
||||
<string name="wifi_network">Wi-Fi ağı</string>
|
||||
<string name="wifi_ssid">Ad</string>
|
||||
<string name="wifi_type">Kimlik doğrulama türü</string>
|
||||
<string name="wifi_password">Parola</string>
|
||||
<string name="wifi_hidden">Gizli ağ</string>
|
||||
<string name="wifi_eap">EAP yöntemi</string>
|
||||
<string name="wifi_anonymous_identity">Anonim kimlik</string>
|
||||
<string name="wifi_identity">Kimlik</string>
|
||||
<string name="wifi_phase2">2. aşama yöntemi</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,161 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Ця програма немає сенсу без доступу до камери. До побачення.</string>
|
||||
<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="few">%2$d символи, %1$s</item>
|
||||
<item quantity="many">%2$d символів, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Рівень виправлення помилок</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="issue_number">Номер випуску</string>
|
||||
<string name="orientation">Орієнтація</string>
|
||||
<string name="other_meta_data">Метадані</string>
|
||||
<string name="pdf417_extra_metadata">Метадані PDF417</string>
|
||||
<string name="possible_country">Можлива країна-виробник</string>
|
||||
<string name="suggested_price">Рекомендована ціна</string>
|
||||
<string name="upc_ean_extension">Розширення UPC EAN</string>
|
||||
<string name="toggle_flash">Увімкнути спалах</string>
|
||||
<string name="share">Поділитися</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">Жод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="input_content_here">Введіть вміст сюди</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="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="use_history">Зберігати історію сканування</string>
|
||||
<string name="use_history_summary">Збережіть розпізнані коди на своєму пристрої.</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="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="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_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="test_url">Перевірити URL</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="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">Підключитися до WiFi</string>
|
||||
<string name="wifi_config_failed">Не вдалося налаштувати WiFi</string>
|
||||
<string name="wifi_added">WiFi додано</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="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="pick_file">Вибрати файл зображення</string>
|
||||
<string name="pick_code_to_scan">Вибрати код для сканування</string>
|
||||
<string name="shortcut_decode">Сканувати штрих-код</string>
|
||||
<string name="shortcut_encode">Створити штрих-код</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">Phase 2 метод</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,11 @@
|
||||
<resources>
|
||||
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
|
||||
<item name="colorPrimary">@color/primary</item>
|
||||
<item name="colorPrimaryDark">@android:color/transparent</item>
|
||||
<item name="colorAccent">@color/accent</item>
|
||||
<item name="android:windowBackground">@drawable/background_window</item>
|
||||
<item name="windowActionModeOverlay">true</item>
|
||||
<item name="actionModeBackground">@color/accent</item>
|
||||
<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -1,7 +1,5 @@
|
||||
<resources>
|
||||
<style
|
||||
name="Button"
|
||||
parent="@android:style/Widget.Button">
|
||||
<style name="Button" parent="@android:style/Widget.Button">
|
||||
<item name="android:layout_width">wrap_content</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:background">@drawable/button_raised</item>
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">Ứng dụng này không hoạt động nếu không có camera. Tạm biệt.</string>
|
||||
<string name="camera_error">Không thể mở camera, hãy thử lại</string>
|
||||
<string name="scan_code">Quét mã</string>
|
||||
<string name="compose_barcode">Tạo mã vạch</string>
|
||||
<string name="decode_barcode">Giải mã vạch</string>
|
||||
<string name="content">Nội dung</string>
|
||||
<string name="binary_data">(thông tin dạng nhị phân)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d ký tự, %1$s</item>
|
||||
<item quantity="other">%2$d ký tự, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Mức độ tự sửa mã</string>
|
||||
<string name="error_correction_level_l" formatted="false">Thấp (sửa ~7%)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Trung bình (sửa ~15%)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Một phần tư (sửa ~25%)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Cao (sửa ~30%)</string>
|
||||
<string name="issue_number">Số</string>
|
||||
<string name="orientation">Hướng</string>
|
||||
<string name="other_meta_data">Dữ liệu</string>
|
||||
<string name="pdf417_extra_metadata">Dữ liệu PDF417</string>
|
||||
<string name="possible_country">Có thể được sản xuất ở nước</string>
|
||||
<string name="suggested_price">Giá được gợi ý</string>
|
||||
<string name="upc_ean_extension">Phần mở rộng UPC EAN</string>
|
||||
<string name="toggle_flash">Bật/tắt đèn</string>
|
||||
<string name="share">Chia sẻ</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>
|
||||
<string name="copy_password">Sao chép mật khẩu</string>
|
||||
<string name="copied_password_to_clipboard">Đã sao chép mật khẩu</string>
|
||||
<string name="open_url">Mở đường dẫn</string>
|
||||
<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="input_content_here">Nhập nội dung vào đây</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>
|
||||
<string name="view_barcode">Xem mã vạch</string>
|
||||
<string name="info">Thông tin</string>
|
||||
<string name="switch_camera">Đổi camera</string>
|
||||
<string name="bulk_mode">Quét liên tục</string>
|
||||
<string name="bulk_mode_summary">Luôn quét liên tục.</string>
|
||||
<string name="bulk_mode_delay">Thời gian giữa các lần quét</string>
|
||||
<string name="quarter_second">Một phần tư giây</string>
|
||||
<string name="half_second">Nửa giây</string>
|
||||
<string name="a_second">Một giây</string>
|
||||
<string name="two_seconds">Hai giây</string>
|
||||
<string name="five_seconds">Năm giây</string>
|
||||
<string name="history">Lịch sử</string>
|
||||
<string name="preferences">Tuỳ chọn</string>
|
||||
<string name="scan_category">Quét</string>
|
||||
<string name="content_category">Nội dung</string>
|
||||
<string name="locale_category">Ngôn ngữ</string>
|
||||
<string name="custom_locale">Tùy chọn ngôn ngữ</string>
|
||||
<string name="follow_system_settings">Theo cài đặt của máy</string>
|
||||
<string name="show_crop_handle">Hiện giới hạn cắt hình</string>
|
||||
<string name="show_crop_handle_summary">Giới hạn vùng quét.</string>
|
||||
<string name="barcode_formats">Các định dạng mã vạch</string>
|
||||
<string name="zoom_by_swiping">Vuốt lên/xuống để phóng to/thu nhỏ</string>
|
||||
<string name="zoom_by_swiping_summary">Vuốt lên/xuống ở màn hình camera để điều chỉnh độ phóng.</string>
|
||||
<string name="auto_rotate">Nhận diện mã vạch đứng một chiều</string>
|
||||
<string name="auto_rotate_summary">Tự động xoay khung camera để nhận diện mã vạch đứng một chiều. Tùy theo máy, cài đặt này có thể ảnh hưởng đến tốc độ xử lý.</string>
|
||||
<string name="try_harder">Tối ưu hoá độ chính xác</string>
|
||||
<string name="try_harder_summary">Kích hoạt tùy chọn này đối với mã rất khó đọc. Có thể ảnh hưởng đến tốc độ xử lý.</string>
|
||||
<string name="show_toast_in_bulk_mode">Hiện dữ liệ liên tục</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Hiện nhanh dữ liệu trong khi quét liên tục.</string>
|
||||
<string name="vibrate">Rung khi xác định được mã</string>
|
||||
<string name="vibrate_summary">Kích hoạt nếu bạn muốn máy của bạn rung khi nhận dạng được mã.</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_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="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>
|
||||
<string name="copy_immediately_summary">Tự động sao chép kết quả. Lưu ý: ứng dụng khác có thể xem nội dung bạn đã sao chép.</string>
|
||||
<string name="show_meta_data">Hiện dữ liệu</string>
|
||||
<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="close_automatically">Quay lại sau khi Sao chép/Chia sẻ</string>
|
||||
<string name="close_automatically_summary">Tự động quay trở về màn hình quét sao khi sao chép hoặc chia sẻ nội dung đọc được.</string>
|
||||
<string name="default_search_engine">Mở dữ liệu không xác định bằng</string>
|
||||
<string name="always_ask">Luôn hỏi</string>
|
||||
<string name="open_with_url">Mở dữ liệu không xác định với URL</string>
|
||||
<string name="clear_network_suggestions">Xoá gợi ý mạng</string>
|
||||
<string name="clear_network_suggestions_summary">Xoá tất cả trang mạng được gợi ý bởi ứng dụng này.</string>
|
||||
<string name="really_remove_all_networks">Thật sự xoá tất cả trang mạng?</string>
|
||||
<string name="clear_network_suggestions_success">Gợi ý mạng đã xoá</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Không còn gì để xoá</string>
|
||||
<string name="send_category">Chuyển tới</string>
|
||||
<string name="send_scan_url">Gửi tất cả mã quét được đến URL</string>
|
||||
<string name="send_scan_type">Kiểu yêu cầu đối với mỗi lần quét</string>
|
||||
<string name="send_type_get_add_content">GET và chỉ thêm nội dung</string>
|
||||
<string name="send_type_get_query_string">GET với xâu truy vấn đầy đủ</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="test_url">URL thử</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="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>
|
||||
<string name="no_barcode_found">Không tìm thấy mã vạch</string>
|
||||
<string name="pick_list_separator">Phân chia các mục như thế nào?</string>
|
||||
<string name="separator_line_break">Ngắt dòng</string>
|
||||
<string name="separator_ruler">Đường kẻ</string>
|
||||
<string name="save_as_file_name">Lưu vào Downloads?</string>
|
||||
<string name="file_name">Tên tệp</string>
|
||||
<string name="error_saving_file">Không thể lưu tệp</string>
|
||||
<string name="error_file_exists">Tệp đã tồn tại</string>
|
||||
<string name="connect_to_wifi">Kết nối WiFi</string>
|
||||
<string name="wifi_config_failed">Không thể thiết lập WiFi</string>
|
||||
<string name="wifi_added">Đã thêm WiFi</string>
|
||||
<string name="sms_send">Gửi tin nhắn SMS</string>
|
||||
<string name="sms_error">Không thể gửi tin nhắn SMS</string>
|
||||
<string name="tel_dial">Gọi theo số này</string>
|
||||
<string name="tel_error">Không thể gọi số này</string>
|
||||
<string name="mail_send">Gửi mail</string>
|
||||
<string name="mail_error">Không thể gửi mail</string>
|
||||
<string name="vcard_add">Thêm vào danh bạ</string>
|
||||
<string name="vcard_failed">Không thể thêm vào danh bạ</string>
|
||||
<string name="vevent_add">Thêm vào lịch</string>
|
||||
<string name="vevent_failed">Không thể thêm vào lịch</string>
|
||||
<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="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>
|
||||
<string name="export_csv_semicolon">Tệp CSV với dấu chấm phẩy</string>
|
||||
<string name="export_json">Tệp JSON</string>
|
||||
<string name="export_database">Cơ sở dữ liệu SQLite</string>
|
||||
<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="pick_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_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>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
@@ -1,27 +1,33 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">没有给我相机权限,扫个锤子。再见!</string>
|
||||
<string name="no_camera_no_fun">没给我相机权限,不给你扫了,哼!</string>
|
||||
<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>
|
||||
<string name="binary_data">(二进制数据)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="other">%2$d 字符, %1$s</item>
|
||||
<item quantity="other">%2$d 字符, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientation</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Possible country of manufacture</string>
|
||||
<string name="suggested_price">Suggested price</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="error_correction_level">纠错级别</string>
|
||||
<string name="error_correction_level_l" formatted="false">低 (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">中 (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">高 (~30% correction)</string>
|
||||
<string name="issue_number">发行编号</string>
|
||||
<string name="orientation">方向</string>
|
||||
<string name="other_meta_data">元数据</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 元数据</string>
|
||||
<string name="possible_country">可能产地</string>
|
||||
<string name="suggested_price">隐含价格</string>
|
||||
<string name="upc_ean_extension">UPC EAN 扩展</string>
|
||||
<string name="toggle_flash">开关闪光灯</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="copy_to_clipboard">复制到剪切板</string>
|
||||
<string name="copied_to_clipboard">复制到剪切板</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</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">没有相关APP可以打开它</string>
|
||||
<string name="pick_search_engine">选择一个搜索引擎</string>
|
||||
@@ -33,36 +39,80 @@
|
||||
<string name="error_no_content">缺少内容</string>
|
||||
<string name="error_encoding_barcode">无法生成条形码</string>
|
||||
<string name="view_barcode">查看条形码</string>
|
||||
<string name="info">信息</string>
|
||||
<string name="info">关于</string>
|
||||
<string name="switch_camera">切换摄像头</string>
|
||||
<string name="bulk_mode">Scan continuously</string>
|
||||
<string name="bulk_mode">连续扫描</string>
|
||||
<string name="bulk_mode_summary">始终开启连续扫描</string>
|
||||
<string name="bulk_mode_delay">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">Five seconds</string>
|
||||
<string name="history">历史</string>
|
||||
<string name="preferences">首选项</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Zoom camera by swiping up/down</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Optimize reader for accuracy, not speed</string>
|
||||
<string name="vibrate">Vibrate on detection</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">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="use_history">保存扫描历史</string>
|
||||
<string name="ignore_consecutive_duplicates">Do not save consecutive duplicates</string>
|
||||
<string name="open_immediately">跳过内容展示并立即打开</string>
|
||||
<string name="show_meta_data">Show metadata</string>
|
||||
<string name="show_hex_dump">Show hex dump</string>
|
||||
<string name="use_history_summary">在本地保存扫描历史</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="copy_immediately">自动复制扫描结果到剪贴板</string>
|
||||
<string name="copy_immediately_summary">注意其他APP可能会在后台监控剪贴板</string>
|
||||
<string name="show_meta_data">显示元数据</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="close_automatically">复制/分享后自动返回</string>
|
||||
<string name="close_automatically_summary">复制或分享读取的内容后自动返回扫描主界面。</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="open_with_url">使用URL打开未知数据</string>
|
||||
<string name="really_remove_scan">确定删除记录?</string>
|
||||
<string name="really_remove_all_scans">确定删除全部记录?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
<string name="clear_history">删除记录</string>
|
||||
<string name="copy_scan">Copy scan</string>
|
||||
<string name="edit_scan">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>
|
||||
<string name="clear_network_suggestions">Clear network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove all of the network suggestions that were previously provided by this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="clear_network_suggestions_success">Network suggestions cleared</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nothing to remove</string>
|
||||
<string name="send_category">转发</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="test_url">测试 URL</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="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="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>
|
||||
@@ -81,20 +131,29 @@
|
||||
<string name="vevent_failed">无法添加到日历</string>
|
||||
<string name="otpauth_add">添加两步验证</string>
|
||||
<string name="search_web">在互联网中搜索</string>
|
||||
<string name="search_scan">Search scan</string>
|
||||
<string name="export_to_file">导出为CSV文件</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV with commas</string>
|
||||
<string name="export_csv_semicolon">CSV with semicolons</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">Export SQLite database</string>
|
||||
<string name="search_scan">搜索扫描记录</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="pick_file">选择图片文件</string>
|
||||
<string name="pick_code_to_scan">选择扫描的编码</string>
|
||||
<string name="shortcut_decode">Scan a barcode</string>
|
||||
<string name="shortcut_encode">Create a barcode</string>
|
||||
<string name="shortcut_preferences">Settings</string>
|
||||
<string name="pick_code_to_scan">选择扫描编码</string>
|
||||
<string name="shortcut_decode">扫描条形码</string>
|
||||
<string name="shortcut_encode">创建条形码</string>
|
||||
<string name="shortcut_preferences">设置</string>
|
||||
<string name="background_request_failed">后台请求失败</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">沒有相機權限的話,這個程式根本什麽都做不了。 再見!</string>
|
||||
<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">(2 進制碼)</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% 準確度)</string>
|
||||
<string name="error_correction_level_m" formatted="false">中 (~15% 準確度)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% 準確度)</string>
|
||||
<string name="error_correction_level_h" formatted="false">高 (~30% 準確度)</string>
|
||||
<string name="issue_number">發行編號</string>
|
||||
<string name="orientation">方向</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">製作國家</string>
|
||||
<string name="suggested_price">建議價格</string>
|
||||
<string name="upc_ean_extension">UPC EAN 擴充</string>
|
||||
<string name="toggle_flash">開關閃光燈</string>
|
||||
<string name="share">分享</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="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="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">Delay between continuous scans</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
<string name="two_seconds">Two seconds</string>
|
||||
<string name="five_seconds">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">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="use_history">儲存掃描記錄</string>
|
||||
<string name="use_history_summary">在本機儲存掃描記錄</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="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="show_hex_dump">顯示 Hex dump</string>
|
||||
<string name="show_hex_dump_summary">顯示已掃描條碼的 Hex dump</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_success">網路建議已清除</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">沒有什麼可以移除的</string>
|
||||
<string name="send_category">轉發</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="test_url">測試 URL</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="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">連線到 WiFi</string>
|
||||
<string name="wifi_config_failed">無法配置 WiFi</string>
|
||||
<string name="wifi_added">WiFi 已加入</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="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="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="pick_file">選擇圖片檔案</string>
|
||||
<string name="pick_code_to_scan">選擇掃描編碼</string>
|
||||
<string name="shortcut_decode">掃描條碼</string>
|
||||
<string name="shortcut_encode">建立條碼</string>
|
||||
<string name="shortcut_preferences">設定</string>
|
||||
<string name="background_request_failed">背景請求失敗</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<string name="wifi_network">Wi-Fi network</string>
|
||||
<string name="wifi_ssid">Name</string>
|
||||
<string name="wifi_type">Authentication type</string>
|
||||
<string name="wifi_password">Password</string>
|
||||
<string name="wifi_hidden">Hidden network</string>
|
||||
<string name="wifi_eap">EAP method</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
</resources>
|
||||
@@ -1,100 +0,0 @@
|
||||
<resources>
|
||||
<string name="no_camera_no_fun">沒有相機權限的話,這個程式根本什麽都做不了。再見!</string>
|
||||
<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">(2進制碼)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="other">%2$d 個字符, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="issue_number">Issue number</string>
|
||||
<string name="orientation">Orientation</string>
|
||||
<string name="other_meta_data">Metadata</string>
|
||||
<string name="pdf417_extra_metadata">PDF417 metadata</string>
|
||||
<string name="possible_country">Possible country of manufacture</string>
|
||||
<string name="suggested_price">Suggested price</string>
|
||||
<string name="upc_ean_extension">UPC EAN extension</string>
|
||||
<string name="toggle_flash">閃光燈</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="copy_to_clipboard">複製</string>
|
||||
<string name="copied_to_clipboard">複製</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="open_url">開啓</string>
|
||||
<string name="cannot_resolve_action">無應用程式可以開啓</string>
|
||||
<string name="pick_search_engine">選擇搜尋引擎</string>
|
||||
<string name="format">格式</string>
|
||||
<string name="size">大小(pixels)</string>
|
||||
<string name="width_by_height">%1$d×%2$d</string>
|
||||
<string name="input_content_here">在此輸入</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">Scan continuously</string>
|
||||
<string name="history">歷史</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="zoom_by_swiping">Zoom camera by swiping up/down</string>
|
||||
<string name="auto_rotate">Recognize 1D barcodes vertically</string>
|
||||
<string name="try_harder">Optimize reader for accuracy, not speed</string>
|
||||
<string name="vibrate">Vibrate on detection</string>
|
||||
<string name="use_history">儲存掃描歷史</string>
|
||||
<string name="ignore_consecutive_duplicates">Do not save consecutive duplicates</string>
|
||||
<string name="open_immediately">Skip inspection and open contents immediately</string>
|
||||
<string name="show_meta_data">Show metadata</string>
|
||||
<string name="show_hex_dump">Show hex dump</string>
|
||||
<string name="really_remove_scan">真的要移除掃描記錄?</string>
|
||||
<string name="really_remove_all_scans">真的要移除所有掃描記錄?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
<string name="clear_history">清除記錄</string>
|
||||
<string name="copy_scan">Copy scan</string>
|
||||
<string name="edit_scan">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>
|
||||
<string name="no_barcode_found">找不到條碼</string>
|
||||
<string name="pick_list_separator">如何分開列表項目?</string>
|
||||
<string name="separator_line_break">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">連接至 WiFi</string>
|
||||
<string name="wifi_config_failed">WiFi連接設定失敗</string>
|
||||
<string name="wifi_added">成功添加WiFi</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="preferences">Preferences</string>
|
||||
<string name="open_with_url">Preferences</string>
|
||||
<string name="otpauth_add">Add 2FA</string>
|
||||
<string name="search_web">Search the web</string>
|
||||
<string name="search_scan">Search scan</string>
|
||||
<string name="export_to_file">Export to file</string>
|
||||
<string name="export_png">Export as PNG</string>
|
||||
<string name="export_svg">Export as SVG</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV with commas</string>
|
||||
<string name="export_csv_semicolon">CSV with semicolons</string>
|
||||
<string name="export_json">Export as JSON</string>
|
||||
<string name="export_database">Export SQLite database</string>
|
||||
<string name="saved_in_downloads">Saved in downloads</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="pick_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_preferences">Settings</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,40 @@
|
||||
<resources>
|
||||
<string-array name="barcode_formats_names">
|
||||
<item>AZTEC</item>
|
||||
<item>CODABAR</item>
|
||||
<item>CODE 39</item>
|
||||
<item>CODE 93</item>
|
||||
<item>CODE 128</item>
|
||||
<item>DATA MATRIX</item>
|
||||
<item>EAN 8</item>
|
||||
<item>EAN 13</item>
|
||||
<item>ITF</item>
|
||||
<item>MAXICODE</item>
|
||||
<item>PDF 417</item>
|
||||
<item>QR CODE</item>
|
||||
<item>RSS 14</item>
|
||||
<item>RSS EXPANDED</item>
|
||||
<item>UPC A</item>
|
||||
<item>UPC E</item>
|
||||
<item>UPC EAN EXTENSION</item>
|
||||
</string-array>
|
||||
<string-array name="barcode_formats_values">
|
||||
<item>AZTEC</item>
|
||||
<item>CODABAR</item>
|
||||
<item>CODE_39</item>
|
||||
<item>CODE_93</item>
|
||||
<item>CODE_128</item>
|
||||
<item>DATA_MATRIX</item>
|
||||
<item>EAN_8</item>
|
||||
<item>EAN_13</item>
|
||||
<item>ITF</item>
|
||||
<item>MAXICODE</item>
|
||||
<item>PDF_417</item>
|
||||
<item>QR_CODE</item>
|
||||
<item>RSS_14</item>
|
||||
<item>RSS_EXPANDED</item>
|
||||
<item>UPC_A</item>
|
||||
<item>UPC_E</item>
|
||||
<item>UPC_EAN_EXTENSION</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
@@ -0,0 +1,16 @@
|
||||
<resources>
|
||||
<string-array name="bulk_mode_delays_names">
|
||||
<item>@string/quarter_second</item>
|
||||
<item>@string/half_second</item>
|
||||
<item>@string/a_second</item>
|
||||
<item>@string/two_seconds</item>
|
||||
<item>@string/five_seconds</item>
|
||||
</string-array>
|
||||
<string-array name="bulk_mode_delays_values">
|
||||
<item>250</item>
|
||||
<item>500</item>
|
||||
<item>1000</item>
|
||||
<item>2000</item>
|
||||
<item>5000</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
@@ -1,5 +1,6 @@
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">Binary Eye</string>
|
||||
<string name="open_with_url_hint" translatable="false">http://example.com?data=</string>
|
||||
<string name="url_hint" translatable="false">http://example.com/</string>
|
||||
<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>
|
||||
</resources>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user