Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2de40d2277 | ||
|
|
7673b7cb0d | ||
|
|
097c5e4453 | ||
|
|
1fab30089e | ||
|
|
f9bf16dd47 | ||
|
|
7a59126312 | ||
|
|
694c854650 | ||
|
|
b1cd12ec77 | ||
|
|
0c27b15025 | ||
|
|
5de950bdbf | ||
|
|
ae9e304ef6 | ||
|
|
c4cc14554b | ||
|
|
d6afccf562 | ||
|
|
a90bdad117 | ||
|
|
52d4f082f2 | ||
|
|
1c63f5b3ac | ||
|
|
21985b4533 | ||
|
|
012ac644aa | ||
|
|
19f19739fd | ||
|
|
f01f9fcd91 | ||
|
|
4177b248c3 | ||
|
|
e4182a265b | ||
|
|
98df5a447c | ||
|
|
a0a1405359 | ||
|
|
76922c421c | ||
|
|
cac9dd16da | ||
|
|
a1f9ba1056 | ||
|
|
0b67c272b6 | ||
|
|
9b8be5305d | ||
|
|
a026ade13b | ||
|
|
b1771bc5ea | ||
|
|
5199460669 | ||
|
|
fd040e1660 | ||
|
|
2e1528364e | ||
|
|
d21af142bb | ||
|
|
8395e135f9 | ||
|
|
c0caa0ce44 | ||
|
|
96927ef9b2 | ||
|
|
84d9a3b55a | ||
|
|
ffe8e4c5ba | ||
|
|
bc7c5dca97 | ||
|
|
d9737f4df1 | ||
|
|
0e8147713a | ||
|
|
3d425a097a | ||
|
|
c26765cc63 | ||
|
|
fb6dc8ba55 | ||
|
|
70f4d166a0 | ||
|
|
6c136ce719 | ||
|
|
c6dee80c0a | ||
|
|
1f43dd4827 | ||
|
|
a366157977 | ||
|
|
6bb72672a3 | ||
|
|
04774527a0 | ||
|
|
6f3e644aa8 | ||
|
|
5e3176b703 | ||
|
|
0f0aaff284 | ||
|
|
f0d09e81b4 | ||
|
|
771258cb5c | ||
|
|
9482086666 | ||
|
|
bcad50c3e8 | ||
|
|
dbd055699e | ||
|
|
d67f8273d6 | ||
|
|
649be0ceb6 | ||
|
|
f5eb5dd8d2 | ||
|
|
eb805dad2f | ||
|
|
202bb32b29 | ||
|
|
50b8a4d329 | ||
|
|
fa15478fb4 | ||
|
|
20c2a5a8aa | ||
|
|
00b95678ed | ||
|
|
5df3517563 | ||
|
|
fd6946d2c2 | ||
|
|
c74d229e1f | ||
|
|
fa99a19db5 | ||
|
|
b083fcf213 | ||
|
|
46930ddea6 | ||
|
|
7bef77b96e | ||
|
|
c5f4c088b4 | ||
|
|
73f7210e18 | ||
|
|
469429e663 | ||
|
|
1a7ac59740 | ||
|
|
c13c59e728 | ||
|
|
bc17e25717 | ||
|
|
5017bd4c8d | ||
|
|
a44a913eca | ||
|
|
007e83e243 | ||
|
|
de8f97c246 | ||
|
|
1287591e53 | ||
|
|
8c17238572 | ||
|
|
5dbb36e6a9 | ||
|
|
ca7dfb3a33 | ||
|
|
419b7d5765 | ||
|
|
fa38866669 | ||
|
|
19ca521f59 | ||
|
|
be657d86cf | ||
|
|
5199a4a526 | ||
|
|
ff48a543c9 | ||
|
|
2eadd01a87 | ||
|
|
dd2abe7d89 | ||
|
|
8e05caac70 | ||
|
|
46aeced09f | ||
|
|
3681c5d011 | ||
|
|
20b4f7aac5 | ||
|
|
bc6e350271 | ||
|
|
c9c1b2f5bf | ||
|
|
1dbc0f0fa1 | ||
|
|
ab8170ee72 | ||
|
|
551464dc6f | ||
|
|
c3aac0a1e1 | ||
|
|
d678e1cfd0 | ||
|
|
a445ade877 | ||
|
|
1fd0b7637f | ||
|
|
fdc88df897 | ||
|
|
d0f133ae00 | ||
|
|
67646261e7 | ||
|
|
faeae9e904 | ||
|
|
77b21a9e83 | ||
|
|
cbe7860a3d | ||
|
|
fc29267d3d | ||
|
|
890506328b | ||
|
|
04036b6cd6 | ||
|
|
2602021c1c | ||
|
|
17a0bdc0a9 | ||
|
|
d71a220eca | ||
|
|
0c2e711d79 | ||
|
|
ca342a83d3 | ||
|
|
3c44ff56eb | ||
|
|
bcae64c0d0 | ||
|
|
c2f673729b | ||
|
|
2043e0f349 | ||
|
|
b93eb5963e | ||
|
|
5189fc9c5a | ||
|
|
2d311ff92a | ||
|
|
14bb08003d |
@@ -1,5 +1,69 @@
|
||||
# Change Log
|
||||
|
||||
## 1.68.3
|
||||
* Stability improvement
|
||||
|
||||
## 1.68.2
|
||||
* Fix barcode regeneration
|
||||
|
||||
## 1.68.1
|
||||
* Improve UI of search barcode dialog
|
||||
* Stability improvements
|
||||
* Update ZXingCpp
|
||||
* Update Russian translation
|
||||
|
||||
## 1.68.0
|
||||
* Add automated actions
|
||||
* Improve managing profiles
|
||||
|
||||
## 1.67.1
|
||||
* Fix opening file:// Uris
|
||||
* Fix auto-return/immediate opening
|
||||
* Improve Bluetooth stability
|
||||
|
||||
## 1.67.0
|
||||
* Add preference profiles
|
||||
* Support regex when searching for a barcode
|
||||
* Improve feedback when searching for a barcode
|
||||
* Update translations
|
||||
|
||||
## 1.66.2
|
||||
* Remove forcing `?content=` on forwarding URL
|
||||
* Update Spanish translation
|
||||
|
||||
## 1.66.1
|
||||
* Show elements of invalid Wifi configurations too
|
||||
* Update translations
|
||||
|
||||
## 1.66.0
|
||||
* Support deep links to encode content via web links
|
||||
* Parse International Driver Licenses (IDL) in PDF417 barcodes
|
||||
* Add WiFis from system settings
|
||||
* Show parsed data items
|
||||
* Update translations
|
||||
|
||||
## 1.65.2
|
||||
* Sanity check ROI metrics
|
||||
|
||||
## 1.65.1
|
||||
* Improve simple mode
|
||||
* Remember quiet zone settings
|
||||
* Reduce height for 1D barcodes
|
||||
* Add execute argument for binaryeye://encode
|
||||
* Update Russian translation
|
||||
|
||||
## 1.65.0
|
||||
* Add a welcome screen to choose a mode
|
||||
* Add a deep link to encode a barcode
|
||||
* Remember zoom level of generated barcodes
|
||||
* Remove Human Readable Interpretation (HRI) decoration
|
||||
* Update Italian translation
|
||||
|
||||
## 1.64.2
|
||||
* Separate crop window settings for image scanning
|
||||
* Fix initializing dataMask
|
||||
* Update Russian translation
|
||||
|
||||
## 1.64.1
|
||||
* Handle empty input for recreation
|
||||
* Fix setting up database
|
||||
|
||||
@@ -28,6 +28,26 @@ testscan:
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'binaryeye://scan/?ret=http%3A%2F%2Fmarkusfisch.de%2F%3Fresult%3D{RESULT}'
|
||||
|
||||
testencode:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'binaryeye://encode?content=Test\&format=QR_CODE'
|
||||
|
||||
testencodenotqr:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'binaryeye://encode?content=Test\&format=DATA_MATRIX'
|
||||
|
||||
testencodeexec:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'binaryeye://encode?content=Test\&format=QR_CODE\&execute'
|
||||
|
||||
testencodeurl:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
-d 'http://markusfisch.de/encode?content=Test\&format=QR_CODE'
|
||||
|
||||
testurl:
|
||||
adb shell am start -a android.intent.action.VIEW \
|
||||
-c android.intent.category.BROWSABLE \
|
||||
|
||||
@@ -83,14 +83,14 @@ ZXing can generate the following barcode formats:
|
||||
* [QR CODE][qr_code]
|
||||
* [UPC A][upc_a]
|
||||
|
||||
## Deep Links and Intents
|
||||
|
||||
### Deep Links
|
||||
## Deep Links
|
||||
|
||||
You can invoke Binary Eye with a web URI intent from anything that can
|
||||
open URIs. There are two options:
|
||||
open URIs.
|
||||
|
||||
1. [binaryeye://scan](binaryeye://scan) (note: Github Markdown does not render this as clickable link)
|
||||
### Decoding
|
||||
|
||||
1. [binaryeye://scan](binaryeye://scan) (note: GitHub does not render this as clickable link)
|
||||
2. [http(s)://markusfisch.de/BinaryEye](http://markusfisch.de/BinaryEye)
|
||||
|
||||
If you want to get the scanned contents, you can add a `ret` query
|
||||
@@ -104,10 +104,32 @@ Supported symbols are:
|
||||
* `RESULT_BYTES` - raw result as a hex string
|
||||
* `FORMAT` - barcode format
|
||||
|
||||
### Encoding
|
||||
|
||||
1. [binaryeye://encode](binaryeye://encode)
|
||||
|
||||
You can use the URL arguments `content` and `format` to automatically
|
||||
preset this data. For example:
|
||||
|
||||
1. [binaryeye://encode?content=Test&format=QR_CODE](binaryeye://encode?content=Test&format=QR_CODE)
|
||||
2. [http(s)://markusfisch.de/encode?content=Test&format=QR_CODE](http://markusfisch.de/encode?content=Test&format=QR_CODE)
|
||||
3. [http(s)://markusfisch.de/encode?content=Test&format=DATA_MATRIX](http://markusfisch.de/encode?content=Test2&format=DATA_MATRIX&execute)
|
||||
|
||||
If you want the code to be generated immediately, add `execute=true` (or
|
||||
just `execute`).
|
||||
|
||||
## Intents
|
||||
|
||||
You can also use Binary Eye from other apps by using an [Intent][intent].
|
||||
|
||||
If you prefer to integrate a barcode scanner into your app, take a look at
|
||||
[BarcodeScannerView][barcode_scanner_view] (if you also want to use
|
||||
[ZXing-C++][zxing_cpp]) or read how to
|
||||
[scan barcodes with ML Kit on Android][mlkit_barcode_scanning].
|
||||
|
||||
### SCAN Intent
|
||||
|
||||
You can also use Binary Eye from other apps by using the
|
||||
`com.google.zxing.client.android.SCAN` Intent with
|
||||
Use the `com.google.zxing.client.android.SCAN` `Intent` with
|
||||
[startActivityForResult()][start_activity] like this:
|
||||
|
||||
```kotlin
|
||||
@@ -155,6 +177,21 @@ class YourActivity : AppCompatActivity() {
|
||||
}
|
||||
```
|
||||
|
||||
## Forwarding scans via Bluetooth
|
||||
|
||||
**Note:** The companion apps aren't developed nor maintained by the
|
||||
author of Binary Eye.
|
||||
|
||||
In order to set up Bluetooth forwarding to a computer:
|
||||
|
||||
1. Pair your devices (phone and pc) if not paired already
|
||||
2. Download and run a companion app:
|
||||
- Windows: https://github.com/KamaleiZestri/BinaryReceptorWindows
|
||||
- Linux: https://github.com/sean666888/bin_eye_bt_receiver
|
||||
3. In the settings of Binary Eye, enable "Forward scans with Bluetooth"
|
||||
and select the appropriate target host device that is running the
|
||||
companion application.
|
||||
|
||||
[play]: https://play.google.com/store/search?q=barcode%20scanner&c=apps
|
||||
[zxing_cpp]: https://github.com/zxing-cpp/zxing-cpp
|
||||
[kotlin]: http://kotlinlang.org/
|
||||
@@ -177,6 +214,9 @@ class YourActivity : AppCompatActivity() {
|
||||
[upc_a]: https://en.wikipedia.org/wiki/Universal_Product_Code
|
||||
[upc_e]: https://en.wikipedia.org/wiki/Universal_Product_Code#UPC-E
|
||||
[upc_ean]: https://en.wikipedia.org/wiki/Universal_Product_Code#EAN-13
|
||||
[intent]: https://developer.android.com/reference/android/content/Intent
|
||||
[barcode_scanner_view]: https://github.com/markusfisch/BarcodeScannerView
|
||||
[mlkit_barcode_scanning]: https://developers.google.com/ml-kit/vision/barcode-scanning/android
|
||||
[start_activity]: https://developer.android.com/reference/android/app/Activity#startActivityForResult(android.content.Intent,%20int)
|
||||
[on_activity_result]: https://developer.android.com/reference/android/app/Activity#onActivityResult(int,%20int,%20android.content.Intent)
|
||||
[intent_result]: https://developer.android.com/training/basics/intents/result
|
||||
|
||||
+6
-9
@@ -1,5 +1,4 @@
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
android {
|
||||
namespace "de.markusfisch.android.binaryeye"
|
||||
@@ -9,8 +8,8 @@ android {
|
||||
minSdk 9
|
||||
targetSdk sdk_version
|
||||
|
||||
versionCode 143
|
||||
versionName '1.64.1'
|
||||
versionCode 157
|
||||
versionName '1.68.3'
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@@ -35,7 +34,7 @@ android {
|
||||
}
|
||||
|
||||
release {
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||
minifyEnabled true
|
||||
shrinkResources true
|
||||
signingConfig signingConfigs.release
|
||||
@@ -63,15 +62,12 @@ android {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
kotlinOptions {
|
||||
jvmTarget = "1.8"
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Kotlin
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2"
|
||||
|
||||
// Support
|
||||
implementation "com.android.support:appcompat-v7:$support_version"
|
||||
@@ -82,8 +78,9 @@ dependencies {
|
||||
// External
|
||||
implementation 'com.github.markusfisch:CameraView:1.10.0'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.4.1'
|
||||
implementation 'com.github.markusfisch:zxing-cpp:v2.3.0.2'
|
||||
implementation 'com.github.markusfisch:zxing-cpp:v3.0.2.0'
|
||||
|
||||
// Testing
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.16.1'
|
||||
}
|
||||
|
||||
@@ -109,8 +109,27 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".activity.MainActivity"
|
||||
android:name=".activity.WelcomeActivity"
|
||||
android:exported="true"/>
|
||||
<activity
|
||||
android:name=".activity.MainActivity"
|
||||
android:exported="true">
|
||||
<intent-filter android:autoVerify="true">
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
<data android:host="markusfisch.de"/>
|
||||
<data android:pathPrefix="/encode"/>
|
||||
<data android:scheme="http"/>
|
||||
<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="encode"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<service
|
||||
android:name=".service.ScanTileService"
|
||||
android:icon="@drawable/ic_action_scan"
|
||||
|
||||
+11
-9
@@ -6,15 +6,17 @@ import de.markusfisch.android.binaryeye.content.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.content.openUrl
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
interface IAction {
|
||||
val iconResId: Int
|
||||
val titleResId: Int
|
||||
abstract class Action {
|
||||
abstract val iconResId: Int
|
||||
abstract val titleResId: Int
|
||||
|
||||
fun canExecuteOn(data: ByteArray): Boolean
|
||||
suspend fun execute(context: Context, data: ByteArray)
|
||||
var fired: Boolean = false
|
||||
|
||||
abstract fun canExecuteOn(data: ByteArray): Boolean
|
||||
abstract suspend fun execute(context: Context, data: ByteArray)
|
||||
}
|
||||
|
||||
abstract class IntentAction : IAction {
|
||||
abstract class IntentAction : Action() {
|
||||
abstract val errorMsg: Int
|
||||
|
||||
final override suspend fun execute(context: Context, data: ByteArray) {
|
||||
@@ -22,7 +24,7 @@ abstract class IntentAction : IAction {
|
||||
if (intent == null) {
|
||||
context.toast(errorMsg)
|
||||
} else {
|
||||
context.execShareIntent(intent)
|
||||
fired = context.execShareIntent(intent)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +34,7 @@ abstract class IntentAction : IAction {
|
||||
): Intent?
|
||||
}
|
||||
|
||||
abstract class SchemeAction : IAction {
|
||||
abstract class SchemeAction : Action() {
|
||||
abstract val scheme: String
|
||||
open val buildRegex: Boolean = false
|
||||
|
||||
@@ -50,6 +52,6 @@ abstract class SchemeAction : IAction {
|
||||
}
|
||||
|
||||
final override suspend fun execute(context: Context, data: ByteArray) {
|
||||
context.openUrl(String(data))
|
||||
fired = context.openUrl(String(data))
|
||||
}
|
||||
}
|
||||
@@ -12,9 +12,9 @@ import de.markusfisch.android.binaryeye.actions.web.WebAction
|
||||
import de.markusfisch.android.binaryeye.actions.wifi.WifiAction
|
||||
|
||||
object ActionRegistry {
|
||||
val DEFAULT_ACTION: IAction = OpenOrSearchAction
|
||||
val DEFAULT_ACTION: Action = OpenOrSearchAction
|
||||
|
||||
private val REGISTRY: Set<IAction> = setOf(
|
||||
private val REGISTRY: Set<Action> = setOf(
|
||||
MailAction,
|
||||
MatMsgAction,
|
||||
OtpauthAction,
|
||||
@@ -28,7 +28,7 @@ object ActionRegistry {
|
||||
WebAction
|
||||
)
|
||||
|
||||
fun getAction(data: ByteArray): IAction = REGISTRY.find {
|
||||
fun getAction(data: ByteArray): Action = REGISTRY.find {
|
||||
it.canExecuteOn(data)
|
||||
} ?: DEFAULT_ACTION
|
||||
}
|
||||
|
||||
+49
-46
@@ -2,62 +2,65 @@ package de.markusfisch.android.binaryeye.actions.search
|
||||
|
||||
import android.content.Context
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.IAction
|
||||
import de.markusfisch.android.binaryeye.actions.Action
|
||||
import de.markusfisch.android.binaryeye.app.alertDialog
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.content.openUrl
|
||||
import de.markusfisch.android.binaryeye.net.urlEncode
|
||||
|
||||
object OpenOrSearchAction : IAction {
|
||||
object OpenOrSearchAction : Action() {
|
||||
override val iconResId: Int = R.drawable.ic_action_search
|
||||
override val titleResId: Int = R.string.search_web
|
||||
|
||||
override fun canExecuteOn(data: ByteArray): Boolean = false
|
||||
|
||||
override suspend fun execute(context: Context, data: ByteArray) {
|
||||
view(context, String(data), true)
|
||||
}
|
||||
|
||||
private suspend fun view(
|
||||
context: Context,
|
||||
url: String,
|
||||
search: Boolean
|
||||
) {
|
||||
if (!context.openUrl(url, silent = true) && search) {
|
||||
openSearch(context, url)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun openSearch(context: Context, query: String) {
|
||||
val defaultSearchUrl = prefs.defaultSearchUrl
|
||||
if (defaultSearchUrl.isNotEmpty()) {
|
||||
view(
|
||||
context,
|
||||
defaultSearchUrl + query.urlEncode(),
|
||||
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.removeAt(0)
|
||||
urls.removeAt(0)
|
||||
if (prefs.openWithUrl.isNotEmpty()) {
|
||||
names.add(prefs.openWithUrl)
|
||||
urls.add(prefs.openWithUrl)
|
||||
}
|
||||
val queryUri = alertDialog<String>(context) { resume ->
|
||||
setTitle(R.string.pick_search_engine)
|
||||
setItems(names.toTypedArray()) { _, which ->
|
||||
resume(urls[which] + query.urlEncode())
|
||||
}
|
||||
} ?: return
|
||||
view(context, queryUri, false)
|
||||
fired = openUrlOrSearch(context, String(data))
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun openUrlOrSearch(
|
||||
context: Context,
|
||||
url: String,
|
||||
search: Boolean = true
|
||||
): Boolean {
|
||||
if (context.openUrl(url, silent = true)) {
|
||||
return true
|
||||
}
|
||||
if (search) {
|
||||
return prependSearchUrl(context, url)?.let {
|
||||
openUrlOrSearch(context, it, false)
|
||||
} ?: false
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private suspend fun prependSearchUrl(
|
||||
context: Context,
|
||||
query: String
|
||||
): String? {
|
||||
val defaultSearchUrl = prefs.defaultSearchUrl
|
||||
if (defaultSearchUrl.isNotEmpty()) {
|
||||
return defaultSearchUrl + query.urlEncode()
|
||||
}
|
||||
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.removeAt(0)
|
||||
urls.removeAt(0)
|
||||
if (prefs.openWithUrl.isNotEmpty()) {
|
||||
names.add(prefs.openWithUrl)
|
||||
urls.add(prefs.openWithUrl)
|
||||
}
|
||||
return alertDialog(context) { resume ->
|
||||
setTitle(R.string.pick_search_engine)
|
||||
setItems(names.toTypedArray()) { _, which ->
|
||||
resume(urls[which] + query.urlEncode())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -88,6 +88,6 @@ private fun List<String>.simpleFindParse(date: String): Date? {
|
||||
|
||||
private fun SimpleDateFormat.simpleParse(date: String): Date? = try {
|
||||
parse(date)
|
||||
} catch (e: Exception) {
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
|
||||
@@ -2,10 +2,10 @@ package de.markusfisch.android.binaryeye.actions.web
|
||||
|
||||
import android.content.Context
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.IAction
|
||||
import de.markusfisch.android.binaryeye.actions.Action
|
||||
import de.markusfisch.android.binaryeye.content.openUrl
|
||||
|
||||
object WebAction : IAction {
|
||||
object WebAction : Action() {
|
||||
private val colloquialRegex =
|
||||
"^(URL:[ ]*)*(http[s]*://)*[A-Za-z0-9-]{3,}\\.[A-Za-z]{2,}[^ \t\r\n]*$".toRegex()
|
||||
|
||||
@@ -24,6 +24,6 @@ object WebAction : IAction {
|
||||
if (!url.startsWith("http") && !url.startsWith("ftp")) {
|
||||
url = "http://${url}"
|
||||
}
|
||||
context.openUrl(url)
|
||||
fired = context.openUrl(url)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,31 +2,39 @@ package de.markusfisch.android.binaryeye.actions.wifi
|
||||
|
||||
import android.content.Context
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.IAction
|
||||
import de.markusfisch.android.binaryeye.actions.Action
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
object WifiAction : IAction {
|
||||
object WifiAction : Action() {
|
||||
override val iconResId = R.drawable.ic_action_wifi
|
||||
override val titleResId = R.string.connect_to_wifi
|
||||
|
||||
var password: String? = null
|
||||
|
||||
override fun canExecuteOn(data: ByteArray): Boolean =
|
||||
WifiConnector.parse(String(data)) {
|
||||
password = it
|
||||
} != null
|
||||
override fun canExecuteOn(data: ByteArray): Boolean {
|
||||
// Just check if the data can be parsed as the app should also
|
||||
// show invalid configurations so users can still access them.
|
||||
val inputMap = WifiConnector.parseMap(String(data)) ?: return false
|
||||
password = inputMap["P"]
|
||||
return !inputMap["S"].isNullOrEmpty()
|
||||
}
|
||||
|
||||
override suspend fun execute(
|
||||
context: Context,
|
||||
data: ByteArray
|
||||
) = withContext(Dispatchers.IO) {
|
||||
val message = WifiConnector.parse(String(data))?.let {
|
||||
WifiConnector.addNetwork(context, it)
|
||||
} ?: R.string.wifi_config_failed
|
||||
withContext(Dispatchers.Main) {
|
||||
context.toast(message)
|
||||
override suspend fun execute(context: Context, data: ByteArray) {
|
||||
withContext(Dispatchers.IO) {
|
||||
fired = WifiConnector.parse(String(data))?.let {
|
||||
WifiConnector.addNetwork(context, it)
|
||||
} ?: false
|
||||
withContext(Dispatchers.Main) {
|
||||
context.toast(
|
||||
if (fired) {
|
||||
R.string.wifi_added
|
||||
} else {
|
||||
R.string.wifi_config_failed
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+44
-32
@@ -1,14 +1,15 @@
|
||||
package de.markusfisch.android.binaryeye.actions.wifi
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.wifi.WifiConfiguration
|
||||
import android.net.wifi.WifiEnterpriseConfig
|
||||
import android.net.wifi.WifiManager
|
||||
import android.net.wifi.WifiNetworkSuggestion
|
||||
import android.os.Build
|
||||
import android.provider.Settings
|
||||
import android.support.annotation.RequiresApi
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import java.util.*
|
||||
import java.util.Locale
|
||||
|
||||
/**
|
||||
* Normal:
|
||||
@@ -35,15 +36,9 @@ import java.util.*
|
||||
* The fields can appear in any order. Only "S:" is required.
|
||||
*/
|
||||
object WifiConnector {
|
||||
fun parse(
|
||||
input: String,
|
||||
passwordBlock: ((password: String?) -> Unit)? = null
|
||||
): Any? {
|
||||
fun parse(input: String): Any? {
|
||||
val inputMap = parseMap(input) ?: return null
|
||||
val parsedData = SimpleDataAccessor.of(inputMap) ?: return null
|
||||
passwordBlock?.apply {
|
||||
invoke(parsedData.password)
|
||||
}
|
||||
return try {
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
|
||||
// WifiConfiguration is deprecated in Android Q but
|
||||
@@ -54,7 +49,7 @@ object WifiConnector {
|
||||
} else {
|
||||
WifiNetworkSuggestion.Builder().apply(parsedData)
|
||||
}
|
||||
} catch (e: IllegalArgumentException) {
|
||||
} catch (_: IllegalArgumentException) {
|
||||
// Some arguments may be out of range, e.g. SSIDs cannot
|
||||
// be longer than 32 characters in some versions of Android.
|
||||
// See: https://github.com/markusfisch/BinaryEye/issues/402
|
||||
@@ -62,24 +57,26 @@ object WifiConnector {
|
||||
}
|
||||
}
|
||||
|
||||
fun addNetwork(context: Context, config: Any): Int {
|
||||
fun addNetwork(context: Context, config: Any): Boolean {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
|
||||
config is WifiNetworkSuggestion.Builder
|
||||
) {
|
||||
context.suggestNetworkFromBuilder(config)
|
||||
return true
|
||||
}
|
||||
|
||||
val wifiManager = context.applicationContext.getSystemService(
|
||||
Context.WIFI_SERVICE
|
||||
) as WifiManager
|
||||
// WifiConfiguration is deprecated in Android Q.
|
||||
@Suppress("DEPRECATION")
|
||||
return if ((config is WifiConfiguration &&
|
||||
wifiManager.enableWifi() &&
|
||||
wifiManager.removeOldNetwork(config) &&
|
||||
wifiManager.enableNewNetwork(config)) ||
|
||||
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
|
||||
config is WifiNetworkSuggestion.Builder &&
|
||||
wifiManager.addNetworkFromBuilder(config))
|
||||
) {
|
||||
R.string.wifi_added
|
||||
} else {
|
||||
R.string.wifi_config_failed
|
||||
}
|
||||
return (config is WifiConfiguration &&
|
||||
wifiManager.enableWifi() &&
|
||||
wifiManager.removeOldNetwork(config) &&
|
||||
wifiManager.enableNewNetwork(config)) ||
|
||||
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q &&
|
||||
config is WifiNetworkSuggestion.Builder &&
|
||||
wifiManager.addNetworkFromBuilder(config))
|
||||
}
|
||||
|
||||
internal fun parseMap(input: String): Map<String, String>? {
|
||||
@@ -93,7 +90,7 @@ object WifiConnector {
|
||||
input.trimAndTerminate()
|
||||
)?.groupValues?.get(1)?.let { pairs ->
|
||||
pairRegex.findAll(pairs).map { pair ->
|
||||
pair.groupValues[1].uppercase(Locale.US) to pair.groupValues[2]
|
||||
pair.groupValues[1].uppercase(Locale.US) to pair.groupValues[2].unescape
|
||||
}.toMap()
|
||||
}
|
||||
}
|
||||
@@ -103,17 +100,17 @@ object WifiConnector {
|
||||
) {
|
||||
// This should be private but because of testing it isn't possible.
|
||||
internal val ssid: String
|
||||
get() = inputMap.getValue("S").unescape
|
||||
get() = inputMap.getValue("S")
|
||||
internal val securityType: String
|
||||
get() = inputMap["T"]?.unescape ?: ""
|
||||
get() = inputMap["T"] ?: ""
|
||||
internal val password: String?
|
||||
get() = inputMap["P"]?.unescape
|
||||
get() = inputMap["P"]
|
||||
internal val hidden: Boolean
|
||||
get() = inputMap["H"]?.unescape == "true"
|
||||
get() = inputMap["H"] == "true"
|
||||
internal val anonymousIdentity: String
|
||||
get() = inputMap["AI"]?.unescape ?: inputMap["A"]?.unescape ?: ""
|
||||
get() = inputMap["AI"] ?: inputMap["A"] ?: ""
|
||||
internal val identity: String
|
||||
get() = inputMap["I"]?.unescape ?: ""
|
||||
get() = inputMap["I"] ?: ""
|
||||
internal val eapMethod: Int?
|
||||
get() = if (inputMap["E"].isNullOrEmpty()) {
|
||||
requireSdk(Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||
@@ -201,7 +198,7 @@ object WifiConnector {
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (e: IllegalArgumentException) {
|
||||
} catch (_: IllegalArgumentException) {
|
||||
// Don't accept passphrases that aren't ASCII encodeable.
|
||||
return null
|
||||
}
|
||||
@@ -313,6 +310,21 @@ private fun WifiManager.addNetworkFromBuilder(
|
||||
return result == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS
|
||||
}
|
||||
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
private fun Context.suggestNetworkFromBuilder(
|
||||
builder: WifiNetworkSuggestion.Builder
|
||||
) {
|
||||
val suggestion = builder.build()
|
||||
startActivity(
|
||||
Intent(Settings.ACTION_WIFI_ADD_NETWORKS).apply {
|
||||
putParcelableArrayListExtra(
|
||||
Settings.EXTRA_WIFI_NETWORK_LIST,
|
||||
arrayListOf(suggestion)
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// Make sure the string ends with a semicolon.
|
||||
private fun String.trimAndTerminate(): String {
|
||||
var trimmed = trim()
|
||||
@@ -366,7 +378,7 @@ private fun WifiManager.removeOldNetwork(
|
||||
}?.networkId?.also {
|
||||
removeNetwork(it)
|
||||
}
|
||||
} catch (e: SecurityException) {
|
||||
} catch (_: SecurityException) {
|
||||
// The user didn't allow ACCESS_FINE_LOCATION which is
|
||||
// required to access configuredNetworks and that's fine.
|
||||
}
|
||||
|
||||
@@ -28,17 +28,18 @@ import de.markusfisch.android.binaryeye.app.db
|
||||
import de.markusfisch.android.binaryeye.app.hasBluetoothPermission
|
||||
import de.markusfisch.android.binaryeye.app.hasCameraPermission
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.automation.runAutomatedActions
|
||||
import de.markusfisch.android.binaryeye.bluetooth.sendBluetoothAsync
|
||||
import de.markusfisch.android.binaryeye.content.copyToClipboard
|
||||
import de.markusfisch.android.binaryeye.content.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.content.openUrl
|
||||
import de.markusfisch.android.binaryeye.content.toHexString
|
||||
import de.markusfisch.android.binaryeye.database.toScan
|
||||
import de.markusfisch.android.binaryeye.graphics.FrameMetrics
|
||||
import de.markusfisch.android.binaryeye.graphics.mapPosition
|
||||
import de.markusfisch.android.binaryeye.graphics.setFrameRoi
|
||||
import de.markusfisch.android.binaryeye.graphics.setFrameToView
|
||||
import de.markusfisch.android.binaryeye.media.releaseToneGenerators
|
||||
import de.markusfisch.android.binaryeye.net.isScanDeeplink
|
||||
import de.markusfisch.android.binaryeye.net.sendAsync
|
||||
import de.markusfisch.android.binaryeye.net.urlEncode
|
||||
import de.markusfisch.android.binaryeye.preference.Preferences
|
||||
@@ -54,6 +55,7 @@ import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.ReaderOptions
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.TextMode
|
||||
import java.io.FileInputStream
|
||||
import java.util.Scanner
|
||||
import kotlin.math.max
|
||||
@@ -69,6 +71,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
private lateinit var zoomBar: SeekBar
|
||||
private lateinit var flashFab: FloatingActionButton
|
||||
|
||||
private var currentProfile = prefs.profile
|
||||
private var shouldStoreSettings = true
|
||||
private var formatsToRead = setOf<BarcodeFormat>()
|
||||
private var frameMetrics = FrameMetrics()
|
||||
private var decoding = true
|
||||
@@ -78,7 +82,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
private var frontFacing = false
|
||||
private var bulkMode = prefs.bulkMode
|
||||
private var restrictFormat: String? = null
|
||||
private var searchTerm: String? = null
|
||||
private var searchTerm: Regex? = null
|
||||
private var ignoreNext: String? = null
|
||||
private var fallbackBuffer: IntArray? = null
|
||||
private var requestCameraPermission = true
|
||||
@@ -104,7 +108,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
) {
|
||||
when (requestCode) {
|
||||
PICK_FILE_RESULT_CODE -> {
|
||||
if (resultCode == Activity.RESULT_OK && resultData != null) {
|
||||
if (resultCode == RESULT_OK && resultData != null) {
|
||||
val pick = Intent(this, PickActivity::class.java)
|
||||
pick.action = Intent.ACTION_VIEW
|
||||
pick.setDataAndType(resultData.data, "image/*")
|
||||
@@ -148,20 +152,20 @@ class CameraActivity : AppCompatActivity() {
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
fallbackBuffer = null
|
||||
saveZoom()
|
||||
detectorView.saveCropHandlePos()
|
||||
releaseToneGenerators()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
System.gc()
|
||||
updateHintsAndTitle()
|
||||
if (prefs.bulkMode && bulkMode != prefs.bulkMode) {
|
||||
bulkMode = prefs.bulkMode
|
||||
invalidateOptionsMenu()
|
||||
ignoreNext = null
|
||||
if (firstStart()) {
|
||||
startActivity(Intent(this, WelcomeActivity::class.java))
|
||||
return
|
||||
}
|
||||
loadPreferences()
|
||||
if (refreshIfProfileChanged()) {
|
||||
return
|
||||
}
|
||||
System.gc()
|
||||
setReturnTarget(intent)
|
||||
// Avoid asking multiple times when the user has denied access
|
||||
// for this session. Otherwise ActivityCompat.requestPermissions()
|
||||
@@ -172,6 +176,44 @@ class CameraActivity : AppCompatActivity() {
|
||||
requestCameraPermission = false
|
||||
}
|
||||
|
||||
private fun Context.firstStart(): Boolean {
|
||||
val welcomeShownName = "welcome_shown"
|
||||
if (prefs.defaultPreferences.getBoolean(welcomeShownName, false)) {
|
||||
return false
|
||||
}
|
||||
prefs.defaultPreferences.edit().putBoolean(welcomeShownName, true).apply()
|
||||
val packageInfo = packageManager.getPackageInfo(packageName, 0)
|
||||
val installedSince = System.currentTimeMillis() -
|
||||
packageInfo.firstInstallTime
|
||||
return installedSince < 86400000
|
||||
}
|
||||
|
||||
private fun refreshIfProfileChanged(): Boolean {
|
||||
if (currentProfile == prefs.profile) {
|
||||
return false
|
||||
}
|
||||
shouldStoreSettings = false
|
||||
zoomBar.max = 0 // Reset zoom when there are no preferences yet.
|
||||
currentProfile = prefs.profile
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
recreate()
|
||||
} else {
|
||||
finish()
|
||||
startActivity(Intent(this, CameraActivity::class.java))
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private fun loadPreferences() {
|
||||
detectorView.updateCropHandlePos()
|
||||
updateHintsAndTitle()
|
||||
if (prefs.bulkMode && bulkMode != prefs.bulkMode) {
|
||||
bulkMode = prefs.bulkMode
|
||||
invalidateOptionsMenu()
|
||||
ignoreNext = null
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateHintsAndTitle() {
|
||||
val restriction = restrictFormat
|
||||
formatsToRead = if (restriction != null) {
|
||||
@@ -185,13 +227,11 @@ class CameraActivity : AppCompatActivity() {
|
||||
private fun updateTitle() {
|
||||
if (searchTerm != null || restrictFormat != null) {
|
||||
title = getString(
|
||||
R.string.scan_format,
|
||||
prettifyFormatName(
|
||||
listOfNotNull(
|
||||
restrictFormat,
|
||||
searchTerm
|
||||
).joinToString(",")
|
||||
)
|
||||
R.string.scan_for,
|
||||
listOfNotNull(
|
||||
searchTerm?.let { "\"$it\"" },
|
||||
restrictFormat?.prettifyFormatName(),
|
||||
).joinToString(" ")
|
||||
)
|
||||
} else {
|
||||
setTitle(R.string.scan_code)
|
||||
@@ -204,7 +244,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
returnResult = true
|
||||
}
|
||||
|
||||
intent?.dataString?.isReturnUrl() == true -> {
|
||||
intent?.dataString?.let(::isScanDeeplink) == true -> {
|
||||
finishAfterShowingResult = true
|
||||
returnUrlTemplate = intent.data?.getQueryParameter("ret")
|
||||
}
|
||||
@@ -227,12 +267,21 @@ class CameraActivity : AppCompatActivity() {
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
closeCamera()
|
||||
if (shouldStoreSettings) {
|
||||
storeSettings()
|
||||
}
|
||||
shouldStoreSettings = true
|
||||
}
|
||||
|
||||
private fun closeCamera() {
|
||||
cameraView.close()
|
||||
}
|
||||
|
||||
private fun storeSettings() {
|
||||
storeZoomBarSettings()
|
||||
detectorView.storeCropHandlePos()
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(savedState: Bundle) {
|
||||
super.onRestoreInstanceState(savedState)
|
||||
zoomBar.max = savedState.getInt(ZOOM_MAX)
|
||||
@@ -240,7 +289,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
frontFacing = savedState.getBoolean(FRONT_FACING)
|
||||
bulkMode = savedState.getBoolean(BULK_MODE)
|
||||
restrictFormat = savedState.getString(RESTRICT_FORMAT)
|
||||
searchTerm = savedState.getString(SEARCH_TERM)
|
||||
searchTerm = savedState.getString(SEARCH_TERM)?.toRegex()
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
@@ -249,7 +298,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
outState.putBoolean(FRONT_FACING, frontFacing)
|
||||
outState.putBoolean(BULK_MODE, bulkMode)
|
||||
outState.putString(RESTRICT_FORMAT, restrictFormat)
|
||||
outState.putString(SEARCH_TERM, searchTerm)
|
||||
outState.putString(SEARCH_TERM, searchTerm?.toString())
|
||||
super.onSaveInstanceState(outState)
|
||||
}
|
||||
|
||||
@@ -265,6 +314,10 @@ class CameraActivity : AppCompatActivity() {
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
menuInflater.inflate(R.menu.activity_camera, menu)
|
||||
menu.findItem(R.id.bulk_mode).isChecked = bulkMode
|
||||
menu.findItem(R.id.profile).title = getString(
|
||||
R.string.current_profile,
|
||||
prefs.profile ?: getString(R.string.profile_default)
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -325,6 +378,11 @@ class CameraActivity : AppCompatActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
R.id.profile -> {
|
||||
pickProfile()
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
@@ -365,21 +423,23 @@ class CameraActivity : AppCompatActivity() {
|
||||
private fun askForCode() {
|
||||
val view = layoutInflater.inflate(R.layout.dialog_find_code, null)
|
||||
val editText = view.findViewById<EditText>(R.id.term)
|
||||
searchTerm.let {
|
||||
editText.setText(it)
|
||||
searchTerm?.let {
|
||||
editText.setText(it.toString())
|
||||
}
|
||||
AlertDialog.Builder(this)
|
||||
.setView(view)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
searchTerm = editText.text.toString()
|
||||
if (searchTerm?.isEmpty() == true) {
|
||||
val term = editText.text.toString().trim()
|
||||
if (!term.isEmpty()) {
|
||||
searchTerm = term.toRegex()
|
||||
} else {
|
||||
searchTerm = null
|
||||
}
|
||||
ignoreNext = null
|
||||
updateTitle()
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
searchTerm = null
|
||||
updateTitle()
|
||||
// do not change anything on cancel
|
||||
}
|
||||
.show()
|
||||
}
|
||||
@@ -392,6 +452,27 @@ class CameraActivity : AppCompatActivity() {
|
||||
execShareIntent(intent)
|
||||
}
|
||||
|
||||
private fun pickProfile() {
|
||||
val profiles = arrayOf(
|
||||
getString(R.string.profile_default),
|
||||
) + prefs.profiles
|
||||
AlertDialog.Builder(this)
|
||||
.setTitle(R.string.profile)
|
||||
.setItems(profiles) { _, which ->
|
||||
val newProfile = when (which) {
|
||||
0 -> null
|
||||
else -> profiles[which]
|
||||
}
|
||||
if (currentProfile != newProfile) {
|
||||
storeSettings()
|
||||
prefs.load(this, newProfile)
|
||||
loadPreferences()
|
||||
refreshIfProfileChanged()
|
||||
}
|
||||
}
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun handleSendText(intent: Intent) {
|
||||
val text = intent.getStringExtra(Intent.EXTRA_TEXT)
|
||||
|
||||
@@ -448,7 +529,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
v ?: return false
|
||||
val dist = offset - pos
|
||||
val maxValue = zoomBar.max
|
||||
val change = maxValue / v.height.toFloat() * 2f * dist
|
||||
val change = maxValue /
|
||||
v.height.toFloat() * 2f * dist
|
||||
zoomBar.progress = min(
|
||||
maxValue,
|
||||
max(progress + change.roundToInt(), 0)
|
||||
@@ -478,11 +560,12 @@ class CameraActivity : AppCompatActivity() {
|
||||
parameters: Camera.Parameters
|
||||
) {
|
||||
zoomBar.visibility = if (parameters.isZoomSupported) {
|
||||
restoreZoomBarSettings()
|
||||
val max = parameters.maxZoom
|
||||
if (zoomBar.max != max) {
|
||||
zoomBar.max = max
|
||||
zoomBar.progress = max / 10
|
||||
saveZoom()
|
||||
storeZoomBarSettings()
|
||||
}
|
||||
parameters.zoom = zoomBar.progress
|
||||
View.VISIBLE
|
||||
@@ -521,41 +604,53 @@ class CameraActivity : AppCompatActivity() {
|
||||
tryRotate = prefs.autoRotate,
|
||||
tryInvert = true,
|
||||
tryDownscale = true,
|
||||
returnCodabarStartEnd = true,
|
||||
maxNumberOfSymbols = 1
|
||||
maxNumberOfSymbols = 1,
|
||||
textMode = TextMode.PLAIN
|
||||
)
|
||||
var useLocalAverage = false
|
||||
camera.setPreviewCallback { frameData, _ ->
|
||||
if (decoding) {
|
||||
useLocalAverage = useLocalAverage xor true
|
||||
ZxingCpp.readByteArray(
|
||||
frameData,
|
||||
frameMetrics.width,
|
||||
frameRoi.left, frameRoi.top,
|
||||
frameRoi.width(), frameRoi.height(),
|
||||
frameMetrics.orientation,
|
||||
options.apply {
|
||||
// By default, ZXing uses LOCAL_AVERAGE, but
|
||||
// this does not work well with inverted
|
||||
// barcodes on low-contrast backgrounds.
|
||||
binarizer = if (useLocalAverage) {
|
||||
Binarizer.LOCAL_AVERAGE
|
||||
} else {
|
||||
Binarizer.GLOBAL_HISTOGRAM
|
||||
}
|
||||
formats = formatsToRead
|
||||
}
|
||||
)?.let { results ->
|
||||
val result = results.first()
|
||||
val text = result.text
|
||||
val term = searchTerm
|
||||
if (text != ignoreNext &&
|
||||
(term == null || text.contains(term))
|
||||
) {
|
||||
postResult(result)
|
||||
decoding = false
|
||||
if (!decoding ||
|
||||
frameData == null ||
|
||||
frameData.isEmpty()
|
||||
) {
|
||||
return@setPreviewCallback
|
||||
}
|
||||
useLocalAverage = useLocalAverage xor true
|
||||
ZxingCpp.readByteArray(
|
||||
frameData,
|
||||
frameMetrics.width,
|
||||
frameRoi.left, frameRoi.top,
|
||||
frameRoi.width(), frameRoi.height(),
|
||||
frameMetrics.orientation,
|
||||
options.apply {
|
||||
// By default, ZXing uses LOCAL_AVERAGE, but
|
||||
// this does not work well with inverted
|
||||
// barcodes on low-contrast backgrounds.
|
||||
binarizer = if (useLocalAverage) {
|
||||
Binarizer.LOCAL_AVERAGE
|
||||
} else {
|
||||
Binarizer.GLOBAL_HISTOGRAM
|
||||
}
|
||||
formats = formatsToRead
|
||||
}
|
||||
)?.let { results ->
|
||||
val result = results.first()
|
||||
val text = result.text
|
||||
if (text == ignoreNext) {
|
||||
return@let
|
||||
}
|
||||
val term = searchTerm
|
||||
if (term != null &&
|
||||
!text.matches(term) &&
|
||||
!text.contains(term)
|
||||
) {
|
||||
ignoreNext = text
|
||||
errorFeedback()
|
||||
toast(R.string.does_not_match_search_term)
|
||||
return@let
|
||||
}
|
||||
postResult(result)
|
||||
decoding = false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -584,7 +679,6 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar) {}
|
||||
})
|
||||
restoreZoom()
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
@@ -593,19 +687,19 @@ class CameraActivity : AppCompatActivity() {
|
||||
val params = parameters
|
||||
params.zoom = zoom
|
||||
parameters = params
|
||||
} catch (e: RuntimeException) {
|
||||
} catch (_: RuntimeException) {
|
||||
// Ignore. There's nothing we can do.
|
||||
}
|
||||
}
|
||||
|
||||
private fun saveZoom() {
|
||||
private fun storeZoomBarSettings() {
|
||||
val editor = prefs.preferences.edit()
|
||||
editor.putInt(ZOOM_MAX, zoomBar.max)
|
||||
editor.putInt(ZOOM_LEVEL, zoomBar.progress)
|
||||
editor.apply()
|
||||
}
|
||||
|
||||
private fun restoreZoom() {
|
||||
private fun restoreZoomBarSettings() {
|
||||
zoomBar.max = prefs.preferences.getInt(ZOOM_MAX, zoomBar.max)
|
||||
zoomBar.progress = prefs.preferences.getInt(
|
||||
ZOOM_LEVEL,
|
||||
@@ -622,12 +716,21 @@ class CameraActivity : AppCompatActivity() {
|
||||
updateFrameRoiAndMappingMatrix()
|
||||
}
|
||||
detectorView.setPaddingFromWindowInsets()
|
||||
detectorView.restoreCropHandlePos()
|
||||
detectorView.cropHandleName = "camera_crop_handle"
|
||||
}
|
||||
|
||||
private fun updateFrameRoiAndMappingMatrix() {
|
||||
val viewRect = cameraView.previewRect
|
||||
val viewRoi = if (detectorView.roi.width() < 1) {
|
||||
if (viewRect.width() < 1 ||
|
||||
viewRect.height() < 1 ||
|
||||
!frameMetrics.isValid()
|
||||
) {
|
||||
return
|
||||
}
|
||||
val viewRoi = if (
|
||||
detectorView.roi.width() < 1 ||
|
||||
detectorView.roi.height() < 1
|
||||
) {
|
||||
viewRect
|
||||
} else {
|
||||
detectorView.roi
|
||||
@@ -685,7 +788,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
when {
|
||||
returnResult -> {
|
||||
setResult(Activity.RESULT_OK, getReturnIntent(result))
|
||||
setResult(RESULT_OK, getReturnIntent(result))
|
||||
finish()
|
||||
}
|
||||
|
||||
@@ -750,7 +853,7 @@ fun Activity.showResult(
|
||||
if (prefs.sendScanActive && prefs.sendScanUrl.isNotEmpty()) {
|
||||
if (prefs.sendScanType == "4") {
|
||||
openUrl(
|
||||
prefs.sendScanUrl + scan.content.urlEncode()
|
||||
prefs.sendScanUrl + scan.text.urlEncode()
|
||||
)
|
||||
return
|
||||
}
|
||||
@@ -792,6 +895,9 @@ fun Activity.showResult(
|
||||
)
|
||||
}
|
||||
}
|
||||
if (runAutomatedActions(scan)) {
|
||||
return
|
||||
}
|
||||
if (!bulkMode) {
|
||||
startActivity(
|
||||
MainActivity.getDecodeIntent(this, scan)
|
||||
@@ -809,12 +915,6 @@ private fun getReturnIntent(result: Result) = Intent().apply {
|
||||
}
|
||||
}
|
||||
|
||||
private fun String.isReturnUrl() = listOf(
|
||||
"binaryeye://scan",
|
||||
"http://markusfisch.de/BinaryEye",
|
||||
"https://markusfisch.de/BinaryEye"
|
||||
).firstOrNull { startsWith(it) } != null
|
||||
|
||||
private fun completeUrl(urlTemplate: String, result: Result) = Uri.parse(
|
||||
urlTemplate
|
||||
.replace("{RESULT}", result.text.urlEncode())
|
||||
|
||||
@@ -3,6 +3,7 @@ package de.markusfisch.android.binaryeye.activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
@@ -19,6 +20,7 @@ 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.net.isEncodeDeeplink
|
||||
import de.markusfisch.android.binaryeye.view.colorSystemAndToolBars
|
||||
import de.markusfisch.android.binaryeye.view.initBars
|
||||
|
||||
@@ -29,7 +31,8 @@ class MainActivity : AppCompatActivity() {
|
||||
grantResults: IntArray
|
||||
) {
|
||||
when (requestCode) {
|
||||
PERMISSION_LOCATION, PERMISSION_WRITE -> if (grantResults.isNotEmpty() &&
|
||||
PERMISSION_LOCATION, PERMISSION_WRITE -> if (
|
||||
grantResults.isNotEmpty() &&
|
||||
grantResults[0] == PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
permissionGrantedCallback?.invoke()
|
||||
@@ -65,7 +68,12 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
if (state == null) {
|
||||
supportFragmentManager?.setFragment(getFragmentForIntent(intent))
|
||||
val fragment = intent?.getFragmentForIntent()
|
||||
if (fragment == null) {
|
||||
finish()
|
||||
return
|
||||
}
|
||||
supportFragmentManager?.setFragment(fragment)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,21 +83,29 @@ class MainActivity : AppCompatActivity() {
|
||||
private const val ENCODE = "encode"
|
||||
const val DECODED = "decoded"
|
||||
|
||||
private fun getFragmentForIntent(intent: Intent?): Fragment {
|
||||
intent ?: return PreferencesFragment()
|
||||
return when {
|
||||
intent.hasExtra(PREFERENCES) -> PreferencesFragment()
|
||||
intent.hasExtra(HISTORY) -> HistoryFragment()
|
||||
intent.hasExtra(ENCODE) -> EncodeFragment.newInstance(
|
||||
intent.getStringExtra(ENCODE)
|
||||
private fun Intent.getFragmentForIntent(): Fragment? = when {
|
||||
hasExtra(PREFERENCES) -> PreferencesFragment()
|
||||
hasExtra(HISTORY) -> HistoryFragment()
|
||||
|
||||
dataString?.let(::isEncodeDeeplink) == true -> {
|
||||
val uri = Uri.parse(dataString)
|
||||
EncodeFragment.newInstance(
|
||||
content = uri.getQueryParameter("content"),
|
||||
format = uri.getQueryParameter("format")?.uppercase(),
|
||||
execute = uri.getQueryParameter("execute")
|
||||
.let { it == "" || it.toBoolean() }
|
||||
)
|
||||
|
||||
intent.hasExtra(DECODED) -> intent.getScanExtra(DECODED)?.let {
|
||||
DecodeFragment.newInstance(it)
|
||||
} ?: DecodeFragment()
|
||||
|
||||
else -> PreferencesFragment()
|
||||
}
|
||||
|
||||
hasExtra(ENCODE) -> EncodeFragment.newInstance(
|
||||
getStringExtra(ENCODE)
|
||||
)
|
||||
|
||||
hasExtra(DECODED) -> getScanExtra(DECODED)?.let {
|
||||
DecodeFragment.newInstance(it)
|
||||
}
|
||||
|
||||
else -> PreferencesFragment()
|
||||
}
|
||||
|
||||
fun getPreferencesIntent(context: Context): Intent {
|
||||
@@ -112,10 +128,11 @@ class MainActivity : AppCompatActivity() {
|
||||
val intent = Intent(context, MainActivity::class.java)
|
||||
intent.putExtra(ENCODE, text)
|
||||
if (isExternal) {
|
||||
val flagActivityClearTask =
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
} else 0
|
||||
val flagActivityClearTask = if (
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
|
||||
) {
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
} else 0
|
||||
intent.addFlags(
|
||||
Intent.FLAG_ACTIVITY_NO_HISTORY or
|
||||
flagActivityClearTask or
|
||||
@@ -133,11 +150,22 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
private fun Intent.getScanExtra(name: String): Scan? = if (
|
||||
Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||
) {
|
||||
@Suppress("DEPRECATION")
|
||||
getParcelableExtra(name)
|
||||
try {
|
||||
getParcelableExtra(name, Scan::class.java)
|
||||
} catch (_: Throwable) {
|
||||
// `getParcelableExtra(name, Class)` can throw on some versions
|
||||
// of Android when the ClassLoader associated with the Bundle's
|
||||
// lazy-decoded value is null in certain scenarios (e.g., after
|
||||
// an activity restart where the system re-delivers the intent).
|
||||
// Simply fallback to the "deprecated" `getParcelableExtra(name)`
|
||||
// which works in this case, because it doesn't verify the
|
||||
// parcelable's class against Scan::class.java.
|
||||
null
|
||||
}
|
||||
} else {
|
||||
getParcelableExtra(name, Scan::class.java)
|
||||
}
|
||||
null
|
||||
} ?: getParcelableExtra(name)
|
||||
|
||||
@@ -49,15 +49,13 @@ class PickActivity : AppCompatActivity() {
|
||||
tryRotate = true,
|
||||
tryInvert = true,
|
||||
tryDownscale = true,
|
||||
returnCodabarStartEnd = true,
|
||||
maxNumberOfSymbols = 1,
|
||||
formats = prefs.barcodeFormats.toFormatSet()
|
||||
)
|
||||
|
||||
private lateinit var cropImageView: CropImageView
|
||||
private lateinit var detectorView: DetectorView
|
||||
private lateinit var freeRotationItem: MenuItem
|
||||
|
||||
private var cropImageView: CropImageView? = null
|
||||
private var detectorView: DetectorView? = null
|
||||
private var freeRotationItem: MenuItem? = null
|
||||
private var result: Result? = null
|
||||
|
||||
override fun attachBaseContext(base: Context?) {
|
||||
@@ -74,7 +72,6 @@ class PickActivity : AppCompatActivity() {
|
||||
setTitle(R.string.pick_code_to_scan)
|
||||
|
||||
initBars()
|
||||
|
||||
supportFragmentManager.addOnBackStackChangedListener {
|
||||
colorSystemAndToolBars(this@PickActivity)
|
||||
}
|
||||
@@ -83,23 +80,34 @@ class PickActivity : AppCompatActivity() {
|
||||
if (bitmap == null) {
|
||||
applicationContext.toast(R.string.error_no_content)
|
||||
finish()
|
||||
// This is why cropImageView and detectorView aren't lateinit.
|
||||
// If they were, a kotlin.UninitializedPropertyAccessException
|
||||
// would happen here.
|
||||
return
|
||||
}
|
||||
|
||||
cropImageView = findViewById(R.id.image) as CropImageView
|
||||
cropImageView.restrictTranslation = false
|
||||
cropImageView.freeRotation = prefs.freeRotation
|
||||
cropImageView.setImageBitmap(bitmap)
|
||||
cropImageView.onScan = {
|
||||
scanWithinBounds(bitmap)
|
||||
cropImageView = (findViewById(R.id.image) as CropImageView).apply {
|
||||
restrictTranslation = false
|
||||
freeRotation = prefs.freeRotation
|
||||
setImageBitmap(bitmap)
|
||||
onScan = {
|
||||
scanWithinBounds(bitmap)
|
||||
}
|
||||
runAfterLayout = {
|
||||
minWidth = min(
|
||||
minWidth / 2f,
|
||||
max(bitmap.width, bitmap.height).toFloat()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
detectorView = findViewById(R.id.detector_view) as DetectorView
|
||||
detectorView.onRoiChanged = {
|
||||
scanWithinBounds(bitmap)
|
||||
detectorView = (findViewById(R.id.detector_view) as DetectorView).apply {
|
||||
onRoiChanged = {
|
||||
scanWithinBounds(bitmap)
|
||||
}
|
||||
setPaddingFromWindowInsets()
|
||||
cropHandleName = "picker_crop_handle"
|
||||
}
|
||||
detectorView.setPaddingFromWindowInsets()
|
||||
detectorView.restoreCropHandlePos()
|
||||
|
||||
findViewById(R.id.scan).setOnClickListener {
|
||||
showResult()
|
||||
@@ -121,17 +129,19 @@ class PickActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
private fun scanWithinBounds(bitmap: Bitmap) {
|
||||
val dv = detectorView ?: return
|
||||
val civ = cropImageView ?: return
|
||||
val viewRoi = Rect(
|
||||
if (detectorView.roi.width() < 1) {
|
||||
cropImageView.getBoundsRect()
|
||||
if (dv.roi.width() < 1) {
|
||||
civ.getBoundsRect()
|
||||
} else {
|
||||
detectorView.roi
|
||||
dv.roi
|
||||
}
|
||||
)
|
||||
val mappedRect = RectF(cropImageView.mappedRect)
|
||||
val imageRotation = cropImageView.imageRotation
|
||||
val pivotX = cropImageView.pivotX
|
||||
val pivotY = cropImageView.pivotY
|
||||
val mappedRect = RectF(civ.mappedRect)
|
||||
val imageRotation = civ.imageRotation
|
||||
val pivotX = civ.pivotX
|
||||
val pivotY = civ.pivotY
|
||||
scope.launch {
|
||||
val cropped = bitmap.crop(
|
||||
getNormalizedRoi(mappedRect, viewRoi),
|
||||
@@ -162,10 +172,10 @@ class PickActivity : AppCompatActivity() {
|
||||
}
|
||||
result = it
|
||||
scanFeedback()
|
||||
detectorView.update(
|
||||
dv.update(
|
||||
matrix.mapPosition(
|
||||
it.position,
|
||||
detectorView.coordinates
|
||||
dv.coordinates
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -195,7 +205,7 @@ class PickActivity : AppCompatActivity() {
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
detectorView.saveCropHandlePos()
|
||||
detectorView?.storeCropHandlePos()
|
||||
parentJob.cancel()
|
||||
releaseToneGenerators()
|
||||
}
|
||||
@@ -217,8 +227,8 @@ class PickActivity : AppCompatActivity() {
|
||||
|
||||
R.id.toggle_free -> {
|
||||
prefs.freeRotation = prefs.freeRotation xor true
|
||||
cropImageView.freeRotation = prefs.freeRotation
|
||||
freeRotationItem.updateFreeRotationIcon()
|
||||
cropImageView?.freeRotation = prefs.freeRotation
|
||||
freeRotationItem?.updateFreeRotationIcon()
|
||||
true
|
||||
}
|
||||
|
||||
@@ -237,7 +247,8 @@ class PickActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
private fun rotateClockwise() {
|
||||
cropImageView.imageRotation = (cropImageView.imageRotation + 90) % 360
|
||||
val civ = cropImageView ?: return
|
||||
civ.imageRotation = (civ.imageRotation + 90) % 360
|
||||
}
|
||||
|
||||
private fun loadSentImage(intent: Intent): Bitmap? {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package de.markusfisch.android.binaryeye.activity
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
|
||||
class WelcomeActivity : AppCompatActivity() {
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setContentView(R.layout.activity_welcome)
|
||||
findViewById(R.id.expert).setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
findViewById(R.id.simple).setOnClickListener {
|
||||
prefs.apply {
|
||||
showCropHandle = false
|
||||
zoomBySwiping = false
|
||||
beep = true
|
||||
copyImmediately = true
|
||||
openImmediately = true
|
||||
showMetaData = false
|
||||
showHexDump = false
|
||||
defaultSearchUrl = "https://www.google.com/search?q="
|
||||
openWithUrl = defaultSearchUrl
|
||||
expandEscapeSequences = false
|
||||
brightenScreen = true
|
||||
}
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
private val idIndex = cursor.getColumnIndex(Database.SCANS_ID)
|
||||
private val timeIndex = cursor.getColumnIndex(Database.SCANS_DATETIME)
|
||||
private val nameIndex = cursor.getColumnIndex(Database.SCANS_NAME)
|
||||
private val contentIndex = cursor.getColumnIndex(Database.SCANS_CONTENT)
|
||||
private val textIndex = cursor.getColumnIndex(Database.SCANS_TEXT)
|
||||
private val formatIndex = cursor.getColumnIndex(Database.SCANS_FORMAT)
|
||||
private val selections = mutableMapOf<Long, Int>()
|
||||
private val selectedColor = ContextCompat.getColor(
|
||||
@@ -74,7 +74,7 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
|
||||
fun getContent(
|
||||
position: Int
|
||||
) = (getItem(position) as Cursor?)?.getString(contentIndex)
|
||||
) = (getItem(position) as Cursor?)?.getString(textIndex)
|
||||
|
||||
override fun newView(
|
||||
context: Context,
|
||||
@@ -92,7 +92,7 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
getViewHolder(view).apply {
|
||||
timeView.text = formatDateTime(cursor.getString(timeIndex))
|
||||
val name = cursor.getString(nameIndex)
|
||||
val content = cursor.getString(contentIndex)
|
||||
val text = cursor.getString(textIndex)
|
||||
var icon = 0
|
||||
contentView.text = when {
|
||||
name?.isNotEmpty() == true -> {
|
||||
@@ -100,16 +100,16 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
name
|
||||
}
|
||||
|
||||
content.isNullOrEmpty() -> context.getString(
|
||||
text.isNullOrEmpty() -> context.getString(
|
||||
R.string.binary_data
|
||||
)
|
||||
|
||||
else -> content
|
||||
else -> text
|
||||
}
|
||||
contentView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
icon, 0, 0, 0
|
||||
)
|
||||
formatView.text = prettifyFormatName(cursor.getString(formatIndex))
|
||||
formatView.text = cursor.getString(formatIndex).prettifyFormatName()
|
||||
}
|
||||
val selected = selections[cursor.getLong(idIndex)] != null
|
||||
view.post {
|
||||
@@ -139,7 +139,7 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
)
|
||||
}
|
||||
|
||||
fun prettifyFormatName(format: String) = format.replace("_", " ")
|
||||
fun String.prettifyFormatName() = replace("_", " ")
|
||||
|
||||
private fun formatDateTime(rfc: String): String {
|
||||
try {
|
||||
@@ -149,7 +149,7 @@ private fun formatDateTime(rfc: String): String {
|
||||
DateFormat.SHORT
|
||||
).format(it)
|
||||
}
|
||||
} catch (e: ParseException) {
|
||||
} catch (_: ParseException) {
|
||||
// Ignore and fall through.
|
||||
}
|
||||
return rfc
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
package de.markusfisch.android.binaryeye.automation
|
||||
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.net.urlEncode
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
import java.util.Locale
|
||||
|
||||
data class AutomatedAction(
|
||||
val pattern: String,
|
||||
val type: Type,
|
||||
val urlTemplate: String? = null,
|
||||
val intentUriTemplate: String? = null
|
||||
) {
|
||||
enum class Type {
|
||||
Intent, CustomIntent
|
||||
}
|
||||
|
||||
fun matches(content: String): Boolean = try {
|
||||
Regex(pattern).matches(content)
|
||||
} catch (_: Exception) {
|
||||
false
|
||||
}
|
||||
|
||||
fun toJson(): JSONObject = JSONObject().apply {
|
||||
put(KEY_PATTERN, pattern)
|
||||
put(KEY_TYPE, type.name.lowercase(Locale.ROOT))
|
||||
put(KEY_URL_TEMPLATE, urlTemplate ?: "")
|
||||
put(KEY_INTENT_URI_TEMPLATE, intentUriTemplate ?: "")
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val KEY_PATTERN = "pattern"
|
||||
private const val KEY_TYPE = "type"
|
||||
private const val KEY_URL_TEMPLATE = "url_template"
|
||||
private const val KEY_INTENT_URI_TEMPLATE = "intent_uri_template"
|
||||
|
||||
fun fromJson(obj: JSONObject): AutomatedAction? {
|
||||
val pattern = obj.optString(KEY_PATTERN, "").trim()
|
||||
if (pattern.isEmpty()) {
|
||||
return null
|
||||
}
|
||||
val type = when (obj.optString(KEY_TYPE, "")) {
|
||||
"custom_intent" -> Type.CustomIntent
|
||||
"intent" -> Type.Intent
|
||||
"html" -> return null
|
||||
else -> Type.Intent
|
||||
}
|
||||
val urlTemplate = obj.optString(KEY_URL_TEMPLATE, "").trim()
|
||||
val intentUriTemplate = obj.optString(
|
||||
KEY_INTENT_URI_TEMPLATE,
|
||||
""
|
||||
).trim()
|
||||
return AutomatedAction(
|
||||
pattern = pattern,
|
||||
type = type,
|
||||
urlTemplate = urlTemplate.ifEmpty { null },
|
||||
intentUriTemplate = intentUriTemplate.ifEmpty { null }
|
||||
)
|
||||
}
|
||||
|
||||
fun fromJsonArray(json: String): MutableList<AutomatedAction> {
|
||||
val actions = ArrayList<AutomatedAction>()
|
||||
val array = try {
|
||||
JSONArray(json)
|
||||
} catch (_: Exception) {
|
||||
JSONArray()
|
||||
}
|
||||
for (i in 0 until array.length()) {
|
||||
val obj = array.optJSONObject(i) ?: continue
|
||||
fromJson(obj)?.let { actions.add(it) }
|
||||
}
|
||||
return actions
|
||||
}
|
||||
|
||||
fun toJsonArray(actions: List<AutomatedAction>): String {
|
||||
val array = JSONArray()
|
||||
actions.forEach { array.put(it.toJson()) }
|
||||
return array.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun String.buildUrl(scan: Scan): String {
|
||||
return buildTemplate(scan, encodeResult = true)
|
||||
}
|
||||
|
||||
fun String.buildTemplate(scan: Scan, encodeResult: Boolean): String {
|
||||
val text = scan.text
|
||||
val raw = scan.raw ?: text.toByteArray()
|
||||
val result = if (encodeResult) {
|
||||
text.urlEncode()
|
||||
} else {
|
||||
text
|
||||
}
|
||||
val format = if (encodeResult) {
|
||||
scan.format.name.urlEncode()
|
||||
} else {
|
||||
scan.format.name
|
||||
}
|
||||
return this
|
||||
.replace("{RESULT}", result)
|
||||
.replace("{RESULT_BYTES}", raw.toHexString())
|
||||
.replace("{FORMAT}", format)
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
package de.markusfisch.android.binaryeye.automation
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.content.execShareIntent
|
||||
import de.markusfisch.android.binaryeye.content.openUrl
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
fun Context.runAutomatedActions(scan: Scan): Boolean {
|
||||
val content = scan.text
|
||||
if (content.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
val actions = prefs.automatedActions
|
||||
if (actions.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
for (action in actions) {
|
||||
if (action.matches(content)) {
|
||||
return when (action.type) {
|
||||
AutomatedAction.Type.Intent -> {
|
||||
val url = action.urlTemplate?.buildUrl(scan)
|
||||
if (url.isNullOrEmpty()) {
|
||||
toast(R.string.automated_action_invalid_url)
|
||||
false
|
||||
} else {
|
||||
openUrl(url)
|
||||
}
|
||||
}
|
||||
|
||||
AutomatedAction.Type.CustomIntent ->
|
||||
execCustomIntent(action, scan)
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
private fun Context.execCustomIntent(
|
||||
action: AutomatedAction,
|
||||
scan: Scan
|
||||
): Boolean {
|
||||
val template = action.intentUriTemplate
|
||||
if (template.isNullOrEmpty()) {
|
||||
toast(R.string.automated_action_intent_uri_required)
|
||||
return false
|
||||
}
|
||||
val intentUri = template.buildTemplate(scan, encodeResult = false)
|
||||
val intent = try {
|
||||
Intent.parseUri(intentUri, Intent.URI_INTENT_SCHEME)
|
||||
} catch (_: Exception) {
|
||||
toast(R.string.automated_action_intent_uri_invalid)
|
||||
return false
|
||||
}
|
||||
return execShareIntent(intent)
|
||||
}
|
||||
@@ -24,7 +24,7 @@ fun Scan.sendBluetoothAsync(
|
||||
connect(host, true)
|
||||
}
|
||||
val sent = if (connected) {
|
||||
send(content, host, true)
|
||||
send(text, host)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
@@ -35,21 +35,20 @@ fun Scan.sendBluetoothAsync(
|
||||
}
|
||||
|
||||
fun setBluetoothHosts(listPref: ListPreference) {
|
||||
val devices = try {
|
||||
BluetoothAdapter.getDefaultAdapter().bondedDevices
|
||||
} catch (e: SecurityException) {
|
||||
try {
|
||||
val devices = blue.bondedDevices ?: return
|
||||
listPref.entries = devices.map {
|
||||
it.name
|
||||
}.toTypedArray()
|
||||
listPref.entryValues = devices.map {
|
||||
it.address
|
||||
}.toTypedArray()
|
||||
listPref.callChangeListener(listPref.value)
|
||||
} catch (_: SecurityException) {
|
||||
// Do nothing, either the user has denied Bluetooth access
|
||||
// or the permission was removed by the system. We're catching
|
||||
// the exception to keep the app from crashing.
|
||||
null
|
||||
} ?: return
|
||||
listPref.entries = devices.map {
|
||||
it.name
|
||||
}.toTypedArray()
|
||||
listPref.entryValues = devices.map {
|
||||
it.address
|
||||
}.toTypedArray()
|
||||
listPref.callChangeListener(listPref.value)
|
||||
}
|
||||
}
|
||||
|
||||
private var socket: BluetoothSocket? = null
|
||||
@@ -71,39 +70,41 @@ private fun connect(deviceName: String, onceMore: Boolean): Boolean = try {
|
||||
writer = socket?.outputStream?.writer()
|
||||
isConnected = true
|
||||
true
|
||||
} catch (e: Exception) {
|
||||
if (onceMore)
|
||||
} catch (_: Exception) {
|
||||
if (onceMore) {
|
||||
connect(deviceName, false)
|
||||
else
|
||||
} else {
|
||||
close()
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
private fun send(message: String, host: String, onceMore: Boolean): Boolean = try {
|
||||
private fun send(message: String, host: String): Boolean = try {
|
||||
writer?.apply {
|
||||
write(message)
|
||||
write("\n")
|
||||
flush()
|
||||
}
|
||||
true
|
||||
} catch (e: Exception) {
|
||||
} catch (_: Exception) {
|
||||
close()
|
||||
|
||||
if (connect(host, false))
|
||||
send(message, host, false)
|
||||
else
|
||||
if (connect(host, false)) {
|
||||
send(message, host)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
private fun close() {
|
||||
try {
|
||||
writer?.close()
|
||||
} catch (e: IOException) {
|
||||
} catch (_: IOException) {
|
||||
// Catch exception if writer wasn't initialized.
|
||||
}
|
||||
try {
|
||||
socket?.close()
|
||||
} catch (e: IOException) {
|
||||
} catch (_: IOException) {
|
||||
// Nothing we can do about this but keep
|
||||
// the app from crashing.
|
||||
}
|
||||
@@ -113,11 +114,15 @@ private fun close() {
|
||||
}
|
||||
|
||||
private fun findByName(findableName: String): BluetoothDevice? {
|
||||
val deviceList = blue.bondedDevices
|
||||
for (device in deviceList) {
|
||||
if (device.address == findableName) {
|
||||
return device
|
||||
try {
|
||||
val deviceList = blue.bondedDevices
|
||||
for (device in deviceList) {
|
||||
if (device.address == findableName) {
|
||||
return device
|
||||
}
|
||||
}
|
||||
} catch (_: SecurityException) {
|
||||
// Fall through.
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -34,18 +34,23 @@ enum class BarcodeColors {
|
||||
}
|
||||
}
|
||||
|
||||
fun Scan.toBarcode() = if (symbol != null) {
|
||||
BitMatrixBarcode(
|
||||
symbol,
|
||||
content,
|
||||
format
|
||||
)
|
||||
} else {
|
||||
ContentBarcode(
|
||||
content,
|
||||
format,
|
||||
errorCorrectionLevel.toErrorCorrectionInt()
|
||||
)
|
||||
fun Scan.toBarcode(): Barcode<*> {
|
||||
val content = text.ifEmpty {
|
||||
raw
|
||||
}
|
||||
return if (symbol != null) {
|
||||
BitMatrixBarcode(
|
||||
symbol,
|
||||
content,
|
||||
format
|
||||
)
|
||||
} else {
|
||||
ContentBarcode(
|
||||
content,
|
||||
format,
|
||||
errorCorrectionLevel.toErrorCorrectionInt()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun String?.toErrorCorrectionInt() = when (this) {
|
||||
@@ -56,7 +61,7 @@ fun String?.toErrorCorrectionInt() = when (this) {
|
||||
else -> -1
|
||||
}
|
||||
|
||||
abstract class Barcode<T>(
|
||||
sealed class Barcode<T>(
|
||||
val content: T,
|
||||
val format: BarcodeFormat,
|
||||
val colors: BarcodeColors
|
||||
@@ -91,17 +96,23 @@ abstract class Barcode<T>(
|
||||
}
|
||||
|
||||
protected abstract fun toText(): String
|
||||
|
||||
fun textOrHex(): String = when (content) {
|
||||
is String -> content
|
||||
is ByteArray -> content.toHexString()
|
||||
else -> throw IllegalArgumentException("Illegal arguments")
|
||||
}
|
||||
}
|
||||
|
||||
class ContentBarcode<T>(
|
||||
content: T,
|
||||
format: BarcodeFormat,
|
||||
val ecLevel: Int = -1,
|
||||
val margin: Int = -1,
|
||||
val margin: Int = 1,
|
||||
colors: BarcodeColors = BarcodeColors.BLACK_ON_WHITE
|
||||
) : Barcode<T>(content, format, colors) {
|
||||
override fun toBitmap(size: Int) = ZxingCpp.encodeAsBitmap(
|
||||
content, format, size, size, margin, ecLevel,
|
||||
content, format, size, format.height(size), margin, ecLevel,
|
||||
setColor = colors.foregroundColor(),
|
||||
unsetColor = colors.backgroundColor()
|
||||
)
|
||||
@@ -172,3 +183,21 @@ private fun BitMatrix.inflate(
|
||||
}
|
||||
return scaled
|
||||
}
|
||||
|
||||
private fun BarcodeFormat.height(size: Int) = when (this) {
|
||||
// 1D barcodes don't need as much vertical space.
|
||||
BarcodeFormat.CODABAR,
|
||||
BarcodeFormat.CODE_39,
|
||||
BarcodeFormat.CODE_93,
|
||||
BarcodeFormat.CODE_128,
|
||||
BarcodeFormat.DATA_BAR,
|
||||
BarcodeFormat.DATA_BAR_EXPANDED,
|
||||
BarcodeFormat.DX_FILM_EDGE,
|
||||
BarcodeFormat.EAN_8,
|
||||
BarcodeFormat.EAN_13,
|
||||
BarcodeFormat.ITF,
|
||||
BarcodeFormat.UPC_A,
|
||||
BarcodeFormat.UPC_E -> size / 3
|
||||
|
||||
else -> size
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package de.markusfisch.android.binaryeye.content
|
||||
|
||||
fun ByteArray.toHexString() = joinToString("") { "%02X".format(it) }
|
||||
@@ -0,0 +1,67 @@
|
||||
package de.markusfisch.android.binaryeye.content
|
||||
|
||||
import android.content.Context
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
|
||||
private val idToLabel = hashMapOf(
|
||||
"DCA" to R.string.idl_vehicle_class,
|
||||
"DCB" to R.string.idl_restriction_codes,
|
||||
"DCD" to R.string.idl_endorsement_codes,
|
||||
"DBA" to R.string.idl_date_of_expiry,
|
||||
"DCS" to R.string.idl_customer_family_name,
|
||||
"DAC" to R.string.idl_customer_first_name,
|
||||
"DCT" to R.string.idl_customer_first_name_alt,
|
||||
"DAD" to R.string.idl_customer_middle_name,
|
||||
"DBD" to R.string.idl_date_of_issue,
|
||||
"DBB" to R.string.idl_date_of_birth,
|
||||
"DBC" to R.string.idl_sex,
|
||||
"DAY" to R.string.idl_eye_color,
|
||||
"DAU" to R.string.idl_body_height,
|
||||
"DAG" to R.string.idl_address_street,
|
||||
"DAI" to R.string.idl_address_city,
|
||||
"DAJ" to R.string.idl_address_jurisdiction_code,
|
||||
"DAK" to R.string.idl_address_postal_code,
|
||||
"DAQ" to R.string.idl_customer_id_number,
|
||||
"DCF" to R.string.idl_document_discriminator,
|
||||
"DCG" to R.string.idl_country,
|
||||
"DDE" to R.string.idl_family_name_truncation,
|
||||
"DDF" to R.string.idl_first_name_truncation,
|
||||
"DDG" to R.string.idl_middle_name_truncation,
|
||||
"DAH" to R.string.idl_address_street_2,
|
||||
"DAZ" to R.string.idl_hair_color,
|
||||
"DCI" to R.string.idl_place_of_birth,
|
||||
"DCJ" to R.string.idl_audit_information,
|
||||
"DCK" to R.string.idl_inventory_control_number,
|
||||
"DBN" to R.string.idl_alias_family_name,
|
||||
"DBG" to R.string.idl_alias_given_name,
|
||||
"DBS" to R.string.idl_alias_suffix_name,
|
||||
"DCU" to R.string.idl_name_suffix,
|
||||
"DCE" to R.string.idl_weight_range,
|
||||
"DCL" to R.string.idl_ethnicity,
|
||||
"DCM" to R.string.idl_standard_vehicle_classification,
|
||||
"DCN" to R.string.idl_standard_endorsement_code,
|
||||
"DCO" to R.string.idl_standard_restriction_code,
|
||||
"DCP" to R.string.idl_vehicle_classification_description,
|
||||
"DCQ" to R.string.idl_endorsement_code_description,
|
||||
"DCR" to R.string.idl_restriction_code_description,
|
||||
"DDA" to R.string.idl_compliance_type,
|
||||
"DDB" to R.string.idl_card_revision_date,
|
||||
"DDC" to R.string.idl_hazmat_endorsement_expiration_date,
|
||||
"DDD" to R.string.idl_limited_duration_document_indicator,
|
||||
"DAW" to R.string.idl_weight_pounds,
|
||||
"DAX" to R.string.idl_weight_kilograms,
|
||||
"DDH" to R.string.idl_under_18_until_date,
|
||||
"DDI" to R.string.idl_under_19_until_date,
|
||||
"DDJ" to R.string.idl_under_21_until_date,
|
||||
"DDK" to R.string.idl_organ_donor_indicator,
|
||||
"DDL" to R.string.idl_veteran_indicator
|
||||
)
|
||||
|
||||
fun Context.idlToRes(id: String): String {
|
||||
val resId = idToLabel[id]
|
||||
return if (resId != null) {
|
||||
getString(resId)
|
||||
} else {
|
||||
id
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
package de.markusfisch.android.binaryeye.content
|
||||
|
||||
data class IdlInfo(
|
||||
var iin: String? = null,
|
||||
val elements: MutableMap<String, String> = linkedMapOf()
|
||||
)
|
||||
|
||||
object IdlParser {
|
||||
private fun resolveSex(value: String): String = when (value.firstOrNull()) {
|
||||
'1' -> "M"
|
||||
'2' -> "F"
|
||||
'9' -> "X"
|
||||
else -> value
|
||||
}
|
||||
|
||||
private fun skipWhitespace(s: String, p: Int): Int {
|
||||
var i = p
|
||||
while (i < s.length && s[i].isWhitespace()) {
|
||||
++i;
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
private fun findSubType(s: String, idlInfo: IdlInfo): String {
|
||||
val len = s.length
|
||||
var p = skipWhitespace(s, 0)
|
||||
|
||||
if (p < len && s[p] == '@') {
|
||||
while (p < len) {
|
||||
if (!s[p].isDigit()) {
|
||||
++p
|
||||
continue
|
||||
}
|
||||
var d = p
|
||||
while (d < len && s[d].isDigit()) {
|
||||
++d
|
||||
}
|
||||
if (d - p < 8 || len - d < 3) {
|
||||
p = d
|
||||
continue
|
||||
}
|
||||
|
||||
val code = s.substring(d, d + 2)
|
||||
if (code != "DL" && code != "ID") {
|
||||
p = d + 2
|
||||
continue
|
||||
}
|
||||
|
||||
idlInfo.elements["DL"] = code
|
||||
d += 2
|
||||
|
||||
while (d < len) {
|
||||
while (d < len && s[d] !in "DI") {
|
||||
++d
|
||||
}
|
||||
if (len - d < 2) break
|
||||
|
||||
val sec = s.substring(d, d + 2)
|
||||
if (sec == "DL" || sec == "ID") {
|
||||
return s.substring(d + 2)
|
||||
}
|
||||
++d
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
private fun findIIN(s: String): String? {
|
||||
val ansi = s.indexOf("ANSI").takeIf { it >= 0 } ?: return null
|
||||
var p = ansi + 4
|
||||
val len = s.length
|
||||
val whitespaceSkipped = skipWhitespace(s, p)
|
||||
if (whitespaceSkipped == p) {
|
||||
return null
|
||||
}
|
||||
p = whitespaceSkipped
|
||||
val iinStart = p
|
||||
var digits = 0
|
||||
while (digits < 6 && p < len && s[p].isDigit()) {
|
||||
++p
|
||||
++digits
|
||||
}
|
||||
return s.substring(iinStart, p)
|
||||
}
|
||||
|
||||
fun parse(s: String?): IdlInfo? {
|
||||
if (s.isNullOrEmpty()) {
|
||||
return null
|
||||
}
|
||||
|
||||
val idlInfo = IdlInfo().apply {
|
||||
iin = findIIN(s)
|
||||
}
|
||||
val data = findSubType(s, idlInfo)
|
||||
val len = data.length
|
||||
var start = 0
|
||||
|
||||
for (p in 0..len) {
|
||||
if (p < len && data[p] > '\u001f') {
|
||||
continue
|
||||
}
|
||||
|
||||
if (p - start > 3) {
|
||||
val vp = start + 3
|
||||
val key = data.substring(start, vp)
|
||||
|
||||
if (key.matches(Regex("[DZ][A-Z]{2}"))) {
|
||||
var value = data.substring(vp, p)
|
||||
if (key == "DBC") {
|
||||
value = resolveSex(value)
|
||||
}
|
||||
idlInfo.elements[key] = value.trim()
|
||||
}
|
||||
}
|
||||
start = p + 1
|
||||
}
|
||||
|
||||
return if (idlInfo.elements.isEmpty()) null else idlInfo
|
||||
}
|
||||
}
|
||||
@@ -33,12 +33,20 @@ fun Context.startIntent(intent: Intent): Boolean = try {
|
||||
// necessary.
|
||||
startActivity(intent)
|
||||
true
|
||||
} catch (e: ActivityNotFoundException) {
|
||||
} catch (_: ActivityNotFoundException) {
|
||||
false
|
||||
}
|
||||
|
||||
fun Context.openUrl(url: String, silent: Boolean = false): Boolean {
|
||||
val intent = Intent(Intent.ACTION_VIEW, url.parseAndNormalizeUri())
|
||||
return openUri(url.parseAndNormalizeUri(), silent)
|
||||
}
|
||||
|
||||
fun Context.openUri(uri: Uri, silent: Boolean = false): Boolean {
|
||||
val intent = Intent(Intent.ACTION_VIEW, uri).apply {
|
||||
if (uri.scheme == "content") {
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
}
|
||||
}
|
||||
return if (silent) {
|
||||
startIntent(intent)
|
||||
} else {
|
||||
@@ -91,7 +99,7 @@ fun <T> Context.shareAsFile(content: T, fileName: String) {
|
||||
FileOutputStream(file).use {
|
||||
it.write(bytes)
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
} catch (_: IOException) {
|
||||
toast(R.string.error_saving_file)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package de.markusfisch.android.binaryeye.database
|
||||
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import de.markusfisch.android.binaryeye.content.toHexString
|
||||
import de.markusfisch.android.binaryeye.io.writeExternalFile
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.OutputStream
|
||||
@@ -33,7 +32,7 @@ private fun exportCsv(
|
||||
Database.SCANS_DATETIME,
|
||||
Database.SCANS_FORMAT,
|
||||
Database.SCANS_NAME,
|
||||
Database.SCANS_CONTENT,
|
||||
Database.SCANS_TEXT,
|
||||
Database.SCANS_ERROR_CORRECTION_LEVEL,
|
||||
Database.SCANS_VERSION,
|
||||
Database.SCANS_SEQUENCE_SIZE,
|
||||
@@ -47,7 +46,7 @@ private fun exportCsv(
|
||||
val indices = columns.map {
|
||||
cursor.getColumnIndex(it)
|
||||
}
|
||||
val contentIndex = cursor.getColumnIndex(Database.SCANS_CONTENT)
|
||||
val contentIndex = cursor.getColumnIndex(Database.SCANS_TEXT)
|
||||
val rawIndex = cursor.getColumnIndex(Database.SCANS_RAW)
|
||||
outputStream.write(
|
||||
columns.joinToString(
|
||||
|
||||
@@ -21,7 +21,7 @@ class Database {
|
||||
$SCANS_ID,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_CONTENT,
|
||||
$SCANS_TEXT,
|
||||
$SCANS_FORMAT
|
||||
FROM $SCANS
|
||||
${getWhereClause(query)}
|
||||
@@ -34,7 +34,7 @@ class Database {
|
||||
$SCANS_ID,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_CONTENT,
|
||||
$SCANS_TEXT,
|
||||
$SCANS_RAW,
|
||||
$SCANS_FORMAT,
|
||||
$SCANS_ERROR_CORRECTION_LEVEL,
|
||||
@@ -56,7 +56,7 @@ class Database {
|
||||
query: String?,
|
||||
prefix: String = "WHERE"
|
||||
) = if (query?.isNotEmpty() == true) {
|
||||
"""$prefix $SCANS_CONTENT LIKE ?
|
||||
"""$prefix $SCANS_TEXT LIKE ?
|
||||
OR $SCANS_NAME LIKE ?"""
|
||||
} else {
|
||||
""
|
||||
@@ -76,7 +76,7 @@ class Database {
|
||||
$SCANS_ID,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_CONTENT,
|
||||
$SCANS_TEXT,
|
||||
$SCANS_RAW,
|
||||
$SCANS_FORMAT,
|
||||
$SCANS_ERROR_CORRECTION_LEVEL,
|
||||
@@ -99,7 +99,7 @@ class Database {
|
||||
$SCANS_ID,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_CONTENT,
|
||||
$SCANS_TEXT,
|
||||
$SCANS_RAW,
|
||||
$SCANS_FORMAT,
|
||||
$SCANS_ERROR_CORRECTION_LEVEL,
|
||||
@@ -121,7 +121,7 @@ class Database {
|
||||
).use {
|
||||
if (it.moveToFirst()) {
|
||||
Scan(
|
||||
it.getString(SCANS_CONTENT),
|
||||
it.getString(SCANS_TEXT),
|
||||
it.getBlob(SCANS_RAW),
|
||||
BarcodeFormat.valueOf(it.getString(SCANS_FORMAT)),
|
||||
it.getString(SCANS_ERROR_CORRECTION_LEVEL),
|
||||
@@ -152,7 +152,7 @@ class Database {
|
||||
when (prefs.ignoreDuplicates()) {
|
||||
Preferences.Companion.IgnoreDuplicates.Consecutive -> {
|
||||
val id = getIdOfLastScan(
|
||||
scan.content,
|
||||
scan.text,
|
||||
scan.raw,
|
||||
scan.format
|
||||
)
|
||||
@@ -162,7 +162,7 @@ class Database {
|
||||
}
|
||||
|
||||
Preferences.Companion.IgnoreDuplicates.Any -> {
|
||||
val id = getIdOfScanByContent(scan.content, scan.format)
|
||||
val id = getIdOfScanByContent(scan.text, scan.format)
|
||||
if (id > 0L) {
|
||||
return id
|
||||
}
|
||||
@@ -175,7 +175,7 @@ class Database {
|
||||
null,
|
||||
ContentValues().apply {
|
||||
put(SCANS_DATETIME, scan.dateTime)
|
||||
put(SCANS_CONTENT, scan.content)
|
||||
put(SCANS_TEXT, scan.text)
|
||||
if (scan.raw != null) {
|
||||
put(SCANS_RAW, scan.raw)
|
||||
}
|
||||
@@ -208,7 +208,7 @@ class Database {
|
||||
): Long = db.rawQuery(
|
||||
"""SELECT
|
||||
$SCANS_ID,
|
||||
$SCANS_CONTENT,
|
||||
$SCANS_TEXT,
|
||||
$SCANS_RAW,
|
||||
$SCANS_FORMAT
|
||||
FROM $SCANS
|
||||
@@ -218,7 +218,7 @@ class Database {
|
||||
).use {
|
||||
if (it.count > 0 &&
|
||||
it.moveToFirst() &&
|
||||
it.getString(SCANS_CONTENT) == content &&
|
||||
it.getString(SCANS_TEXT) == content &&
|
||||
(raw == null || it.getBlob(SCANS_RAW)
|
||||
?.contentEquals(raw) == true) &&
|
||||
it.getString(SCANS_FORMAT) == format.name
|
||||
@@ -236,7 +236,7 @@ class Database {
|
||||
"""SELECT
|
||||
$SCANS_ID
|
||||
FROM $SCANS
|
||||
WHERE $SCANS_CONTENT = ?
|
||||
WHERE $SCANS_TEXT = ?
|
||||
AND $SCANS_FORMAT = ?
|
||||
LIMIT 1
|
||||
""".trimMargin(), arrayOf(content, format.name)
|
||||
@@ -303,7 +303,7 @@ class Database {
|
||||
const val SCANS_ID = "_id"
|
||||
const val SCANS_DATETIME = "_datetime"
|
||||
const val SCANS_NAME = "name"
|
||||
const val SCANS_CONTENT = "content"
|
||||
const val SCANS_TEXT = "content"
|
||||
const val SCANS_RAW = "raw"
|
||||
const val SCANS_FORMAT = "format"
|
||||
const val SCANS_ERROR_CORRECTION_LEVEL = "error_correction_level"
|
||||
@@ -335,7 +335,7 @@ class Database {
|
||||
$SCANS_ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
$SCANS_DATETIME DATETIME NOT NULL,
|
||||
$SCANS_NAME TEXT,
|
||||
$SCANS_CONTENT TEXT NOT NULL,
|
||||
$SCANS_TEXT TEXT NOT NULL,
|
||||
$SCANS_RAW BLOB,
|
||||
$SCANS_FORMAT TEXT NOT NULL,
|
||||
$SCANS_ERROR_CORRECTION_LEVEL TEXT,
|
||||
@@ -398,6 +398,7 @@ class Database {
|
||||
|
||||
private fun SQLiteDatabase.addDataMaskColumn() {
|
||||
execSQL("ALTER TABLE $SCANS ADD $SCANS_DATA_MASK INTEGER")
|
||||
execSQL("UPDATE $SCANS SET $SCANS_DATA_MASK = -1")
|
||||
}
|
||||
|
||||
private fun SQLiteDatabase.addSymbolColumns() {
|
||||
|
||||
@@ -2,7 +2,6 @@ package de.markusfisch.android.binaryeye.database
|
||||
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import de.markusfisch.android.binaryeye.content.toHexString
|
||||
import de.markusfisch.android.binaryeye.io.writeExternalFile
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONException
|
||||
@@ -25,7 +24,7 @@ fun Cursor.exportJson(): String? {
|
||||
Database.SCANS_DATETIME,
|
||||
Database.SCANS_FORMAT,
|
||||
Database.SCANS_NAME,
|
||||
Database.SCANS_CONTENT,
|
||||
Database.SCANS_TEXT,
|
||||
Database.SCANS_ERROR_CORRECTION_LEVEL,
|
||||
Database.SCANS_VERSION,
|
||||
Database.SCANS_SEQUENCE_SIZE,
|
||||
@@ -39,7 +38,7 @@ fun Cursor.exportJson(): String? {
|
||||
val indices = columns.map {
|
||||
Pair(getColumnIndex(it), it)
|
||||
}
|
||||
val contentIndex = getColumnIndex(Database.SCANS_CONTENT)
|
||||
val contentIndex = getColumnIndex(Database.SCANS_TEXT)
|
||||
val rawIndex = getColumnIndex(Database.SCANS_RAW)
|
||||
val root = JSONArray()
|
||||
do {
|
||||
@@ -70,7 +69,7 @@ private fun Cursor.toJsonObject(
|
||||
obj.put(it.second, value ?: "")
|
||||
}
|
||||
obj
|
||||
} catch (e: JSONException) {
|
||||
} catch (_: JSONException) {
|
||||
obj
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,12 @@ import de.markusfisch.android.zxingcpp.ZxingCpp.Result
|
||||
import java.util.Locale
|
||||
|
||||
data class Scan(
|
||||
val content: String,
|
||||
val text: String,
|
||||
val raw: ByteArray?,
|
||||
val format: BarcodeFormat,
|
||||
val errorCorrectionLevel: String? = null,
|
||||
val version: String? = null,
|
||||
val dataMask: Int = 0,
|
||||
val dataMask: Int = -1,
|
||||
val symbol: BitMatrix? = null,
|
||||
val sequenceSize: Int = -1,
|
||||
val sequenceIndex: Int = -1,
|
||||
@@ -43,9 +43,10 @@ data class Scan(
|
||||
|
||||
return id == other.id &&
|
||||
dateTime == other.dateTime &&
|
||||
content == other.content &&
|
||||
text == other.text &&
|
||||
((raw == null && other.raw == null) ||
|
||||
(raw != null && other.raw != null && raw.contentEquals(other.raw))) &&
|
||||
(raw != null && other.raw != null &&
|
||||
raw.contentEquals(other.raw))) &&
|
||||
format == other.format &&
|
||||
errorCorrectionLevel == other.errorCorrectionLevel &&
|
||||
version == other.version &&
|
||||
@@ -64,7 +65,7 @@ data class Scan(
|
||||
override fun hashCode(): Int {
|
||||
var result = id.hashCode()
|
||||
result = 31 * result + dateTime.hashCode()
|
||||
result = 31 * result + content.hashCode()
|
||||
result = 31 * result + text.hashCode()
|
||||
result = 31 * result + (raw?.contentHashCode() ?: 0)
|
||||
result = 31 * result + format.hashCode()
|
||||
result = 31 * result + (errorCorrectionLevel?.hashCode() ?: 0)
|
||||
@@ -81,7 +82,7 @@ data class Scan(
|
||||
}
|
||||
|
||||
private constructor(parcel: Parcel) : this(
|
||||
content = parcel.readString() ?: "",
|
||||
text = parcel.readString() ?: "",
|
||||
raw = parcel.readSizedByteArray(),
|
||||
format = BarcodeFormat.valueOf(parcel.readString() ?: ""),
|
||||
errorCorrectionLevel = parcel.readString(),
|
||||
@@ -102,7 +103,7 @@ data class Scan(
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
parcel.apply {
|
||||
writeString(content)
|
||||
writeString(text)
|
||||
writeSizedByteArray(raw)
|
||||
writeString(format.name)
|
||||
writeString(errorCorrectionLevel)
|
||||
@@ -140,7 +141,7 @@ fun Result.toScan(): Scan {
|
||||
ContentType.ISO15434,
|
||||
ContentType.TEXT -> text
|
||||
|
||||
else -> ""
|
||||
else -> "" // Show as binary.
|
||||
},
|
||||
rawBytes,
|
||||
format,
|
||||
|
||||
+280
@@ -0,0 +1,280 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.app.AlertDialog
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.EditText
|
||||
import android.widget.ListView
|
||||
import android.widget.RadioGroup
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.automation.AutomatedAction
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
|
||||
|
||||
class AutomatedActionsFragment : Fragment() {
|
||||
private val actions = ArrayList<AutomatedAction>()
|
||||
|
||||
private lateinit var adapter: ActionsAdapter
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
state: Bundle?
|
||||
): View? {
|
||||
val ac = activity ?: return null
|
||||
ac.setTitle(R.string.automated_actions)
|
||||
|
||||
val view = inflater.inflate(
|
||||
R.layout.fragment_automated_actions,
|
||||
container,
|
||||
false
|
||||
)
|
||||
|
||||
actions.clear()
|
||||
actions.addAll(prefs.automatedActions)
|
||||
|
||||
val listView = view.findViewById<ListView>(R.id.actions)
|
||||
listView.emptyView = view.findViewById(R.id.no_actions)
|
||||
adapter = ActionsAdapter(ac, actions)
|
||||
listView.adapter = adapter
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
listView.setOnItemClickListener { _, _, position, _ ->
|
||||
editAction(position)
|
||||
}
|
||||
listView.setOnItemLongClickListener { _, _, position, _ ->
|
||||
confirmRemoveAction(position)
|
||||
true
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.add).setOnClickListener {
|
||||
editAction(null)
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
private fun editAction(position: Int?) {
|
||||
val ac = activity ?: return
|
||||
val action = position?.let { actions[it] }
|
||||
val view = ac.layoutInflater.inflate(
|
||||
R.layout.dialog_automated_action,
|
||||
null
|
||||
)
|
||||
val regexView = view.findViewById<EditText>(R.id.regex)
|
||||
val urlView = view.findViewById<EditText>(R.id.url_template)
|
||||
val typeGroup = view.findViewById<RadioGroup>(R.id.action_type)
|
||||
val urlSection = view.findViewById<View>(R.id.url_section)
|
||||
val intentSection = view.findViewById<View>(R.id.intent_section)
|
||||
val intentUriView = view.findViewById<EditText>(
|
||||
R.id.intent_uri_template
|
||||
)
|
||||
|
||||
if (action != null) {
|
||||
regexView.setText(action.pattern)
|
||||
when (action.type) {
|
||||
AutomatedAction.Type.Intent -> {
|
||||
urlView.setText(action.urlTemplate ?: "")
|
||||
}
|
||||
|
||||
AutomatedAction.Type.CustomIntent -> {
|
||||
intentUriView.setText(action.intentUriTemplate ?: "")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateTypeSections(checkedId: Int) {
|
||||
val isIntent = checkedId == R.id.action_type_intent
|
||||
urlSection.visibility = if (isIntent) View.VISIBLE else View.GONE
|
||||
intentSection.visibility = if (isIntent) View.GONE else View.VISIBLE
|
||||
}
|
||||
|
||||
typeGroup.setOnCheckedChangeListener { _, checkedId ->
|
||||
updateTypeSections(checkedId)
|
||||
}
|
||||
val initialTypeId = if (
|
||||
action?.type == AutomatedAction.Type.CustomIntent
|
||||
) {
|
||||
R.id.action_type_custom_intent
|
||||
} else {
|
||||
R.id.action_type_intent
|
||||
}
|
||||
typeGroup.check(initialTypeId)
|
||||
updateTypeSections(initialTypeId)
|
||||
|
||||
val dialog = AlertDialog.Builder(ac)
|
||||
.setTitle(
|
||||
if (action == null) {
|
||||
R.string.automated_action_add
|
||||
} else {
|
||||
R.string.automated_action_edit
|
||||
}
|
||||
)
|
||||
.setView(view)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.create()
|
||||
|
||||
dialog.setOnShowListener {
|
||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
|
||||
addOrUpdateAction(
|
||||
position,
|
||||
regexView,
|
||||
urlView,
|
||||
typeGroup,
|
||||
intentUriView,
|
||||
dialog
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
dialog.show()
|
||||
}
|
||||
|
||||
private fun addOrUpdateAction(
|
||||
position: Int?,
|
||||
regexView: EditText,
|
||||
urlView: EditText,
|
||||
typeGroup: RadioGroup,
|
||||
intentUriView: EditText,
|
||||
dialog: Dialog,
|
||||
) {
|
||||
val pattern = regexView.text.toString().trim()
|
||||
if (pattern.isEmpty()) {
|
||||
regexView.error = getString(R.string.automated_action_regex_required)
|
||||
return
|
||||
}
|
||||
try {
|
||||
Regex(pattern)
|
||||
} catch (_: Exception) {
|
||||
regexView.error = getString(R.string.automated_action_regex_invalid)
|
||||
return
|
||||
}
|
||||
val isIntent = typeGroup.checkedRadioButtonId == R.id.action_type_intent
|
||||
val newAction = if (isIntent) {
|
||||
val urlTemplate = urlView.text.toString().trim()
|
||||
if (urlTemplate.isEmpty()) {
|
||||
urlView.error = getString(R.string.automated_action_url_required)
|
||||
return
|
||||
}
|
||||
AutomatedAction(
|
||||
pattern = pattern,
|
||||
type = AutomatedAction.Type.Intent,
|
||||
urlTemplate = urlTemplate
|
||||
)
|
||||
} else {
|
||||
val intentUriTemplate = intentUriView.text.toString().trim()
|
||||
if (intentUriTemplate.isEmpty()) {
|
||||
intentUriView.error = getString(
|
||||
R.string.automated_action_intent_uri_required
|
||||
)
|
||||
return
|
||||
}
|
||||
if (!intentUriTemplate.startsWith(
|
||||
"intent:",
|
||||
ignoreCase = true
|
||||
)
|
||||
) {
|
||||
intentUriView.error = getString(
|
||||
R.string.automated_action_intent_uri_invalid
|
||||
)
|
||||
return
|
||||
}
|
||||
AutomatedAction(
|
||||
pattern = pattern,
|
||||
type = AutomatedAction.Type.CustomIntent,
|
||||
intentUriTemplate = intentUriTemplate
|
||||
)
|
||||
}
|
||||
if (position == null) {
|
||||
actions.add(newAction)
|
||||
} else {
|
||||
actions[position] = newAction
|
||||
}
|
||||
prefs.setAutomatedActions(actions)
|
||||
adapter.notifyDataSetChanged()
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
private fun confirmRemoveAction(position: Int) {
|
||||
val ac = activity ?: return
|
||||
AlertDialog.Builder(ac)
|
||||
.setMessage(R.string.automated_action_remove_confirm)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
actions.removeAt(position)
|
||||
prefs.setAutomatedActions(actions)
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.show()
|
||||
}
|
||||
|
||||
private class ActionsAdapter(
|
||||
context: Context,
|
||||
private val items: List<AutomatedAction>
|
||||
) : ArrayAdapter<AutomatedAction>(
|
||||
context,
|
||||
android.R.layout.simple_list_item_2,
|
||||
android.R.id.text1,
|
||||
items
|
||||
) {
|
||||
override fun getView(
|
||||
position: Int,
|
||||
convertView: View?,
|
||||
parent: ViewGroup
|
||||
): View {
|
||||
val view = super.getView(position, convertView, parent)
|
||||
val action = items[position]
|
||||
getViewHolder(view).apply {
|
||||
title.text = action.pattern
|
||||
subtitle.text = when (action.type) {
|
||||
AutomatedAction.Type.Intent -> if (!action.urlTemplate.isNullOrEmpty()) {
|
||||
context.getString(
|
||||
R.string.automated_action_list_intent,
|
||||
action.urlTemplate
|
||||
)
|
||||
} else {
|
||||
context.getString(R.string.automated_action_list_intent_empty)
|
||||
}
|
||||
|
||||
AutomatedAction.Type.CustomIntent ->
|
||||
if (!action.intentUriTemplate.isNullOrEmpty()) {
|
||||
context.getString(
|
||||
R.string.automated_action_list_custom_intent,
|
||||
action.intentUriTemplate
|
||||
)
|
||||
} else {
|
||||
context.getString(
|
||||
R.string.automated_action_list_custom_intent_empty
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
return view
|
||||
}
|
||||
|
||||
private fun getViewHolder(
|
||||
view: View
|
||||
): ViewHolder = view.tag as ViewHolder? ?: ViewHolder(
|
||||
view.findViewById(android.R.id.text1),
|
||||
view.findViewById(android.R.id.text2),
|
||||
).also {
|
||||
view.tag = it
|
||||
}
|
||||
|
||||
private data class ViewHolder(
|
||||
val title: TextView,
|
||||
val subtitle: TextView,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
|
||||
import android.app.AlertDialog
|
||||
import android.content.Context
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Matrix
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
@@ -14,6 +15,7 @@ import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.SeekBar
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
@@ -21,8 +23,8 @@ import de.markusfisch.android.binaryeye.app.db
|
||||
import de.markusfisch.android.binaryeye.app.hasWritePermission
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.content.Barcode
|
||||
import de.markusfisch.android.binaryeye.content.BitMatrixBarcode
|
||||
import de.markusfisch.android.binaryeye.content.BarcodeColors
|
||||
import de.markusfisch.android.binaryeye.content.BitMatrixBarcode
|
||||
import de.markusfisch.android.binaryeye.content.ContentBarcode
|
||||
import de.markusfisch.android.binaryeye.content.copyToClipboard
|
||||
import de.markusfisch.android.binaryeye.content.shareFile
|
||||
@@ -31,6 +33,7 @@ import de.markusfisch.android.binaryeye.database.toScan
|
||||
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.net.createEncodeDeeplink
|
||||
import de.markusfisch.android.binaryeye.os.getScreenBrightness
|
||||
import de.markusfisch.android.binaryeye.os.setScreenBrightness
|
||||
import de.markusfisch.android.binaryeye.view.doOnApplyWindowInsets
|
||||
@@ -60,6 +63,7 @@ class BarcodeFragment : Fragment() {
|
||||
private val parentJob = Job()
|
||||
private val scope = CoroutineScope(Dispatchers.IO + parentJob)
|
||||
|
||||
private lateinit var imageView: ConfinedScalingImageView
|
||||
private lateinit var barcode: Barcode<*>
|
||||
private lateinit var addToHistoryItem: MenuItem
|
||||
private lateinit var brightenScreenItem: MenuItem
|
||||
@@ -85,6 +89,9 @@ class BarcodeFragment : Fragment() {
|
||||
false
|
||||
)
|
||||
|
||||
// Make `imageView` available for `onPause()`.
|
||||
imageView = view.findViewById(R.id.barcode)
|
||||
|
||||
val bitmap: Bitmap
|
||||
try {
|
||||
barcode = arguments?.toBarcode() ?: throw IllegalArgumentException(
|
||||
@@ -104,12 +111,17 @@ class BarcodeFragment : Fragment() {
|
||||
return null
|
||||
}
|
||||
|
||||
val imageView = view.findViewById<ConfinedScalingImageView>(
|
||||
R.id.barcode
|
||||
)
|
||||
imageView.setImageBitmap(bitmap)
|
||||
imageView.post {
|
||||
// Make sure to invoke this after ScalingImageView.onLayout().
|
||||
imageView.runAfterLayout = {
|
||||
val scale = prefs.previewScale
|
||||
if (scale > 0) {
|
||||
imageView.setScale(
|
||||
scale,
|
||||
bitmap.width / 2f,
|
||||
bitmap.height / 2f
|
||||
)
|
||||
}
|
||||
|
||||
imageView.minWidth = min(
|
||||
imageView.minWidth / 2f,
|
||||
max(bitmap.width, bitmap.height).toFloat()
|
||||
@@ -125,8 +137,8 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
imageView.doOnApplyWindowInsets { v, insets ->
|
||||
(v as ConfinedScalingImageView).insets.set(insets)
|
||||
imageView.doOnApplyWindowInsets { _, insets ->
|
||||
imageView.insets.set(insets)
|
||||
}
|
||||
|
||||
return view
|
||||
@@ -181,6 +193,9 @@ class BarcodeFragment : Fragment() {
|
||||
if (currentBrightness > -1f) {
|
||||
restoreScreenBrightness()
|
||||
}
|
||||
if (imageView.isInBounds()) {
|
||||
prefs.previewScale = imageView.getScale()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
@@ -207,10 +222,12 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
R.id.copy_to_clipboard -> {
|
||||
context.apply {
|
||||
copyToClipboard(barcode.text())
|
||||
toast(R.string.copied_to_clipboard)
|
||||
}
|
||||
copyToClipboard(barcode.text())
|
||||
true
|
||||
}
|
||||
|
||||
R.id.copy_as_deeplink -> {
|
||||
copyToClipboard(deeplinkToCopy())
|
||||
true
|
||||
}
|
||||
|
||||
@@ -243,6 +260,18 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun copyToClipboard(text: String, isSensitive: Boolean = false) {
|
||||
activity?.apply {
|
||||
copyToClipboard(text, isSensitive)
|
||||
toast(R.string.copied_to_clipboard)
|
||||
}
|
||||
}
|
||||
|
||||
private fun deeplinkToCopy() = createEncodeDeeplink(
|
||||
format = barcode.format.name,
|
||||
content = barcode.textOrHex(),
|
||||
)
|
||||
|
||||
private fun Context.pickFileType(
|
||||
title: Int,
|
||||
action: (FileType) -> Unit
|
||||
@@ -365,7 +394,9 @@ class BarcodeFragment : Fragment() {
|
||||
) {
|
||||
val ac = activity ?: return
|
||||
scope.launch(Dispatchers.IO) {
|
||||
val message = ac.writeExternalFile(fileName, mimeType, write).toSaveResult()
|
||||
val message = ac.writeExternalFile(
|
||||
fileName, mimeType, write
|
||||
).toSaveResult()
|
||||
withContext(Dispatchers.Main) {
|
||||
ac.toast(message)
|
||||
}
|
||||
@@ -404,7 +435,7 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
true
|
||||
} catch (e: IOException) {
|
||||
} catch (_: IOException) {
|
||||
false
|
||||
}
|
||||
withContext(Dispatchers.Main) {
|
||||
@@ -419,6 +450,9 @@ class BarcodeFragment : Fragment() {
|
||||
|
||||
private fun brightenScreen() {
|
||||
activity?.let {
|
||||
if (!isAdded) {
|
||||
return
|
||||
}
|
||||
currentBrightness = it.getScreenBrightness()
|
||||
it.setScreenBrightness(1f)
|
||||
brightenScreenItem.isChecked = true
|
||||
@@ -426,7 +460,7 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun restoreScreenBrightness() {
|
||||
if (currentBrightness > -1f) {
|
||||
if (currentBrightness > -1f && isAdded) {
|
||||
activity?.setScreenBrightness(currentBrightness)
|
||||
currentBrightness = -1f
|
||||
brightenScreenItem.isChecked = false
|
||||
@@ -526,6 +560,20 @@ class BarcodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun ImageView.setScale(scale: Float, x: Float, y: Float) {
|
||||
imageMatrix = Matrix().apply {
|
||||
setTranslate(-x, -y)
|
||||
postScale(scale, scale)
|
||||
postTranslate(x, y)
|
||||
}
|
||||
}
|
||||
|
||||
private fun ImageView.getScale(): Float {
|
||||
val values = FloatArray(9)
|
||||
imageMatrix.getValues(values)
|
||||
return values[Matrix.MSCALE_X]
|
||||
}
|
||||
|
||||
private fun Bitmap.saveAsPng(outputStream: OutputStream, quality: Int = 90) =
|
||||
compress(Bitmap.CompressFormat.PNG, quality, outputStream)
|
||||
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.provider.DocumentsContract
|
||||
import android.support.design.widget.FloatingActionButton
|
||||
import android.support.v4.app.Fragment
|
||||
import android.text.Editable
|
||||
@@ -24,6 +29,12 @@ import android.widget.TableRow
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.ActionRegistry
|
||||
import de.markusfisch.android.binaryeye.actions.mail.MatMsg
|
||||
import de.markusfisch.android.binaryeye.actions.mail.MatMsgAction
|
||||
import de.markusfisch.android.binaryeye.actions.vtype.VTypeParser
|
||||
import de.markusfisch.android.binaryeye.actions.vtype.vcard.VCardAction
|
||||
import de.markusfisch.android.binaryeye.actions.vtype.vevent.VEventAction
|
||||
import de.markusfisch.android.binaryeye.actions.web.WebAction
|
||||
import de.markusfisch.android.binaryeye.actions.wifi.WifiAction
|
||||
import de.markusfisch.android.binaryeye.actions.wifi.WifiConnector
|
||||
import de.markusfisch.android.binaryeye.activity.MainActivity
|
||||
@@ -34,24 +45,29 @@ import de.markusfisch.android.binaryeye.app.hasLocationPermission
|
||||
import de.markusfisch.android.binaryeye.app.hasWritePermission
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.content.ContentBarcode
|
||||
import de.markusfisch.android.binaryeye.content.IdlParser
|
||||
import de.markusfisch.android.binaryeye.content.copyToClipboard
|
||||
import de.markusfisch.android.binaryeye.content.idlToRes
|
||||
import de.markusfisch.android.binaryeye.content.shareAsFile
|
||||
import de.markusfisch.android.binaryeye.content.shareText
|
||||
import de.markusfisch.android.binaryeye.content.toBarcode
|
||||
import de.markusfisch.android.binaryeye.content.toErrorCorrectionInt
|
||||
import de.markusfisch.android.binaryeye.content.toHexString
|
||||
import de.markusfisch.android.binaryeye.content.wipeLastShareFile
|
||||
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.net.createEncodeDeeplink
|
||||
import de.markusfisch.android.binaryeye.view.hideSoftKeyboard
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.File
|
||||
import java.security.MessageDigest
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
@@ -69,7 +85,9 @@ class DecodeFragment : Fragment() {
|
||||
private lateinit var format: String
|
||||
|
||||
private val parentJob = Job()
|
||||
private val scope: CoroutineScope = CoroutineScope(Dispatchers.Main + parentJob)
|
||||
private val scope: CoroutineScope = CoroutineScope(
|
||||
Dispatchers.Main + parentJob
|
||||
)
|
||||
private val dp: Float
|
||||
get() = resources.displayMetrics.density
|
||||
private val content: String
|
||||
@@ -79,10 +97,24 @@ class DecodeFragment : Fragment() {
|
||||
private var action = ActionRegistry.DEFAULT_ACTION
|
||||
private var isBinary = false
|
||||
private var originalBytes: ByteArray = ByteArray(0)
|
||||
private var id = 0L
|
||||
private var label: String? = null
|
||||
private var recreationSize = 0
|
||||
|
||||
override fun onActivityResult(
|
||||
requestCode: Int,
|
||||
resultCode: Int,
|
||||
resultData: Intent?
|
||||
) {
|
||||
when (requestCode) {
|
||||
OPEN_DOCUMENT -> {
|
||||
if (resultCode == Activity.RESULT_OK) {
|
||||
val uri = resultData?.data ?: return
|
||||
activity?.openPickedFile(uri)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setHasOptionsMenu(true)
|
||||
@@ -101,20 +133,21 @@ class DecodeFragment : Fragment() {
|
||||
false
|
||||
)
|
||||
|
||||
closeAutomatically = prefs.closeAutomatically &&
|
||||
activity?.intent?.hasExtra(MainActivity.DECODED) == true
|
||||
val justScanned = activity?.intent?.hasExtra(
|
||||
MainActivity.DECODED
|
||||
) == true
|
||||
closeAutomatically = prefs.closeAutomatically && justScanned
|
||||
|
||||
scan = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
arguments?.getParcelable(SCAN, Scan::class.java)
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
arguments?.getParcelable(SCAN) as Scan?
|
||||
arguments?.getParcelable(SCAN)
|
||||
} ?: throw IllegalArgumentException("DecodeFragment needs a Scan")
|
||||
|
||||
isBinary = scan.content.isEmpty()
|
||||
originalBytes = scan.raw ?: scan.content.toByteArray()
|
||||
isBinary = scan.text.isEmpty()
|
||||
originalBytes = scan.raw ?: scan.text.toByteArray()
|
||||
format = scan.format.name
|
||||
id = scan.id
|
||||
recreationSize = (200f * dp).roundToInt()
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
@@ -127,14 +160,13 @@ class DecodeFragment : Fragment() {
|
||||
labelView = view.findViewById(R.id.label)
|
||||
fab = view.findViewById(R.id.open)
|
||||
|
||||
initContentAndFab()
|
||||
|
||||
if (prefs.showMetaData) {
|
||||
metaView.fillMetaView(scan)
|
||||
} else {
|
||||
metaView.visibility = View.GONE
|
||||
}
|
||||
if (id > 0) {
|
||||
|
||||
if (scan.id > 0) {
|
||||
scan.label?.let {
|
||||
labelView.setText(it)
|
||||
label = it
|
||||
@@ -143,16 +175,18 @@ class DecodeFragment : Fragment() {
|
||||
labelView.visibility = View.GONE
|
||||
}
|
||||
|
||||
updateViewsAndFab(scan.content, originalBytes)
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
view.findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
|
||||
|
||||
initContentAndFab(justScanned)
|
||||
updateViewsAndFab(scan.text, originalBytes)
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
val id = scan.id
|
||||
if (id > 0) {
|
||||
val newLabel = labelView.text.toString().trim()
|
||||
if (newLabel != (label ?: "")) {
|
||||
@@ -160,6 +194,9 @@ class DecodeFragment : Fragment() {
|
||||
label = newLabel
|
||||
}
|
||||
}
|
||||
if (action.fired) {
|
||||
maybeBackOrFinish()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
@@ -168,7 +205,7 @@ class DecodeFragment : Fragment() {
|
||||
wipeLastShareFile()
|
||||
}
|
||||
|
||||
private fun initContentAndFab() {
|
||||
private fun initContentAndFab(justScanned: Boolean) {
|
||||
if (isBinary) {
|
||||
contentView.setText(String(originalBytes).foldNonAlNum())
|
||||
contentView.isEnabled = false
|
||||
@@ -177,7 +214,7 @@ class DecodeFragment : Fragment() {
|
||||
askForFileNameAndSave(originalBytes)
|
||||
}
|
||||
} else {
|
||||
contentView.setText(scan.content)
|
||||
contentView.setText(scan.text)
|
||||
contentView.addTextChangedListener(object : TextWatcher {
|
||||
override fun afterTextChanged(s: Editable?) {
|
||||
updateViewsAndFab(s?.toString() ?: "")
|
||||
@@ -198,10 +235,11 @@ class DecodeFragment : Fragment() {
|
||||
) = Unit
|
||||
})
|
||||
fab.setOnClickListener {
|
||||
executeAction(this.content)
|
||||
executeAction(content)
|
||||
}
|
||||
if (prefs.openImmediately) {
|
||||
executeAction(this.content)
|
||||
if (justScanned && prefs.openImmediately) {
|
||||
closeAutomatically = true
|
||||
executeAction(content)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -213,12 +251,14 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun resolveActionAndUpdateFab(bytes: ByteArray) {
|
||||
val prevAction = action
|
||||
if (!prevAction.canExecuteOn(bytes)) {
|
||||
action = ActionRegistry.getAction(bytes)
|
||||
}
|
||||
if (prevAction !== action) {
|
||||
fab.setImageResource(action.iconResId)
|
||||
if (!isBinary) {
|
||||
val prevAction = action
|
||||
if (!prevAction.canExecuteOn(bytes)) {
|
||||
action = ActionRegistry.getAction(bytes)
|
||||
}
|
||||
if (prevAction !== action) {
|
||||
fab.setImageResource(action.iconResId)
|
||||
}
|
||||
}
|
||||
// Run this for the initial action too.
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
@@ -235,7 +275,7 @@ class DecodeFragment : Fragment() {
|
||||
formatView.text = resources.getQuantityString(
|
||||
R.plurals.barcode_info,
|
||||
bytes.size,
|
||||
prettifyFormatName(format),
|
||||
format.prettifyFormatName(),
|
||||
bytes.size
|
||||
)
|
||||
hexView.showIf(prefs.showHexDump) { v ->
|
||||
@@ -255,7 +295,7 @@ class DecodeFragment : Fragment() {
|
||||
clearRecreation()
|
||||
return@showIf
|
||||
}
|
||||
unmodified = text == scan.content
|
||||
unmodified = text == scan.text
|
||||
text
|
||||
}
|
||||
val barcode = if (unmodified) {
|
||||
@@ -270,11 +310,14 @@ class DecodeFragment : Fragment() {
|
||||
try {
|
||||
v.setImageBitmap(barcode.bitmap(recreationSize))
|
||||
v.setOnClickListener {
|
||||
fragmentManager?.addFragment(
|
||||
BarcodeFragment.newInstance(barcode)
|
||||
)
|
||||
v.context.hideSoftKeyboard(contentView)
|
||||
v.post {
|
||||
fragmentManager?.addFragment(
|
||||
BarcodeFragment.newInstance(barcode)
|
||||
)
|
||||
}
|
||||
}
|
||||
} catch (e: RuntimeException) {
|
||||
} catch (_: RuntimeException) {
|
||||
clearRecreation()
|
||||
}
|
||||
}
|
||||
@@ -290,16 +333,61 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun TableLayout.fillDataView(text: String, bytes: ByteArray) {
|
||||
val items = LinkedHashMap<Int, CharSequence?>()
|
||||
val items = LinkedHashMap<Any, CharSequence?>()
|
||||
when (prefs.showChecksum) {
|
||||
"CRC4" -> items[R.string.crc4] = String.format("%X", crc4(bytes))
|
||||
"MD5" -> items[R.string.md5] = bytes.md5().toHexString().fold()
|
||||
"SHA1" -> items[R.string.sha1] = bytes.sha1().toHexString().fold()
|
||||
"SHA256" -> items[R.string.sha256] = bytes.sha256().toHexString().fold()
|
||||
"SHA256" -> items[R.string.sha256] =
|
||||
bytes.sha256().toHexString().fold()
|
||||
|
||||
else -> Unit
|
||||
}
|
||||
if (action is WifiAction) {
|
||||
WifiConnector.parseMap(text)?.let { wifiData ->
|
||||
IdlParser.parse(String(bytes))?.let {
|
||||
items.putAll(mapOf("IIN" to it.iin))
|
||||
items.putAll(
|
||||
it.elements.entries.associate { (id, value) ->
|
||||
context.idlToRes(id) to value
|
||||
}
|
||||
)
|
||||
}
|
||||
when (action) {
|
||||
is MatMsgAction -> items.putAll(
|
||||
MatMsg(text).run {
|
||||
mapOf(
|
||||
R.string.email_to to to,
|
||||
R.string.email_subject to sub,
|
||||
R.string.email_body to body
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
is VCardAction,
|
||||
is VEventAction -> VTypeParser.parseMap(text).let { vData ->
|
||||
items.putAll(
|
||||
vData.map { item ->
|
||||
item.key to item.value.joinToString("\n") {
|
||||
it.value
|
||||
}
|
||||
}.toMap()
|
||||
)
|
||||
}
|
||||
|
||||
is WebAction -> try {
|
||||
items.putAll(
|
||||
Uri.parse(text).run {
|
||||
mapOf(
|
||||
R.string.scheme to scheme,
|
||||
R.string.host to host,
|
||||
R.string.query to query
|
||||
)
|
||||
}
|
||||
)
|
||||
} catch (_: Exception) {
|
||||
// Ignore
|
||||
}
|
||||
|
||||
is WifiAction -> WifiConnector.parseMap(text)?.let { wifiData ->
|
||||
items.putAll(
|
||||
linkedMapOf(
|
||||
R.string.entry_type to getString(R.string.wifi_network),
|
||||
@@ -319,7 +407,7 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun TableLayout.fillMetaView(scan: Scan) {
|
||||
val items = linkedMapOf<Int, CharSequence?>(
|
||||
val items = linkedMapOf<Any, CharSequence?>(
|
||||
R.string.error_correction_level to scan.errorCorrectionLevel,
|
||||
R.string.sequence_size to scan.sequenceSize.positiveToString(),
|
||||
R.string.sequence_index to scan.sequenceIndex.positiveToString(),
|
||||
@@ -345,7 +433,9 @@ class DecodeFragment : Fragment() {
|
||||
)
|
||||
)
|
||||
}
|
||||
if (scan.dataMask > -1) {
|
||||
if (scan.format == ZxingCpp.BarcodeFormat.QR_CODE &&
|
||||
scan.dataMask > -1
|
||||
) {
|
||||
items.putAll(
|
||||
linkedMapOf(
|
||||
R.string.qr_data_mask to scan.dataMask.toString()
|
||||
@@ -356,7 +446,7 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
private fun TableLayout.fill(
|
||||
items: LinkedHashMap<Int, CharSequence?>
|
||||
items: LinkedHashMap<Any, CharSequence?>
|
||||
) {
|
||||
removeAllViews()
|
||||
visibility = if (items.isEmpty()) View.GONE else {
|
||||
@@ -367,10 +457,18 @@ class DecodeFragment : Fragment() {
|
||||
if (!text.isNullOrBlank()) {
|
||||
val tr = TableRow(ctx)
|
||||
val keyView = TextView(ctx)
|
||||
keyView.setText(item.key)
|
||||
val valueView = TextView(ctx)
|
||||
valueView.setPadding(spaceBetween, 0, 0, 0)
|
||||
valueView.text = text
|
||||
when (val key = item.key) {
|
||||
is Int -> keyView.setText(key)
|
||||
is String -> keyView.text = key
|
||||
else -> keyView.text = key.toString()
|
||||
}
|
||||
val valueView = TextView(ctx).apply {
|
||||
setPadding(spaceBetween, 0, 0, 0)
|
||||
this.text = text
|
||||
setOnClickListener {
|
||||
copyToClipboard(text.toString())
|
||||
}
|
||||
}
|
||||
tr.addView(keyView)
|
||||
tr.addView(valueView)
|
||||
addView(tr)
|
||||
@@ -404,6 +502,12 @@ class DecodeFragment : Fragment() {
|
||||
true
|
||||
}
|
||||
|
||||
R.id.copy_as_deeplink -> {
|
||||
copyToClipboard(deeplinkToCopy())
|
||||
maybeBackOrFinish()
|
||||
true
|
||||
}
|
||||
|
||||
R.id.share -> {
|
||||
context?.apply {
|
||||
shareText(textOrHex())
|
||||
@@ -436,7 +540,7 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
|
||||
R.id.remove -> {
|
||||
db.removeScan(id)
|
||||
db.removeScan(scan.id)
|
||||
backOrFinish()
|
||||
true
|
||||
}
|
||||
@@ -451,14 +555,16 @@ class DecodeFragment : Fragment() {
|
||||
content
|
||||
}
|
||||
|
||||
private fun deeplinkToCopy() = createEncodeDeeplink(
|
||||
format = format,
|
||||
content = textOrHex(),
|
||||
)
|
||||
|
||||
private fun copyPasswordToClipboard() {
|
||||
val ac = action
|
||||
if (ac is WifiAction) {
|
||||
ac.password?.let { password ->
|
||||
activity?.apply {
|
||||
copyToClipboard(password, isSensitive = true)
|
||||
toast(R.string.copied_password_to_clipboard)
|
||||
}
|
||||
copyToClipboard(password, isSensitive = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -466,7 +572,10 @@ class DecodeFragment : Fragment() {
|
||||
private fun copyToClipboard(text: String, isSensitive: Boolean = false) {
|
||||
activity?.apply {
|
||||
copyToClipboard(text, isSensitive)
|
||||
toast(R.string.copied_to_clipboard)
|
||||
// There's a clipboard popup from Android 13 on.
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
||||
toast(R.string.copied_to_clipboard)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -485,20 +594,51 @@ class DecodeFragment : Fragment() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun executeAction(content: String) {
|
||||
private fun executeAction(str: String) {
|
||||
val ac = activity ?: return
|
||||
if (content.isNotEmpty()) {
|
||||
if (action is WifiAction &&
|
||||
Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&
|
||||
!ac.hasLocationPermission { executeAction(content) }
|
||||
) {
|
||||
return
|
||||
}
|
||||
scope.launch {
|
||||
action.execute(ac, content.toByteArray())
|
||||
maybeBackOrFinish()
|
||||
}
|
||||
if (str.isEmpty() || openLocalDocument(str)) {
|
||||
return
|
||||
}
|
||||
if (action is WifiAction &&
|
||||
Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&
|
||||
!ac.hasLocationPermission { executeAction(str) }
|
||||
) {
|
||||
return
|
||||
}
|
||||
scope.launch {
|
||||
action.execute(ac, str.toByteArray())
|
||||
}
|
||||
}
|
||||
|
||||
private fun openLocalDocument(str: String): Boolean {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N ||
|
||||
!str.startsWith(SCHEME_FILE)
|
||||
) {
|
||||
return false
|
||||
}
|
||||
// Needs to be disabled so we get the result.
|
||||
closeAutomatically = false
|
||||
// file:// can't be used with Scoped Storage anymore.
|
||||
startActivityForResult(
|
||||
Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
|
||||
addCategory(Intent.CATEGORY_OPENABLE)
|
||||
type = "*/*"
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val primary = str.substring(
|
||||
SCHEME_FILE.length
|
||||
).localDirName() ?: Environment.getExternalStorageDirectory().path
|
||||
putExtra(
|
||||
DocumentsContract.EXTRA_INITIAL_URI,
|
||||
DocumentsContract.buildDocumentUri(
|
||||
"com.android.externalstorage.documents",
|
||||
"primary:$primary"
|
||||
)
|
||||
)
|
||||
}
|
||||
},
|
||||
OPEN_DOCUMENT
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
private fun askForFileNameAndSave(raw: ByteArray) {
|
||||
@@ -527,6 +667,8 @@ class DecodeFragment : Fragment() {
|
||||
|
||||
companion object {
|
||||
private const val SCAN = "scan"
|
||||
private const val OPEN_DOCUMENT = 1
|
||||
private const val SCHEME_FILE = "file://"
|
||||
|
||||
fun newInstance(scan: Scan): Fragment {
|
||||
val args = Bundle()
|
||||
@@ -683,17 +825,23 @@ private fun String.fromHtml() = if (
|
||||
Html.fromHtml(this)
|
||||
}
|
||||
|
||||
private fun ByteArray.md5(): ByteArray = MessageDigest.getInstance("MD5").run {
|
||||
private fun ByteArray.md5(): ByteArray = MessageDigest.getInstance(
|
||||
"MD5"
|
||||
).run {
|
||||
update(this@md5)
|
||||
digest()
|
||||
}
|
||||
|
||||
private fun ByteArray.sha1(): ByteArray = MessageDigest.getInstance("SHA-1").run {
|
||||
private fun ByteArray.sha1(): ByteArray = MessageDigest.getInstance(
|
||||
"SHA-1"
|
||||
).run {
|
||||
update(this@sha1)
|
||||
digest()
|
||||
}
|
||||
|
||||
private fun ByteArray.sha256(): ByteArray = MessageDigest.getInstance("SHA-256").run {
|
||||
private fun ByteArray.sha256(): ByteArray = MessageDigest.getInstance(
|
||||
"SHA-256"
|
||||
).run {
|
||||
update(this@sha256)
|
||||
digest()
|
||||
}
|
||||
@@ -714,3 +862,22 @@ private fun String.fold(): CharSequence {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
private fun String.localDirName(): String? = when {
|
||||
endsWith("/") -> this
|
||||
else -> File(this).parentFile?.absolutePath
|
||||
}?.replaceFirst(Regex("^/storage/emulated/0/"), "")
|
||||
?.replaceFirst(Regex("^/sdcard/"), "")
|
||||
?.trim('/')
|
||||
|
||||
private fun Activity.openPickedFile(uri: Uri) {
|
||||
startActivity(
|
||||
Intent.createChooser(
|
||||
Intent(Intent.ACTION_VIEW).apply {
|
||||
setDataAndType(uri, contentResolver.getType(uri) ?: "*/*")
|
||||
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
||||
},
|
||||
getString(R.string.open_url)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
|
||||
import de.markusfisch.android.binaryeye.app.addFragment
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.app.setFragment
|
||||
import de.markusfisch.android.binaryeye.text.unescape
|
||||
import de.markusfisch.android.binaryeye.view.hideSoftKeyboard
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
@@ -54,7 +55,6 @@ class EncodeFragment : Fragment() {
|
||||
BarcodeFormat.UPC_A
|
||||
)
|
||||
|
||||
private var minMargin = 0
|
||||
private var bytes: ByteArray? = null
|
||||
|
||||
override fun onActivityResult(
|
||||
@@ -103,7 +103,7 @@ class EncodeFragment : Fragment() {
|
||||
val formatAdapter = ArrayAdapter(
|
||||
ac,
|
||||
android.R.layout.simple_spinner_item,
|
||||
formats.map { prettifyFormatName(it.name) }
|
||||
formats.map { it.name.prettifyFormatName() }
|
||||
)
|
||||
formatAdapter.setDropDownViewResource(
|
||||
android.R.layout.simple_spinner_dropdown_item
|
||||
@@ -173,17 +173,21 @@ class EncodeFragment : Fragment() {
|
||||
colorsLabel = view.findViewById(R.id.colors_label)
|
||||
colorsSpinner = view.findViewById(R.id.colors)
|
||||
addQuietZoneSwitch = view.findViewById(R.id.add_quiet_zone)
|
||||
addQuietZoneSwitch.isChecked = prefs.addQuietZone
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
unescapeCheckBox = view.findViewById(R.id.unescape)
|
||||
unescapeCheckBox.isChecked = prefs.expandEscapeSequences
|
||||
|
||||
var complete = false
|
||||
val args = arguments
|
||||
args?.getString(CONTENT_TEXT)?.let {
|
||||
contentView.setText(it)
|
||||
complete = it.isNotEmpty()
|
||||
}
|
||||
args?.getByteArray(CONTENT_RAW)?.let {
|
||||
bytes = it
|
||||
complete = it.isNotEmpty()
|
||||
setEncodeByteArray()
|
||||
}
|
||||
|
||||
@@ -205,6 +209,15 @@ class EncodeFragment : Fragment() {
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
view.findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
|
||||
|
||||
if (complete &&
|
||||
args?.getBoolean(EXECUTE, false) == true
|
||||
) {
|
||||
view.post {
|
||||
val content = view.context.getContent() ?: return@post
|
||||
fragmentManager?.setFragment(newEncodeFragment(content))
|
||||
}
|
||||
}
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
@@ -235,31 +248,36 @@ class EncodeFragment : Fragment() {
|
||||
super.onPause()
|
||||
prefs.indexOfLastSelectedFormat = formatView.selectedItemPosition
|
||||
prefs.expandEscapeSequences = unescapeCheckBox.isChecked
|
||||
prefs.addQuietZone = addQuietZoneSwitch.isChecked
|
||||
}
|
||||
|
||||
private fun Context.encode() {
|
||||
hideSoftKeyboard(contentView)
|
||||
val content = getContent() ?: return
|
||||
val format = formats[formatView.selectedItemPosition]
|
||||
fragmentManager?.addFragment(
|
||||
BarcodeFragment.newInstance(
|
||||
content,
|
||||
format,
|
||||
format.getErrorCorrectionLevel(ecSpinner.selectedItemPosition),
|
||||
when (format) {
|
||||
BarcodeFormat.AZTEC,
|
||||
BarcodeFormat.DATA_MATRIX,
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.PDF_417 -> if (
|
||||
addQuietZoneSwitch.isChecked
|
||||
) 1 else 0
|
||||
contentView.post {
|
||||
fragmentManager?.addFragment(newEncodeFragment(content))
|
||||
}
|
||||
}
|
||||
|
||||
else -> -1
|
||||
},
|
||||
if (format.canBeInverted()) {
|
||||
colorsSpinner.selectedItemPosition
|
||||
} else 0
|
||||
)
|
||||
private fun newEncodeFragment(content: Any): Fragment {
|
||||
val format = formats[formatView.selectedItemPosition]
|
||||
return BarcodeFragment.newInstance(
|
||||
content,
|
||||
format,
|
||||
format.getErrorCorrectionLevel(ecSpinner.selectedItemPosition),
|
||||
when (format) {
|
||||
BarcodeFormat.AZTEC,
|
||||
BarcodeFormat.DATA_MATRIX,
|
||||
BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.PDF_417 -> if (
|
||||
addQuietZoneSwitch.isChecked
|
||||
) 1 else 0
|
||||
|
||||
else -> -1
|
||||
},
|
||||
if (format.canBeInverted()) {
|
||||
colorsSpinner.selectedItemPosition
|
||||
} else 0
|
||||
)
|
||||
}
|
||||
|
||||
@@ -302,11 +320,13 @@ class EncodeFragment : Fragment() {
|
||||
private const val CONTENT_TEXT = "content_text"
|
||||
private const val CONTENT_RAW = "content_raw"
|
||||
private const val FORMAT = "format"
|
||||
private const val EXECUTE = "execute"
|
||||
private const val PICK_FILE_RESULT_CODE = 1
|
||||
|
||||
fun <T> newInstance(
|
||||
content: T? = null,
|
||||
format: String? = null
|
||||
format: String? = null,
|
||||
execute: Boolean = false
|
||||
): Fragment {
|
||||
val args = Bundle()
|
||||
content?.let {
|
||||
@@ -317,6 +337,7 @@ class EncodeFragment : Fragment() {
|
||||
"content must be a String or a ByteArray"
|
||||
)
|
||||
}
|
||||
args.putBoolean(EXECUTE, execute)
|
||||
}
|
||||
format?.let { args.putString(FORMAT, it) }
|
||||
val fragment = EncodeFragment()
|
||||
@@ -356,7 +377,9 @@ private fun BarcodeFormat.canBeInverted() = when (this) {
|
||||
else -> false
|
||||
}
|
||||
|
||||
private fun String.toFormat(default: BarcodeFormat = BarcodeFormat.QR_CODE): BarcodeFormat = try {
|
||||
private fun String.toFormat(
|
||||
default: BarcodeFormat = BarcodeFormat.QR_CODE
|
||||
): BarcodeFormat = try {
|
||||
BarcodeFormat.valueOf(this)
|
||||
} catch (_: IllegalArgumentException) {
|
||||
default
|
||||
|
||||
@@ -345,7 +345,7 @@ class HistoryFragment : Fragment() {
|
||||
closeActionMode()
|
||||
try {
|
||||
fragmentManager?.addFragment(DecodeFragment.newInstance(scan))
|
||||
} catch (e: IllegalArgumentException) {
|
||||
} catch (_: IllegalArgumentException) {
|
||||
// Ignore, can never happen.
|
||||
}
|
||||
}
|
||||
@@ -506,7 +506,7 @@ class HistoryFragment : Fragment() {
|
||||
|
||||
private fun Cursor.exportText(separator: String): String {
|
||||
val sb = StringBuilder()
|
||||
val contentIndex = getColumnIndex(Database.SCANS_CONTENT)
|
||||
val contentIndex = getColumnIndex(Database.SCANS_TEXT)
|
||||
if (contentIndex > -1 && moveToFirst()) {
|
||||
do {
|
||||
val content = getString(contentIndex)
|
||||
|
||||
+108
-29
@@ -28,6 +28,8 @@ import de.markusfisch.android.binaryeye.view.systemBarRecyclerViewScrollListener
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
private var lastProfile: String? = null
|
||||
|
||||
private val changeListener = object : OnSharedPreferenceChangeListener {
|
||||
override fun onSharedPreferenceChanged(
|
||||
sharedPreferences: SharedPreferences?,
|
||||
@@ -35,34 +37,78 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
) {
|
||||
key ?: return
|
||||
val preference = findPreference(key) ?: return
|
||||
prefs.update()
|
||||
when (preference.key) {
|
||||
"custom_locale" -> activity?.restartApp()
|
||||
"beep_tone_name" -> {
|
||||
beepConfirm()
|
||||
setSummary(preference)
|
||||
}
|
||||
|
||||
"send_scan_bluetooth" -> {
|
||||
if (prefs.sendScanBluetooth &&
|
||||
activity?.hasBluetoothPermission() == false
|
||||
) {
|
||||
prefs.sendScanBluetooth = false
|
||||
}
|
||||
setSummary(preference)
|
||||
}
|
||||
|
||||
else -> setSummary(preference)
|
||||
if (preference.key != PROFILE) {
|
||||
prefs.update()
|
||||
}
|
||||
when (preference.key) {
|
||||
"custom_locale" -> {
|
||||
activity?.restartApp()
|
||||
return
|
||||
}
|
||||
|
||||
"beep_tone_name" -> beepConfirm()
|
||||
|
||||
"send_scan_bluetooth" -> if (
|
||||
prefs.sendScanBluetooth &&
|
||||
activity?.hasBluetoothPermission() == false
|
||||
) {
|
||||
prefs.sendScanBluetooth = false
|
||||
}
|
||||
}
|
||||
setSummary(preference)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreatePreferences(state: Bundle?, rootKey: String?) {
|
||||
addPreferencesFromResource(R.xml.preferences)
|
||||
loadPreferences(rootKey)
|
||||
}
|
||||
|
||||
private fun loadPreferences(rootKey: String? = null) {
|
||||
preferenceScreen?.sharedPreferences
|
||||
?.unregisterOnSharedPreferenceChangeListener(changeListener)
|
||||
|
||||
preferenceManager.apply {
|
||||
sharedPreferencesName = prefs.profile ?: "${context.packageName}_preferences"
|
||||
sharedPreferencesMode = Context.MODE_PRIVATE
|
||||
}
|
||||
|
||||
// Refresh the preferences.
|
||||
preferenceScreen = null
|
||||
setPreferencesFromResource(R.xml.preferences, rootKey)
|
||||
preferenceScreen.sharedPreferences
|
||||
.registerOnSharedPreferenceChangeListener(changeListener)
|
||||
setSummaries(preferenceScreen)
|
||||
|
||||
wireProfiles()
|
||||
wireAutomatedActions()
|
||||
setBluetoothResources()
|
||||
wireClearNetworkPreferences()
|
||||
}
|
||||
|
||||
private fun wireProfiles() {
|
||||
findPreference(PROFILE).apply {
|
||||
updateProfileSummary(this)
|
||||
onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
activity?.supportFragmentManager?.addFragment(
|
||||
ProfilesFragment()
|
||||
)
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun wireAutomatedActions() {
|
||||
findPreference(AUTOMATED_ACTIONS).apply {
|
||||
updateAutomatedActionsSummary(this)
|
||||
onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
activity?.supportFragmentManager?.addFragment(
|
||||
AutomatedActionsFragment()
|
||||
)
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setBluetoothResources() {
|
||||
if (prefs.sendScanBluetooth &&
|
||||
activity?.hasBluetoothPermission() == true
|
||||
@@ -79,7 +125,9 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
// From R+ we can query past network suggestions and
|
||||
// make them editable.
|
||||
setOnPreferenceClickListener {
|
||||
fragmentManager.addFragment(NetworkSuggestionsFragment())
|
||||
activity?.supportFragmentManager?.addFragment(
|
||||
NetworkSuggestionsFragment()
|
||||
)
|
||||
true
|
||||
}
|
||||
} else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) {
|
||||
@@ -124,13 +172,19 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
if (lastProfile != prefs.profile) {
|
||||
loadPreferences()
|
||||
}
|
||||
activity?.setTitle(R.string.preferences)
|
||||
findPreference(AUTOMATED_ACTIONS)?.let {
|
||||
updateAutomatedActionsSummary(it)
|
||||
}
|
||||
findPreference(PROFILE)?.let {
|
||||
updateProfileSummary(it)
|
||||
}
|
||||
listView.setPaddingFromWindowInsets()
|
||||
listView.removeOnScrollListener(systemBarRecyclerViewScrollListener)
|
||||
listView.addOnScrollListener(systemBarRecyclerViewScrollListener)
|
||||
preferenceScreen.sharedPreferences
|
||||
.registerOnSharedPreferenceChangeListener(changeListener)
|
||||
setSummaries(preferenceScreen)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
@@ -165,9 +219,13 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
|
||||
private fun setSummary(preference: Preference) {
|
||||
if (preference.key == AUTOMATED_ACTIONS) {
|
||||
updateAutomatedActionsSummary(preference)
|
||||
return
|
||||
}
|
||||
when (preference) {
|
||||
is UrlPreference -> {
|
||||
preference.setSummary(preference.getUrl())
|
||||
preference.summary = preference.getUrl()
|
||||
}
|
||||
|
||||
is ListPreference -> {
|
||||
@@ -175,11 +233,9 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
|
||||
is MultiSelectListPreference -> {
|
||||
preference.setSummary(
|
||||
preference.values.joinToString(", ") {
|
||||
it.replace(Regex("_"), " ")
|
||||
}
|
||||
)
|
||||
preference.summary = preference.values.joinToString(", ") {
|
||||
it.replace(Regex("_"), " ")
|
||||
}
|
||||
}
|
||||
|
||||
is PreferenceGroup -> {
|
||||
@@ -187,6 +243,29 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateAutomatedActionsSummary(preference: Preference) {
|
||||
val count = prefs.automatedActions.size
|
||||
preference.summary = if (count == 0) {
|
||||
getString(R.string.automated_actions_none)
|
||||
} else {
|
||||
resources.getQuantityString(
|
||||
R.plurals.automated_actions_count,
|
||||
count,
|
||||
count
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateProfileSummary(preference: Preference) {
|
||||
preference.summary = prefs.profile ?: getString(R.string.profile_default)
|
||||
lastProfile = prefs.profile
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val PROFILE = "profile"
|
||||
private const val AUTOMATED_ACTIONS = "automated_actions"
|
||||
}
|
||||
}
|
||||
|
||||
private fun Activity.restartApp() {
|
||||
|
||||
@@ -0,0 +1,179 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.app.AlertDialog
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.Fragment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.EditText
|
||||
import android.widget.ListView
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
class ProfilesFragment : Fragment() {
|
||||
private val profiles = ArrayList<ProfileItem>()
|
||||
|
||||
private lateinit var adapter: ProfilesAdapter
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
state: Bundle?
|
||||
): View? {
|
||||
val ac = activity ?: return null
|
||||
ac.setTitle(R.string.profile)
|
||||
|
||||
val view = inflater.inflate(
|
||||
R.layout.fragment_profiles,
|
||||
container,
|
||||
false
|
||||
)
|
||||
|
||||
refreshProfiles()
|
||||
|
||||
val listView = view.findViewById<ListView>(R.id.profiles)
|
||||
listView.emptyView = view.findViewById(R.id.no_profiles)
|
||||
adapter = ProfilesAdapter(ac, profiles)
|
||||
listView.adapter = adapter
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
listView.setOnItemClickListener { _, _, position, _ ->
|
||||
selectProfile(position)
|
||||
}
|
||||
listView.setOnItemLongClickListener { _, _, position, _ ->
|
||||
confirmRemoveProfile(position)
|
||||
true
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.add).setOnClickListener {
|
||||
addProfile()
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
|
||||
return view
|
||||
}
|
||||
|
||||
private fun refreshProfiles() {
|
||||
profiles.clear()
|
||||
profiles.add(
|
||||
ProfileItem(
|
||||
null,
|
||||
getString(R.string.profile_default)
|
||||
)
|
||||
)
|
||||
prefs.profiles.forEach { name ->
|
||||
profiles.add(ProfileItem(name, name))
|
||||
}
|
||||
if (this::adapter.isInitialized) {
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
}
|
||||
|
||||
private fun selectProfile(position: Int) {
|
||||
val ac = activity ?: return
|
||||
val profile = profiles[position].name
|
||||
if (prefs.profile == profile) {
|
||||
return
|
||||
}
|
||||
prefs.load(ac, profile)
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
|
||||
// Dialogs do not have a parent view.
|
||||
@Suppress("InflateParams")
|
||||
private fun addProfile() {
|
||||
val ac = activity ?: return
|
||||
val view = ac.layoutInflater.inflate(
|
||||
R.layout.dialog_profile_name, null
|
||||
)
|
||||
val editText = view.findViewById<EditText>(R.id.name)
|
||||
AlertDialog.Builder(ac)
|
||||
.setView(view)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
val name = editText.text.toString().trim()
|
||||
if (name.isNotEmpty() && prefs.addProfile(name)) {
|
||||
prefs.load(ac, name)
|
||||
refreshProfiles()
|
||||
} else {
|
||||
ac.toast(R.string.profile_invalid_name)
|
||||
}
|
||||
}
|
||||
.show()
|
||||
}
|
||||
|
||||
private fun confirmRemoveProfile(position: Int) {
|
||||
val ac = activity ?: return
|
||||
val profile = profiles[position]
|
||||
val profileName = profile.name ?: return
|
||||
AlertDialog.Builder(ac)
|
||||
.setMessage(R.string.profile_remove_confirm)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
val isCurrent = prefs.profile == profileName
|
||||
prefs.removeProfile(profileName)
|
||||
if (isCurrent) {
|
||||
prefs.load(ac, null)
|
||||
}
|
||||
refreshProfiles()
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.show()
|
||||
}
|
||||
|
||||
private class ProfilesAdapter(
|
||||
context: Context,
|
||||
private val items: List<ProfileItem>
|
||||
) : ArrayAdapter<ProfileItem>(
|
||||
context,
|
||||
android.R.layout.simple_list_item_2,
|
||||
android.R.id.text1,
|
||||
items
|
||||
) {
|
||||
override fun getView(
|
||||
position: Int,
|
||||
convertView: View?,
|
||||
parent: ViewGroup
|
||||
): View {
|
||||
val view = super.getView(position, convertView, parent)
|
||||
val item = items[position]
|
||||
val isCurrent = item.name == prefs.profile
|
||||
getViewHolder(view).apply {
|
||||
title.text = item.label
|
||||
if (isCurrent) {
|
||||
subtitle.text = context.getString(R.string.profile_current)
|
||||
subtitle.visibility = View.VISIBLE
|
||||
} else {
|
||||
subtitle.text = ""
|
||||
subtitle.visibility = View.GONE
|
||||
}
|
||||
}
|
||||
return view
|
||||
}
|
||||
|
||||
private fun getViewHolder(
|
||||
view: View
|
||||
): ViewHolder = view.tag as ViewHolder? ?: ViewHolder(
|
||||
view.findViewById(android.R.id.text1),
|
||||
view.findViewById(android.R.id.text2),
|
||||
).also {
|
||||
view.tag = it
|
||||
}
|
||||
|
||||
private data class ViewHolder(
|
||||
val title: TextView,
|
||||
val subtitle: TextView,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private data class ProfileItem(
|
||||
val name: String?,
|
||||
val label: String
|
||||
)
|
||||
@@ -80,10 +80,5 @@ private fun completeUrl(template: String): String {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ fun ContentResolver.loadImageUri(uri: Uri): Bitmap? = try {
|
||||
openInputStream(uri)?.use {
|
||||
BitmapFactory.decodeStream(it, null, options)
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
} catch (_: IOException) {
|
||||
null
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,9 @@ data class FrameMetrics(
|
||||
var width: Int = 0,
|
||||
var height: Int = 0,
|
||||
var orientation: Int = 0
|
||||
)
|
||||
) {
|
||||
fun isValid() = width > 0 && height > 0
|
||||
}
|
||||
|
||||
fun Rect.setFrameRoi(
|
||||
frameMetrics: FrameMetrics,
|
||||
|
||||
@@ -53,7 +53,7 @@ fun Context.writeExternalFile(
|
||||
): Boolean = try {
|
||||
openExternalOutputStream(fileName, mimeType).use { write(it) }
|
||||
true
|
||||
} catch (e: IOException) {
|
||||
} catch (_: IOException) {
|
||||
false
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package de.markusfisch.android.binaryeye.net
|
||||
|
||||
import android.net.Uri
|
||||
|
||||
private const val SCHEME = "binaryeye"
|
||||
private const val HOSTNAME = "markusfisch.de"
|
||||
private const val ENCODE_PATH = "encode"
|
||||
|
||||
fun isScanDeeplink(text: String) = listOf(
|
||||
"$SCHEME://scan",
|
||||
"http://$HOSTNAME/BinaryEye",
|
||||
"https://$HOSTNAME/BinaryEye"
|
||||
).any { text.startsWith(it) }
|
||||
|
||||
fun isEncodeDeeplink(text: String) = listOf(
|
||||
"$SCHEME://$ENCODE_PATH",
|
||||
"http://$HOSTNAME/$ENCODE_PATH",
|
||||
"https://$HOSTNAME/$ENCODE_PATH"
|
||||
).any { text.startsWith(it) }
|
||||
|
||||
fun createEncodeDeeplink(format: String, content: String): String {
|
||||
return Uri.Builder()
|
||||
.scheme("https")
|
||||
.authority(HOSTNAME)
|
||||
.appendPath(ENCODE_PATH)
|
||||
.appendQueryParameter("format", format)
|
||||
.appendQueryParameter("content", content)
|
||||
.build()
|
||||
.toString()
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
package de.markusfisch.android.binaryeye.net
|
||||
|
||||
import de.markusfisch.android.binaryeye.content.toHexString
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -36,7 +35,10 @@ private fun Scan.send(url: String, type: String): Response {
|
||||
|
||||
"2" -> request(url) { con ->
|
||||
con.requestMethod = "POST"
|
||||
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
|
||||
con.setRequestProperty(
|
||||
"Content-Type",
|
||||
"application/x-www-form-urlencoded"
|
||||
)
|
||||
con.outputStream.apply {
|
||||
write(asUrlArguments().toByteArray())
|
||||
close()
|
||||
@@ -53,7 +55,7 @@ private fun Scan.send(url: String, type: String): Response {
|
||||
}
|
||||
|
||||
else -> request(
|
||||
url + content.urlEncode()
|
||||
url + text.urlEncode()
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -67,7 +69,7 @@ private fun Scan.asJson() = JSONObject().apply {
|
||||
}
|
||||
|
||||
private fun Scan.getMap(): Map<String, String> = mapOf(
|
||||
"content" to content,
|
||||
"content" to text,
|
||||
"raw" to raw?.toHexString(),
|
||||
"format" to format.name,
|
||||
"errorCorrectionLevel" to errorCorrectionLevel,
|
||||
|
||||
@@ -5,6 +5,6 @@ import java.net.URLEncoder
|
||||
|
||||
fun String.urlEncode(): String = try {
|
||||
URLEncoder.encode(this, "UTF-8")
|
||||
} catch (e: UnsupportedEncodingException) {
|
||||
} catch (_: UnsupportedEncodingException) {
|
||||
this
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,9 @@ import android.view.WindowManager
|
||||
|
||||
fun Activity.getScreenBrightness(): Float {
|
||||
val layoutParams = window.attributes
|
||||
return if (layoutParams.screenBrightness == WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE) {
|
||||
return if (layoutParams.screenBrightness ==
|
||||
WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE
|
||||
) {
|
||||
android.provider.Settings.System.getInt(
|
||||
contentResolver,
|
||||
android.provider.Settings.System.SCREEN_BRIGHTNESS
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package de.markusfisch.android.binaryeye.preference
|
||||
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.Point
|
||||
import org.json.JSONObject
|
||||
|
||||
fun SharedPreferences.storeCropHandle(
|
||||
name: String,
|
||||
viewWidth: Int,
|
||||
viewHeight: Int,
|
||||
cropHandle: Point
|
||||
) {
|
||||
edit().putString(
|
||||
cropHandleKey(name, viewWidth, viewHeight),
|
||||
JSONObject().apply {
|
||||
put("x", cropHandle.x)
|
||||
put("y", cropHandle.y)
|
||||
}.toString()
|
||||
).apply()
|
||||
}
|
||||
|
||||
fun SharedPreferences.restoreCropHandle(
|
||||
name: String,
|
||||
viewWidth: Int,
|
||||
viewHeight: Int,
|
||||
default: Point = Point(-2, -2) // -2 means set default roi.
|
||||
): Point {
|
||||
val s = getString(
|
||||
cropHandleKey(name, viewWidth, viewHeight), null
|
||||
) ?: return default
|
||||
return try {
|
||||
val json = JSONObject(s)
|
||||
Point(
|
||||
json.getInt("x"),
|
||||
json.getInt("y")
|
||||
)
|
||||
} catch (_: Exception) {
|
||||
return default
|
||||
}
|
||||
}
|
||||
|
||||
private fun cropHandleKey(
|
||||
name: String,
|
||||
viewWidth: Int,
|
||||
viewHeight: Int
|
||||
) = "${name}:${viewWidth}:${viewHeight}"
|
||||
@@ -3,15 +3,28 @@ package de.markusfisch.android.binaryeye.preference
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import android.graphics.Point
|
||||
import android.media.ToneGenerator
|
||||
import android.os.Build
|
||||
import android.preference.PreferenceManager
|
||||
import android.support.annotation.RequiresApi
|
||||
import de.markusfisch.android.binaryeye.automation.AutomatedAction
|
||||
import de.markusfisch.android.binaryeye.automation.AutomatedAction.Companion.fromJsonArray
|
||||
import de.markusfisch.android.binaryeye.automation.AutomatedAction.Companion.toJsonArray
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
import org.json.JSONArray
|
||||
|
||||
class Preferences {
|
||||
lateinit var defaultPreferences: SharedPreferences
|
||||
lateinit var preferences: SharedPreferences
|
||||
|
||||
val profiles = ArrayList<String>()
|
||||
|
||||
var profile: String? = null
|
||||
set(value) {
|
||||
defaultPreferences.edit().putString(PROFILE, value).apply()
|
||||
field = value
|
||||
}
|
||||
var barcodeFormats = setOf(
|
||||
BarcodeFormat.AZTEC.name,
|
||||
BarcodeFormat.CODABAR.name,
|
||||
@@ -38,21 +51,6 @@ class Preferences {
|
||||
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 = -2
|
||||
set(value) {
|
||||
apply(CROP_HANDLE_Y, value)
|
||||
field = value
|
||||
}
|
||||
var cropHandleOrientation = 0
|
||||
set(value) {
|
||||
apply(CROP_HANDLE_ORIENTATION, value)
|
||||
field = value
|
||||
}
|
||||
var showCropHandle = true
|
||||
set(value) {
|
||||
apply(SHOW_CROP_HANDLE, value)
|
||||
@@ -210,17 +208,83 @@ class Preferences {
|
||||
apply(EXPAND_ESCAPE_SEQUENCES, value)
|
||||
field = value
|
||||
}
|
||||
var addQuietZone = true
|
||||
set(value) {
|
||||
apply(ADD_QUIET_ZONE, value)
|
||||
field = value
|
||||
}
|
||||
var brightenScreen = false
|
||||
set(value) {
|
||||
apply(BRIGHTEN_SCREEN, value)
|
||||
field = value
|
||||
}
|
||||
var previewScale = 0f
|
||||
set(value) {
|
||||
apply(PREVIEW_SCALE, value)
|
||||
field = value
|
||||
}
|
||||
var automatedActions = mutableListOf<AutomatedAction>()
|
||||
private set
|
||||
|
||||
fun init(context: Context) {
|
||||
preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
// I'm not including a support library just to get the
|
||||
// default preferences. Dependencies are a burden.
|
||||
@Suppress("DEPRECATION")
|
||||
defaultPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||
|
||||
loadProfiles()
|
||||
load(context, defaultPreferences.getString(PROFILE, null))
|
||||
}
|
||||
|
||||
fun load(context: Context, profileName: String?) {
|
||||
preferences = if (profileName.isNullOrEmpty()) {
|
||||
profile = null
|
||||
defaultPreferences
|
||||
} else {
|
||||
profile = profileName
|
||||
context.getSharedPreferences(
|
||||
profileName,
|
||||
Context.MODE_PRIVATE
|
||||
)
|
||||
}
|
||||
update()
|
||||
}
|
||||
|
||||
fun addProfile(name: String): Boolean {
|
||||
if (!name.matches("^[a-zA-Z0-9_-]+$".toRegex()) ||
|
||||
profiles.contains(name)
|
||||
) {
|
||||
return false
|
||||
}
|
||||
profiles.add(name)
|
||||
saveProfiles()
|
||||
return true
|
||||
}
|
||||
|
||||
fun removeProfile(name: String): Boolean {
|
||||
if (!profiles.remove(name)) {
|
||||
return false
|
||||
}
|
||||
saveProfiles()
|
||||
return true
|
||||
}
|
||||
|
||||
fun saveProfiles() {
|
||||
defaultPreferences.edit().putString(
|
||||
PROFILES,
|
||||
JSONArray(profiles).toString()
|
||||
).apply()
|
||||
}
|
||||
|
||||
fun loadProfiles() {
|
||||
profiles.clear()
|
||||
JSONArray(
|
||||
defaultPreferences.getString(PROFILES, "[]")
|
||||
).let {
|
||||
profiles.addAll(Array(it.length()) { i -> it.getString(i) })
|
||||
}
|
||||
}
|
||||
|
||||
fun update() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
preferences.getStringSet(BARCODE_FORMATS, barcodeFormats)?.let {
|
||||
@@ -232,12 +296,6 @@ class Preferences {
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
@@ -268,7 +326,10 @@ class Preferences {
|
||||
ignoreDuplicatesName = "accept_duplicates"
|
||||
}
|
||||
|
||||
preferences.getString(IGNORE_DUPLICATES_NAME, ignoreDuplicatesName)?.also {
|
||||
preferences.getString(
|
||||
IGNORE_DUPLICATES_NAME,
|
||||
ignoreDuplicatesName
|
||||
)?.also {
|
||||
ignoreDuplicatesName = it
|
||||
}
|
||||
copyImmediately = preferences.getBoolean(
|
||||
@@ -331,10 +392,23 @@ class Preferences {
|
||||
EXPAND_ESCAPE_SEQUENCES,
|
||||
expandEscapeSequences
|
||||
)
|
||||
addQuietZone = preferences.getBoolean(ADD_QUIET_ZONE, addQuietZone)
|
||||
brightenScreen = preferences.getBoolean(
|
||||
BRIGHTEN_SCREEN,
|
||||
brightenScreen
|
||||
)
|
||||
previewScale = preferences.getFloat(
|
||||
PREVIEW_SCALE,
|
||||
previewScale
|
||||
)
|
||||
automatedActions = fromJsonArray(
|
||||
preferences.getString(AUTOMATED_ACTIONS, "[]") ?: "[]"
|
||||
)
|
||||
}
|
||||
|
||||
fun setAutomatedActions(actions: List<AutomatedAction>) {
|
||||
automatedActions = actions.toMutableList()
|
||||
apply(AUTOMATED_ACTIONS, toJsonArray(actions))
|
||||
}
|
||||
|
||||
private fun addFormatsOnUpdate(
|
||||
@@ -350,6 +424,19 @@ class Preferences {
|
||||
}
|
||||
}
|
||||
|
||||
fun restoreCropHandle(
|
||||
name: String,
|
||||
viewWidth: Int,
|
||||
viewHeight: Int
|
||||
) = preferences.restoreCropHandle(name, viewWidth, viewHeight)
|
||||
|
||||
fun storeCropHandle(
|
||||
name: String,
|
||||
viewWidth: Int,
|
||||
viewHeight: Int,
|
||||
cropHandle: Point
|
||||
) = preferences.storeCropHandle(name, viewWidth, viewHeight, cropHandle)
|
||||
|
||||
fun beepTone() = when (beepToneName) {
|
||||
"tone_cdma_confirm" -> ToneGenerator.TONE_CDMA_CONFIRM
|
||||
"tone_sup_radio_ack" -> ToneGenerator.TONE_SUP_RADIO_ACK
|
||||
@@ -368,9 +455,6 @@ 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 apply(label: String, value: Boolean) {
|
||||
put(label, value).apply()
|
||||
}
|
||||
@@ -383,6 +467,10 @@ class Preferences {
|
||||
preferences.edit().putInt(label, value).apply()
|
||||
}
|
||||
|
||||
private fun apply(label: String, value: Float) {
|
||||
preferences.edit().putFloat(label, value).apply()
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
private fun commit(label: String, value: String) {
|
||||
preferences.edit().putString(label, value).commit()
|
||||
@@ -398,10 +486,9 @@ class Preferences {
|
||||
Consecutive, Any, Never
|
||||
}
|
||||
|
||||
private const val PROFILES = "profiles"
|
||||
private const val PROFILE = "profile"
|
||||
private const val BARCODE_FORMATS = "formats"
|
||||
private const val CROP_HANDLE_X = "crop_handle_x"
|
||||
private const val CROP_HANDLE_Y = "crop_handle_y"
|
||||
private const val CROP_HANDLE_ORIENTATION = "crop_handle_orientation"
|
||||
private const val SHOW_CROP_HANDLE = "show_crop_handle"
|
||||
private const val ZOOM_BY_SWIPING = "zoom_by_swiping"
|
||||
private const val AUTO_ROTATE = "auto_rotate"
|
||||
@@ -433,6 +520,9 @@ class Preferences {
|
||||
private const val INDEX_OF_LAST_SELECTED_EC_LEVEL = "index_of_last_selected_ec_level"
|
||||
private const val FREE_ROTATION = "free_rotation"
|
||||
private const val EXPAND_ESCAPE_SEQUENCES = "expand_escape_sequences"
|
||||
private const val ADD_QUIET_ZONE = "add_quiet_zone"
|
||||
private const val BRIGHTEN_SCREEN = "brighten_screen"
|
||||
private const val PREVIEW_SCALE = "preview_scale"
|
||||
private const val AUTOMATED_ACTIONS = "automated_actions"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,8 @@ val systemBarListViewScrollListener = object : AbsListView.OnScrollListener {
|
||||
view.post {
|
||||
val scrolled = firstVisibleItem > 0 ||
|
||||
(totalItemCount > 0 && firstChildScrolled(view))
|
||||
val scrollable = scrolled || totalItemCount > 0 && lastChildOutOfView(view)
|
||||
val scrollable = scrolled ||
|
||||
totalItemCount > 0 && lastChildOutOfView(view)
|
||||
colorSystemAndToolBars(view.context, scrolled, scrollable)
|
||||
}
|
||||
}
|
||||
@@ -38,8 +39,10 @@ val systemBarListViewScrollListener = object : AbsListView.OnScrollListener {
|
||||
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() <
|
||||
val scrolled =
|
||||
layoutManager.findFirstCompletelyVisibleItemPosition() != 0
|
||||
val scrollable = scrolled ||
|
||||
layoutManager.findLastVisibleItemPosition() <
|
||||
recyclerView.adapter.itemCount - 1
|
||||
colorSystemAndToolBars(recyclerView.context, scrolled, scrollable)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,11 @@ import android.view.View
|
||||
import android.view.WindowInsets
|
||||
|
||||
private var toolbarHeight = 0
|
||||
fun setPaddingFromWindowInsets(mainLayout: View, toolbar: Toolbar, navbar: View?) {
|
||||
fun setPaddingFromWindowInsets(
|
||||
mainLayout: View,
|
||||
toolbar: Toolbar,
|
||||
navbar: View?
|
||||
) {
|
||||
toolbarHeight = toolbar.layoutParams.height
|
||||
// SDK 35+ is edge-to-edge by default, so the toolbar needs to extend
|
||||
// below the status bar.
|
||||
|
||||
+5
@@ -10,6 +10,8 @@ import de.markusfisch.android.scalingimageview.widget.ScalingImageView
|
||||
open class ConfinedScalingImageView : ScalingImageView {
|
||||
val insets = Rect()
|
||||
|
||||
var runAfterLayout: (() -> Unit)? = null
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyle: Int) :
|
||||
super(context, attrs, defStyle)
|
||||
|
||||
@@ -37,5 +39,8 @@ open class ConfinedScalingImageView : ScalingImageView {
|
||||
)
|
||||
}
|
||||
centerRemap()
|
||||
runAfterLayout?.invoke()
|
||||
}
|
||||
|
||||
fun isInBounds(): Boolean = inBounds()
|
||||
}
|
||||
|
||||
@@ -27,7 +27,8 @@ class ConfinedScrollView : ScrollView {
|
||||
// not putting it on the queue makes it only work sometimes.
|
||||
post {
|
||||
getChildAt(0)?.also { child ->
|
||||
scrollable = height < child.height + paddingTop + paddingBottom
|
||||
scrollable = height <
|
||||
child.height + paddingTop + paddingBottom
|
||||
colorSystemAndToolBars(
|
||||
context,
|
||||
scrollY > 0,
|
||||
|
||||
@@ -9,8 +9,6 @@ import android.graphics.Point
|
||||
import android.graphics.Rect
|
||||
import android.graphics.Region
|
||||
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
|
||||
@@ -28,10 +26,10 @@ class DetectorView : View {
|
||||
val coordinates = FloatArray(32)
|
||||
val roi = Rect()
|
||||
|
||||
var cropHandleName: String? = null
|
||||
var onRoiChange: (() -> Unit)? = null
|
||||
var onRoiChanged: (() -> Unit)? = null
|
||||
|
||||
private val currentOrientation = resources.configuration.orientation
|
||||
private val invalidateRunnable: Runnable = Runnable {
|
||||
coordinatesLast = 0
|
||||
invalidate()
|
||||
@@ -47,7 +45,8 @@ class DetectorView : View {
|
||||
)
|
||||
private val handleXRadius = handleBitmap.width / 2
|
||||
private val handleYRadius = handleBitmap.height / 2
|
||||
private val handlePos = Point(-1, -1)
|
||||
private val inactiveHandlePos = Point(-1, -1)
|
||||
private val handlePos = Point(inactiveHandlePos)
|
||||
private val handleHome = Point()
|
||||
private val center = Point()
|
||||
private val touchDown = Point()
|
||||
@@ -57,6 +56,8 @@ class DetectorView : View {
|
||||
private val fabHeight: Int
|
||||
private val padding: Int
|
||||
|
||||
private var viewWidth = 0
|
||||
private var viewHeight = 0
|
||||
private var coordinatesLast = 0
|
||||
private var handleGrabbed = false
|
||||
private var handleActive = false
|
||||
@@ -83,37 +84,38 @@ class DetectorView : View {
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) :
|
||||
super(context, attrs, defStyleAttr)
|
||||
|
||||
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
|
||||
fun storeCropHandlePos() {
|
||||
val name = cropHandleName ?: return
|
||||
val pos = if (handleActive) {
|
||||
handlePos
|
||||
} else {
|
||||
inactiveHandlePos
|
||||
}
|
||||
prefs.storeCropHandle(
|
||||
name,
|
||||
viewWidth,
|
||||
viewHeight,
|
||||
pos
|
||||
)
|
||||
}
|
||||
|
||||
private fun setCropHandlePos(x: Int, y: Int, orientation: Int) {
|
||||
// Always set handlePos even if it's invalid because
|
||||
// handlePos.x may be -2 which is a signal to set the
|
||||
// default ROI.
|
||||
if (orientation == currentOrientation) {
|
||||
handlePos.set(x, y)
|
||||
} else {
|
||||
handlePos.set(y, x)
|
||||
fun updateCropHandlePos() {
|
||||
val name = cropHandleName ?: return
|
||||
if (viewWidth < 1 || viewHeight < 1) {
|
||||
return
|
||||
}
|
||||
val cropHandle = prefs.restoreCropHandle(name, viewWidth, viewHeight)
|
||||
if (cropHandle.x == -2) {
|
||||
setHandleToDefaultRoi()
|
||||
} else {
|
||||
handlePos.set(cropHandle.x, cropHandle.y)
|
||||
handleActive = handlePos.x > -1
|
||||
}
|
||||
if (handleActive) {
|
||||
updateClipRect()
|
||||
} else {
|
||||
reset()
|
||||
}
|
||||
handleActive = handlePos.x > -1
|
||||
}
|
||||
|
||||
fun update(numberOfCoordinates: Int) {
|
||||
@@ -123,31 +125,6 @@ class DetectorView : View {
|
||||
postDelayed(invalidateRunnable, 500)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(): Parcelable? {
|
||||
if (!handleActive) {
|
||||
return super.onSaveInstanceState()
|
||||
}
|
||||
return SavedState(super.onSaveInstanceState()).apply {
|
||||
savedHandlePos.set(getCropHandlePos())
|
||||
savedOrientation = currentOrientation
|
||||
}
|
||||
}
|
||||
|
||||
override fun onRestoreInstanceState(state: Parcelable) {
|
||||
super.onRestoreInstanceState(
|
||||
if (state is SavedState) {
|
||||
setCropHandlePos(
|
||||
state.savedHandlePos.x,
|
||||
state.savedHandlePos.y,
|
||||
state.savedOrientation
|
||||
)
|
||||
state.superState
|
||||
} else {
|
||||
state
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
override fun onTouchEvent(event: MotionEvent?): Boolean {
|
||||
event ?: return super.onTouchEvent(event)
|
||||
@@ -244,28 +221,27 @@ class DetectorView : View {
|
||||
roi.set(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
||||
override fun onLayout(
|
||||
changed: Boolean,
|
||||
left: Int,
|
||||
top: Int,
|
||||
right: Int,
|
||||
bottom: Int
|
||||
) {
|
||||
super.onLayout(changed, left, top, right, bottom)
|
||||
val width = right - left
|
||||
val height = bottom - top
|
||||
viewWidth = right - left
|
||||
viewHeight = bottom - top
|
||||
center.set(
|
||||
left + (width / 2),
|
||||
top + (height / 2)
|
||||
left + (viewWidth / 2),
|
||||
top + (viewHeight / 2)
|
||||
)
|
||||
minY = padding * 2
|
||||
maxY = height - minY
|
||||
maxY = viewHeight - minY
|
||||
handleHome.set(
|
||||
width - handleXRadius - paddingRight - padding,
|
||||
height - handleYRadius - paddingBottom - fabHeight
|
||||
viewWidth - handleXRadius - paddingRight - padding,
|
||||
viewHeight - handleYRadius - paddingBottom - fabHeight
|
||||
)
|
||||
if (handlePos.x == -2) {
|
||||
setHandleToDefaultRoi()
|
||||
}
|
||||
if (handleActive) {
|
||||
updateClipRect()
|
||||
} else {
|
||||
reset()
|
||||
}
|
||||
updateCropHandlePos()
|
||||
}
|
||||
|
||||
override fun onDraw(canvas: Canvas) {
|
||||
@@ -349,37 +325,6 @@ class DetectorView : View {
|
||||
private fun clampX(x: Int) = min(center.x * 2, max(0, x))
|
||||
|
||||
private fun clampY(y: Int) = min(maxY, max(minY, y))
|
||||
|
||||
internal class SavedState : BaseSavedState {
|
||||
val savedHandlePos = Point()
|
||||
|
||||
var savedOrientation = 0
|
||||
|
||||
constructor(superState: Parcelable?) : super(superState)
|
||||
|
||||
private constructor(parcel: Parcel) : super(parcel) {
|
||||
savedHandlePos.set(
|
||||
parcel.readInt(),
|
||||
parcel.readInt()
|
||||
)
|
||||
savedOrientation = parcel.readInt()
|
||||
}
|
||||
|
||||
override fun writeToParcel(out: Parcel, flags: Int) {
|
||||
super.writeToParcel(out, flags)
|
||||
out.writeInt(savedHandlePos.x)
|
||||
out.writeInt(savedHandlePos.y)
|
||||
out.writeInt(savedOrientation)
|
||||
}
|
||||
|
||||
companion object {
|
||||
@JvmField
|
||||
val CREATOR = object : Parcelable.Creator<SavedState> {
|
||||
override fun createFromParcel(source: Parcel) = SavedState(source)
|
||||
override fun newArray(size: Int): Array<SavedState?> = arrayOfNulls(size)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun distSq(a: Point, b: Point): Int {
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<selector
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:constantSize="true">
|
||||
<item android:state_pressed="false">
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="2dp"/>
|
||||
<solid android:color="@color/selected_row"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item android:state_pressed="true">
|
||||
<shape android:shape="rectangle">
|
||||
<corners android:radius="2dp"/>
|
||||
<solid android:color="@color/pressed_row"/>
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
|
||||
<path android:fillColor="#fff" android:pathData="M480,480Q414,480 367,433Q320,386 320,320Q320,254 367,207Q414,160 480,160Q546,160 593,207Q640,254 640,320Q640,386 593,433Q546,480 480,480ZM160,800L160,688Q160,654 177.5,625.5Q195,597 224,582Q286,551 350,535.5Q414,520 480,520Q546,520 610,535.5Q674,551 736,582Q765,597 782.5,625.5Q800,654 800,688L800,800L160,800ZM240,720L720,720L720,688Q720,677 714.5,668Q709,659 700,654Q646,627 591,613.5Q536,600 480,600Q424,600 369,613.5Q314,627 260,654Q251,659 245.5,668Q240,677 240,688L240,720ZM480,400Q513,400 536.5,376.5Q560,353 560,320Q560,287 536.5,263.5Q513,240 480,240Q447,240 423.5,263.5Q400,287 400,320Q400,353 423.5,376.5Q447,400 480,400ZM480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320Q480,320 480,320ZM480,720L480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720Q480,720 480,720L480,720Z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,57 @@
|
||||
<ScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fillViewport="true">
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:fitsSystemWindows="true">
|
||||
<!-- The FrameLayout is necessary because this LinearLayout
|
||||
should have a padding which would be reset by the window
|
||||
insets from `fitsSystemWindows`. -->
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="bottom"
|
||||
android:padding="24dp"
|
||||
android:orientation="vertical"
|
||||
tools:ignore="UselessParent">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:drawableTop="@drawable/logo"
|
||||
android:drawablePadding="16dp"
|
||||
android:gravity="center"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||
android:text="@string/welcome"/>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/WelcomeButton"
|
||||
android:id="@+id/expert"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/WelcomeButtonText"
|
||||
android:text="@string/mode_expert"/>
|
||||
<TextView
|
||||
style="@style/WelcomeButtonSubText"
|
||||
android:text="@string/mode_expert_description"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
style="@style/WelcomeButton"
|
||||
android:id="@+id/simple"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
style="@style/WelcomeButtonText"
|
||||
android:text="@string/mode_simple"/>
|
||||
<TextView
|
||||
style="@style/WelcomeButtonSubText"
|
||||
android:text="@string/mode_simple_description"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
</ScrollView>
|
||||
@@ -0,0 +1,76 @@
|
||||
<ScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/automated_action_regex"/>
|
||||
<EditText
|
||||
android:id="@+id/regex"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/automated_action_regex_hint"
|
||||
android:inputType="text"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="12dp"
|
||||
android:text="@string/automated_action_type"/>
|
||||
<RadioGroup
|
||||
android:id="@+id/action_type"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<RadioButton
|
||||
android:id="@+id/action_type_intent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/automated_action_type_intent"/>
|
||||
<RadioButton
|
||||
android:id="@+id/action_type_custom_intent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/automated_action_type_custom_intent"/>
|
||||
</RadioGroup>
|
||||
<LinearLayout
|
||||
android:id="@+id/url_section"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:text="@string/automated_action_url_template"/>
|
||||
<EditText
|
||||
android:id="@+id/url_template"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/automated_action_url_hint"
|
||||
android:inputType="textUri"/>
|
||||
</LinearLayout>
|
||||
<LinearLayout
|
||||
android:id="@+id/intent_section"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:visibility="gone">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:text="@string/automated_action_intent_uri_template"/>
|
||||
<EditText
|
||||
android:id="@+id/intent_uri_template"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/automated_action_intent_uri_hint"
|
||||
android:inputType="textUri"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
@@ -0,0 +1,22 @@
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:text="@string/profile_enter_name"/>
|
||||
<EditText
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textShortMessage|textAutoCorrect|textCapSentences"
|
||||
android:imeOptions="actionDone"
|
||||
android:hint="@string/profile_enter_name_hint"
|
||||
android:maxLines="1"
|
||||
android:maxLength="1024"
|
||||
android:importantForAutofill="no"/>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,31 @@
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ListView
|
||||
android:id="@+id/actions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:divider="@color/separator"
|
||||
android:dividerHeight="1px"/>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<TextView
|
||||
android:visibility="gone"
|
||||
android:id="@+id/no_actions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:padding="32dp"
|
||||
android:text="@string/automated_actions_empty"/>
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/automated_action_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
@@ -0,0 +1,31 @@
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ListView
|
||||
android:id="@+id/profiles"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:clipToPadding="false"
|
||||
android:divider="@color/separator"
|
||||
android:dividerHeight="1px"/>
|
||||
<android.support.design.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<TextView
|
||||
android:visibility="gone"
|
||||
android:id="@+id/no_profiles"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:padding="32dp"
|
||||
android:text="@string/profile_empty"/>
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/profile_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</android.support.design.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
@@ -47,4 +47,9 @@
|
||||
android:title="@string/info"
|
||||
android:icon="@drawable/ic_action_info"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/profile"
|
||||
android:title="@string/profile_default"
|
||||
android:icon="@drawable/ic_action_profile"
|
||||
material:showAsAction="ifRoom"/>
|
||||
</menu>
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
android:title="@string/copy_to_clipboard"
|
||||
android:icon="@drawable/ic_action_copy"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/copy_as_deeplink"
|
||||
android:title="@string/copy_as_deeplink"
|
||||
android:icon="@drawable/ic_action_link"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/export_to_file"
|
||||
android:title="@string/export_to_file"
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
android:title="@string/copy_to_clipboard"
|
||||
android:icon="@drawable/ic_action_copy"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/copy_as_deeplink"
|
||||
android:title="@string/copy_as_deeplink"
|
||||
android:icon="@drawable/ic_action_link"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/share"
|
||||
android:title="@string/share"
|
||||
@@ -26,7 +31,7 @@
|
||||
<item
|
||||
android:id="@+id/share_file"
|
||||
android:title="@string/share_file"
|
||||
android:icon="@drawable/ic_action_share"
|
||||
android:icon="@drawable/ic_action_pick_file"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/create"
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="welcome">مرحبًا!</string>
|
||||
<string name="mode_expert">متقدم</string>
|
||||
<string name="mode_expert_description">أود التحقق من المحتوى المقروء وفتحه يدويًا.</string>
|
||||
<string name="mode_simple">بسيط</string>
|
||||
<string name="mode_simple_description">أريد فقط قراءة الباركود وفتحه فورًا.</string>
|
||||
<string name="camera_error">يتعذر الوصول إلى الكاميرا، يرجى المحاولة مرة أخرى</string>
|
||||
<string name="scan_code">مسح الرمز</string>
|
||||
<string name="compose_barcode">إنشاء رمز Bardcode</string>
|
||||
@@ -14,10 +20,10 @@
|
||||
<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="error_correction_level_l" formatted="false">منخفض (~7% تصحيح)</string>
|
||||
<string name="error_correction_level_m" formatted="false">متوسط (~15% تصحيح)</string>
|
||||
<string name="error_correction_level_q" formatted="false">ربع (~25% تصحيح)</string>
|
||||
<string name="error_correction_level_h" formatted="false">مرتفع (~30% تصحيح)</string>
|
||||
<string name="label">العنوان</string>
|
||||
<string name="colors">المقدمة والخلفية</string>
|
||||
<string name="colors_black_on_white">أسود على خلفية بيضاء</string>
|
||||
@@ -33,23 +39,23 @@
|
||||
<string name="gtin_add_on">إضافة UPC EAN</string>
|
||||
<string name="barcode_version_number">الإصدار</string>
|
||||
<string name="qr_version_and_modules" tools:ignore="PluralsCandidate">%1$s (%2$d وحدات)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">قناع البيانات</string>
|
||||
<string name="toggle_flash">تشغيل/إيقاف الوميض</string>
|
||||
<string name="error_flash">خطأ في تشغيل الوميض</string>
|
||||
<string name="share">مشاركة</string>
|
||||
<string name="share_file">مشاركة كملف</string>
|
||||
<string name="share_as">مشاركة كـ؟</string>
|
||||
<string name="copy_to_clipboard">نسخ إلى الحافظة</string>
|
||||
<string name="copy_as_deeplink">نسخ كرابط عميق</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_width_by_height">الحجم بالبكسل: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">بدون تكبير</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="add_quiet_zone">إضافة منطقة هادئة</string>
|
||||
<string name="input_content_here">أدخل المحتوى هنا</string>
|
||||
<string name="unescape">توسيع رموز الهروب (escape sequences)</string>
|
||||
<string name="encode">ترميز</string>
|
||||
@@ -63,10 +69,11 @@
|
||||
<string name="bulk_mode_delay">الفارق الزمني بين عمليات المسح المستمرة</string>
|
||||
<string name="restrict_format">تحديد التنسيق</string>
|
||||
<string name="remove_restriction">إزالة التحديد</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">مسح %s</string>
|
||||
<string name="find_code">العثور على الرمز</string>
|
||||
<string name="find_code_with_content">ما المحتوى؟</string>
|
||||
<string name="find_code_hint">مصطلح أو تعبير عادي</string>
|
||||
<string name="does_not_match_search_term">لا يطابق مصطلح البحث</string>
|
||||
<string name="scan_for">مسح %s</string>
|
||||
<string name="quarter_second">ربع ثانية</string>
|
||||
<string name="half_second">نصف ثانية</string>
|
||||
<string name="a_second">ثانية واحدة</string>
|
||||
@@ -77,6 +84,17 @@
|
||||
<string name="scan_category">المسح</string>
|
||||
<string name="content_category">المحتوى</string>
|
||||
<string name="locale_category">اللغة</string>
|
||||
<string name="profile_category">الملف الشخصي</string>
|
||||
<string name="profile">الملف الشخصي</string>
|
||||
<string name="profile_default">افتراضي</string>
|
||||
<string name="profile_add">إضافة ملف شخصي جديد</string>
|
||||
<string name="profile_enter_name">أدخل اسم الملف الشخصي</string>
|
||||
<string name="profile_enter_name_hint">الاسم</string>
|
||||
<string name="profile_invalid_name">اسم الملف الشخصي غير صالح</string>
|
||||
<string name="profile_empty">لا توجد ملفات شخصية بعد</string>
|
||||
<string name="profile_current">الملف الشخصي الحالي</string>
|
||||
<string name="profile_remove_confirm">إزالة هذا الملف الشخصي؟</string>
|
||||
<string name="current_profile">الملف الشخصي: %s</string>
|
||||
<string name="custom_locale">تغيير اللغة</string>
|
||||
<string name="follow_system_settings">اتبع إعدادات النظام</string>
|
||||
<string name="show_crop_handle">عرض محدد الاقتصاص</string>
|
||||
@@ -97,7 +115,7 @@
|
||||
<string name="beep_tone">نغمة الصفير</string>
|
||||
<string name="tone_cdma_confirm">تأكيد CDMA</string>
|
||||
<string name="tone_sup_confirm">تأكيد الإشراف على الاتصال</string>
|
||||
<string name="tone_sup_radio_ack">إقرار مسار الراديو الإشرافي على الاتصال.</string>
|
||||
<string name="tone_sup_radio_ack">إقرار مسار الراديو الإشرافي على الاتصال</string>
|
||||
<string name="tone_prop_ack">إقرار إيجابي</string>
|
||||
<string name="tone_prop_beep">صوت صفير عام</string>
|
||||
<string name="tone_prop_beep2">صوت صفير مزدوج عام</string>
|
||||
@@ -124,6 +142,34 @@
|
||||
<string name="default_search_engine">فتح البيانات المجهولة في</string>
|
||||
<string name="always_ask">اسأل دائمًا</string>
|
||||
<string name="open_with_url">فتح البيانات المجهولة باستخدام رابط</string>
|
||||
|
||||
<string name="automated_actions">الإجراءات الآلية</string>
|
||||
<string name="automated_actions_none">لا توجد إجراءات آلية</string>
|
||||
<string name="automated_actions_empty">لا توجد إجراءات آلية بعد</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="zero">%d إجراء آلي</item>
|
||||
<item quantity="one">%d إجراء آلي</item>
|
||||
<item quantity="two">%d إجراءان آليان</item>
|
||||
<item quantity="few">%d إجراءات آلية</item>
|
||||
<item quantity="many">%d إجراءً آليًا</item>
|
||||
<item quantity="other">%d إجراءات آلية</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">إضافة إجراء</string>
|
||||
<string name="automated_action_edit">تعديل الإجراء</string>
|
||||
<string name="automated_action_regex">تعبير نمطي</string>
|
||||
<string name="automated_action_regex_hint">مثل ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">التعبير النمطي مطلوب</string>
|
||||
<string name="automated_action_regex_invalid">تعبير نمطي غير صالح</string>
|
||||
<string name="automated_action_type">نوع الإجراء</string>
|
||||
<string name="automated_action_type_intent">فتح URL</string>
|
||||
<string name="automated_action_url_template">قالب URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">قالب URL مطلوب</string>
|
||||
<string name="automated_action_invalid_url">قالب URL غير صالح</string>
|
||||
<string name="automated_action_remove_confirm">إزالة هذا الإجراء؟</string>
|
||||
<string name="automated_action_list_intent">فتح URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">فتح URL</string>
|
||||
<string name="automated_action_webview_title">إجراء آلي</string>
|
||||
<string name="clear_network_suggestions">إزالة الشبكات المقترحة</string>
|
||||
<string name="clear_network_suggestions_summary">إزالة الشبكات المقترحة التي تمت إضافتها مسبقًا من خلال هذا التطبيق.</string>
|
||||
<string name="really_remove_all_networks">هل تريد حقًا إزالة جميع الشبكات؟</string>
|
||||
@@ -134,8 +180,8 @@
|
||||
<string name="send_scan_active_summary">قم بالتمكين لإعادة توجيه عمليات المسح إلى رابط معين.</string>
|
||||
<string name="send_scan_url">الرابط المراد إعادة التوجيه إليه</string>
|
||||
<string name="send_scan_type">نوع الطلب</string>
|
||||
<string name="send_type_get_add_content">GET and simply add content</string>
|
||||
<string name="send_type_get_query_string">GET with complete query string</string>
|
||||
<string name="send_type_get_add_content">نوع GET وأضفه ببساطة</string>
|
||||
<string name="send_type_get_query_string">نوع GET مع سلسلة الاستعلام الكاملة</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">فتح في متصفح خارجي</string>
|
||||
@@ -214,4 +260,18 @@
|
||||
<string name="wifi_phase2">طريقة Phase 2</string>
|
||||
<string name="network_suggestions">الشبكات المقترحة</string>
|
||||
<string name="remove_suggestion">إزالة الاقتراحات</string>
|
||||
<string name="email_to">المستلم</string>
|
||||
<string name="email_subject">الموضوع</string>
|
||||
<string name="email_body">النص</string>
|
||||
<string name="scheme">المخطط</string>
|
||||
<string name="host">المضيف</string>
|
||||
<string name="query">استعلام</string>
|
||||
<string name="automated_action_type_custom_intent">Intent مخصص</string>
|
||||
<string name="automated_action_intent_uri_template">قالب عنوان Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">عنوان Intent مطلوب</string>
|
||||
<string name="automated_action_intent_uri_invalid">عنوان Intent غير صالح</string>
|
||||
<string name="automated_action_list_custom_intent">Intent مخصص: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent مخصص</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Добре дошли!</string>
|
||||
<string name="mode_expert">Разширен</string>
|
||||
<string name="mode_expert_description">Искам да проверя прочетеното съдържание и да го отворя ръчно.</string>
|
||||
<string name="mode_simple">Опростен</string>
|
||||
<string name="mode_simple_description">Искам просто да сканирам баркодове и да ги отварям веднага.</string>
|
||||
<string name="camera_error">Няма достъп до камерата, моля, опитайте отново</string>
|
||||
<string name="scan_code">Сканирайте код</string>
|
||||
<string name="compose_barcode">Създаване на баркод</string>
|
||||
@@ -14,7 +19,7 @@
|
||||
<string name="error_correction_level_m" formatted="false">Средно (~15% корекция)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Четвъртично (~25% корекция)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Високо (~30% корекция)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="label">Етикет</string>
|
||||
<string name="colors">Преден и заден план</string>
|
||||
<string name="colors_black_on_white">Черно на бяло</string>
|
||||
<string name="colors_white_on_black">Бяло на черно</string>
|
||||
@@ -29,23 +34,23 @@
|
||||
<string name="gtin_add_on">UPC EAN разширение</string>
|
||||
<string name="barcode_version_number">Версия</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d модули)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Маска за данни</string>
|
||||
<string name="toggle_flash">Превключване на светкавицата</string>
|
||||
<string name="error_flash">Грешка при превключването на светкавицата</string>
|
||||
<string name="share">Сподели</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">Споделяне като файл</string>
|
||||
<string name="share_as">Сподели като?</string>
|
||||
<string name="copy_to_clipboard">Копиране в клипборда</string>
|
||||
<string name="copy_as_deeplink">Копиране като дийп линк</string>
|
||||
<string name="copied_to_clipboard">Копирано в клипборда</string>
|
||||
<string name="copy_password">Копиране на паролата в клипборда</string>
|
||||
<string name="copied_password_to_clipboard">Паролата е копирана в клипборда</string>
|
||||
<string name="open_url">Отворете URL(Линк)</string>
|
||||
<string name="cannot_resolve_action">Няма приложение което може да отвори това</string>
|
||||
<string name="pick_search_engine">Изберете търсачка</string>
|
||||
<string name="format">Формат</string>
|
||||
<string name="size_width_by_height">Размер в пиксели: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Без увеличение</string>
|
||||
<string name="add_quiet_zone">Добавяне на тиха зона</string>
|
||||
<string name="input_content_here">Въведете съдържание тук</string>
|
||||
<string name="unescape">Разширете последователности за извеждане</string>
|
||||
<string name="encode">КОДИРАНЕ</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Забавяне между непрекъснатите сканирания</string>
|
||||
<string name="restrict_format">Ограничаване на формат</string>
|
||||
<string name="remove_restriction">Премахване на ограничението</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Сканиране %s</string>
|
||||
<string name="find_code">Намерете кода</string>
|
||||
<string name="find_code_with_content">Какво съдържание?</string>
|
||||
<string name="find_code_hint">Термин или регулярен израз</string>
|
||||
<string name="does_not_match_search_term">Не съответства на търсения термин</string>
|
||||
<string name="scan_for">Сканиране %s</string>
|
||||
<string name="quarter_second">Червърт секунда</string>
|
||||
<string name="half_second">Половин секунда</string>
|
||||
<string name="a_second">Една секунда</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Сканиране</string>
|
||||
<string name="content_category">Съдържание</string>
|
||||
<string name="locale_category">Език</string>
|
||||
<string name="profile_category">Профил</string>
|
||||
<string name="profile">Профил</string>
|
||||
<string name="profile_default">По подразбиране</string>
|
||||
<string name="profile_add">Добавяне на нов профил</string>
|
||||
<string name="profile_enter_name">Въведете име на профила</string>
|
||||
<string name="profile_enter_name_hint">Име</string>
|
||||
<string name="profile_invalid_name">Невалидно име на профила</string>
|
||||
<string name="profile_empty">Все още няма профили</string>
|
||||
<string name="profile_current">Текущ профил</string>
|
||||
<string name="profile_remove_confirm">Премахване на този профил?</string>
|
||||
<string name="current_profile">Профил: %s</string>
|
||||
<string name="custom_locale">Персонализиран език</string>
|
||||
<string name="follow_system_settings">Следване на системните настройки</string>
|
||||
<string name="show_crop_handle">Показване на ограничителя за изрязване</string>
|
||||
@@ -99,10 +116,10 @@
|
||||
<string name="tone_prop_beep2">Общ двоен звуков сигнал</string>
|
||||
<string name="use_history">Хронология на сканирането</string>
|
||||
<string name="use_history_summary">Запазва разпознатите кодове на вашето устройство.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Игнорирайте дубликати</string>
|
||||
<string name="ignore_consecutive_duplicates">Игнориране на дубликатите</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Приемане на дубликати</string>
|
||||
<string name="open_immediately">Отваряй внезапно</string>
|
||||
<string name="open_immediately_summary">Пропуска проверката и внезапно отваря съдържанието. Може да отвори вредно съдържание, ако е активирано.</string>
|
||||
<string name="copy_immediately">Поставяй в клипборда</string>
|
||||
@@ -111,8 +128,8 @@
|
||||
<string name="show_meta_data_summary">Показване на допълнителни данни за сканирания баркод.</string>
|
||||
<string name="show_hex_dump">Показване на шестнадесетичен дъмп</string>
|
||||
<string name="show_hex_dump_summary">Показване на шестнадесетичен дъмп на сканираното съдържание.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">Покажи контролна сума</string>
|
||||
<string name="no_checksum">Без контролна сума</string>
|
||||
<string name="show_recreation">Показване на пресъздаден баркод</string>
|
||||
<string name="show_recreation_summary">Създай и покажи баркод отново от прочетеното съдържание, ако е възможно.</string>
|
||||
<string name="close_automatically">Върщане се след Копиране/Споделяне</string>
|
||||
@@ -120,6 +137,30 @@
|
||||
<string name="default_search_engine">Отворяй неизвестни данни в</string>
|
||||
<string name="always_ask">Винаги питай</string>
|
||||
<string name="open_with_url">Отворяне на неизвестни данни с URL</string>
|
||||
|
||||
<string name="automated_actions">Автоматизирани действия</string>
|
||||
<string name="automated_actions_none">Няма автоматизирани действия</string>
|
||||
<string name="automated_actions_empty">Все още няма автоматизирани действия</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d автоматизирано действие</item>
|
||||
<item quantity="other">%d автоматизирани действия</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Добавяне на действие</string>
|
||||
<string name="automated_action_edit">Редактиране на действие</string>
|
||||
<string name="automated_action_regex">Регулярен израз</string>
|
||||
<string name="automated_action_regex_hint">напр. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Регулярен израз е задължителен</string>
|
||||
<string name="automated_action_regex_invalid">Невалиден регулярен израз</string>
|
||||
<string name="automated_action_type">Тип действие</string>
|
||||
<string name="automated_action_type_intent">Отваряне на URL</string>
|
||||
<string name="automated_action_url_template">Шаблон на URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Шаблон на URL е задължителен</string>
|
||||
<string name="automated_action_invalid_url">Невалиден шаблон на URL</string>
|
||||
<string name="automated_action_remove_confirm">Да се премахне ли това действие?</string>
|
||||
<string name="automated_action_list_intent">Отваряне на URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Отваряне на URL</string>
|
||||
<string name="automated_action_webview_title">Автоматизирано действие</string>
|
||||
<string name="clear_network_suggestions">Премахнете мрежовите предложения</string>
|
||||
<string name="clear_network_suggestions_summary">Премахване на мрежовите предложения, които преди са били добавени с това приложение.</string>
|
||||
<string name="really_remove_all_networks">Наистина ли искате да премахнете всички мрежи?</string>
|
||||
@@ -143,9 +184,9 @@
|
||||
<string name="bluetooth_connect_fail">Неуспешно свързване с Bluetooth устройство.</string>
|
||||
<string name="bluetooth_send_fail">Неуспешно изпращане до Bluetooth устройство.</string>
|
||||
<string name="bluetooth_send_success">Успешно Bluetooth изпращане.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Поколение</string>
|
||||
<string name="brighten_screen">Подсвети екрана</string>
|
||||
<string name="brighten_screen_summary">Задайте яркостта на максимум, за да подобрите сканирането на баркод от екрана.</string>
|
||||
<string name="really_remove_scan">Наистина ли искате да премахнете това сканиране?</string>
|
||||
<string name="really_remove_all_scans">Наистина ли искате да премахнете всички сканирания?</string>
|
||||
<string name="really_remove_selected_scans">Наистина ли искате да премахнете избраните сканирания?</string>
|
||||
@@ -179,8 +220,8 @@
|
||||
<string name="otpauth_add">Добави 2FA</string>
|
||||
<string name="search_web">Търси в мрежата</string>
|
||||
<string name="search_scan">Търсещо сканиране</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Добави към историята</string>
|
||||
<string name="added_to_history">Добавено към историята</string>
|
||||
<string name="export_to_file">Извеждане в файл</string>
|
||||
<string name="export_as">Извеждане като?</string>
|
||||
<string name="export_csv_comma">CSV файл със запетаи</string>
|
||||
@@ -195,7 +236,7 @@
|
||||
<string name="pick_code_to_scan">Изберете код за сканиране</string>
|
||||
<string name="shortcut_decode">Сканирай баркод</string>
|
||||
<string name="shortcut_encode">Създай баркод</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">История</string>
|
||||
<string name="shortcut_preferences">Настройки</string>
|
||||
<string name="background_request_failed">Неуспешна заявка в фонов режим</string>
|
||||
<string name="entry_type">Тип</string>
|
||||
@@ -210,4 +251,18 @@
|
||||
<string name="wifi_phase2">Фаза 2 метод</string>
|
||||
<string name="network_suggestions">Предложения за интернет мрежа</string>
|
||||
<string name="remove_suggestion">Премахване на предложението</string>
|
||||
<string name="email_to">Получател</string>
|
||||
<string name="email_subject">Тема</string>
|
||||
<string name="email_body">Съдържание</string>
|
||||
<string name="scheme">Схема</string>
|
||||
<string name="host">Домакин</string>
|
||||
<string name="query">Заявка</string>
|
||||
<string name="automated_action_type_custom_intent">Персонализиран Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Шаблон за Intent URI</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI е задължителен</string>
|
||||
<string name="automated_action_intent_uri_invalid">Невалиден Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">Персонализиран Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Персонализиран Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">স্বাগতম!</string>
|
||||
<string name="mode_expert">উন্নত</string>
|
||||
<string name="mode_expert_description">আমি পড়া বিষয়বস্তু যাচাই করতে চাই এবং এটি নিজে খুলতে চাই।</string>
|
||||
<string name="mode_simple">সহজ</string>
|
||||
<string name="mode_simple_description">আমি কেবল বারকোড স্ক্যান করতে চাই এবং তা সঙ্গে সঙ্গে খুলতে চাই।</string>
|
||||
<string name="camera_error">ক্যামেরা পাওয়া যাচ্ছে না, পরে চেষ্টা করো</string>
|
||||
<string name="scan_code">সংকেতের পাঠোদ্ধার</string>
|
||||
<string name="compose_barcode">বারকোড বানাও</string>
|
||||
@@ -14,40 +19,40 @@
|
||||
<string name="error_correction_level_m" formatted="false">মধ্যম (~১৫% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_q" formatted="false">বেশি (~২৫% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_h" formatted="false">অনেক বেশি (~৩০% ঠিককরণ)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="label">লেবেল</string>
|
||||
<string name="colors">পূর্ববর্তী এবং সৃজনাধীন</string>
|
||||
<string name="colors_black_on_white">সাদা উপরে কালো</string>
|
||||
<string name="colors_white_on_black">কালো উপর সাদা</string>
|
||||
<string name="colors_black_on_transparent">সাদা সহজ পারদার উপর</string>
|
||||
<string name="colors_white_on_transparent">পারদার উপর সাদা</string>
|
||||
<string name="sequence_size">ধারার আকার</string>
|
||||
<string name="sequence_index">ক্রমিক সূচী</string>
|
||||
<string name="sequence_id">ক্রম আইডি</string>
|
||||
<string name="gtin_issue_number">সমস্যা ক্রম</string>
|
||||
<string name="gtin_country">তৈরির সম্ভাব্য দেশ</string>
|
||||
<string name="gtin_price">প্রস্তসবিত দাম</string>
|
||||
<string name="gtin_add_on">ইউপিসি ইএএন বর্ধিত</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="barcode_version_number">সংস্করণ</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">ডেটা মাস্ক</string>
|
||||
<string name="toggle_flash">আলো</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="error_flash">ফ্ল্যাশ টগল করার সময় ত্রুটি</string>
|
||||
<string name="share">ভাগ করো</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">ফাইল হিসেবে ভাগাভাগি</string>
|
||||
<string name="share_as">ভাগ করার মাধ্যম</string>
|
||||
<string name="copy_to_clipboard">ক্লিপবোর্ডে অনুলিপি</string>
|
||||
<string name="copy_as_deeplink">ডিপলিংক হিসেবে কপি করুন</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_width_by_height">পিক্সেলে আকা:%1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">কোনো বৃদ্ধি নেই</string>
|
||||
<string name="add_quiet_zone">শান্তি জোন যোগ করুন</string>
|
||||
<string name="input_content_here">এখানে তথ্য দাও</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">এস্কেপ সিকোয়েন্স প্রসারিত করুন</string>
|
||||
<string name="encode">সংকেতকরণ</string>
|
||||
<string name="error_no_content">তথ্য নেই</string>
|
||||
<string name="error_encoding_barcode">বারকোড বানানো যায়নি</string>
|
||||
@@ -56,28 +61,40 @@
|
||||
<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="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</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="bulk_mode_delay">একটি অবিরত স্ক্যান মধ্যে বিলম্ব</string>
|
||||
<string name="restrict_format">বিনিয়োগ বাধাগ্রস্ত ফরম্যাট</string>
|
||||
<string name="remove_restriction">সীমাবদ্ধতা অপসারণ করুন</string>
|
||||
<string name="find_code">কোড খুঁজুন</string>
|
||||
<string name="find_code_with_content"> কী বিষয়টি? </string>
|
||||
<string name="find_code_hint">শব্দ বা রেগুলার এক্সপ্রেশন</string>
|
||||
<string name="does_not_match_search_term">অনুসন্ধান শর্তের সাথে মিলে না</string>
|
||||
<string name="scan_for">স্ক্যান %s</string>
|
||||
<string name="quarter_second">এক চতুর্থ সেকেন্ড</string>
|
||||
<string name="half_second">আধা সেকেন্ড</string>
|
||||
<string name="a_second">এক সেকেন্ড</string>
|
||||
<string name="two_seconds">দুই সেকেন্ড</string>
|
||||
<string name="five_seconds">পাঁচ সেকেন্ড</string>
|
||||
<string name="history">ইতিহাস</string>
|
||||
<string name="preferences">পছন্দসমূহ</string>
|
||||
<string name="scan_category">খুঁজো</string>
|
||||
<string name="content_category">তথ্য</string>
|
||||
<string name="locale_category">ভাষা</string>
|
||||
<string name="profile_category">প্রোফাইল</string>
|
||||
<string name="profile">প্রোফাইল</string>
|
||||
<string name="profile_default">ডিফল্ট</string>
|
||||
<string name="profile_add">নতুন প্রোফাইল যোগ করো</string>
|
||||
<string name="profile_enter_name">প্রোফাইলের নাম লেখো</string>
|
||||
<string name="profile_enter_name_hint">নাম</string>
|
||||
<string name="profile_invalid_name">প্রোফাইলের নাম অবৈধ</string>
|
||||
<string name="profile_empty">এখনও কোনো প্রোফাইল নেই</string>
|
||||
<string name="profile_current">বর্তমান প্রোফাইল</string>
|
||||
<string name="profile_remove_confirm">এই প্রোফাইলটি সরাবেন?</string>
|
||||
<string name="current_profile">প্রোফাইল: %s</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="barcode_formats">বারকোড বিন্যাস</string>
|
||||
<string name="zoom_by_swiping">ওপরে/নিচে টানো বড়ো করার জন্য</string>
|
||||
<string name="zoom_by_swiping_summary">ক্যামেরার ছোটো-বড় নিয়ন্ত্রণের জন্য উপরে-নিচে টানো।</string>
|
||||
<string name="auto_rotate">খাড়া ১ডি বারকোড সনাক্ত করো</string>
|
||||
@@ -88,21 +105,21 @@
|
||||
<string name="show_toast_in_bulk_mode_summary">ধারাবাহিকভাবে তথ্য দেখানোর সময় মুহূর্তের জন্য তথ্য দেখাও।</string>
|
||||
<string name="vibrate">চিনলে কাঁপো</string>
|
||||
<string name="vibrate_summary">এটা সক্ষম রাখলে সংকেত চিনার সাথে সাথে কাঁপবে।</string>
|
||||
<string name="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="beep">প্রকোপে বিপ দিন</string>
|
||||
<string name="beep_summary">যদি আপনি চান যে আপনার ডিভাইসটি কোড প্রাপ্ত হলে বিপ শব্দ করে।</string>
|
||||
<string name="beep_tone">বিপ টোন</string>
|
||||
<string name="tone_cdma_confirm">সিডিএমএ নিশ্চিত করুন</string>
|
||||
<string name="tone_sup_confirm">কল সুপারভাইজরী কনফার্ম</string>
|
||||
<string name="tone_sup_radio_ack">কল সুপারভাইজরি রেডিও পাথ স্বীকৃতি</string>
|
||||
<string name="tone_prop_ack">ধন্যবাদ</string>
|
||||
<string name="tone_prop_beep">সাধারণ বিপ</string>
|
||||
<string name="tone_prop_beep2">সাধারণ ডাবল বিপ</string>
|
||||
<string name="use_history">ইতিহাস সংরক্ষণ করো।</string>
|
||||
<string name="use_history_summary">সনাক্তকৃত সংকেত যন্ত্রে সংরক্ষণ করো।</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">নকল উপেক্ষা করুন</string>
|
||||
<string name="ignore_consecutive_duplicates">দ্বিত্ব উপেক্ষা করো</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">ডুপ্লিকেট গ্রহণ করুন</string>
|
||||
<string name="open_immediately">সাথে সাথে খুলো</string>
|
||||
<string name="open_immediately_summary">না দেখে সাথে সাথে খুলো। সক্রিয় থাকলে ক্ষতিকারক তথ্য খুলতে পারে।</string>
|
||||
<string name="copy_immediately">ক্লিপবোর্ডে রাখো</string>
|
||||
@@ -111,22 +128,46 @@
|
||||
<string name="show_meta_data_summary">সনাক্তকৃত বারকোড নিয়ে অতিরিক্ত তথ্য দেখাও।</string>
|
||||
<string name="show_hex_dump">ষড়(hex) সংকেত দেখাও</string>
|
||||
<string name="show_hex_dump_summary">পড়া তথ্যের ষড় সংকেত দেখাও</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="show_checksum">সামগ্রিক চেকসাম দেখান</string>
|
||||
<string name="no_checksum">কোনো চেকসাম নেই</string>
|
||||
<string name="show_recreation">পুনরায় তৈরি বারকোড দেখান</string>
|
||||
<string name="show_recreation_summary">যদি সম্ভব হয়, পঠিত বিষয় থেকে পুনরায় সৃষ্টি করুন এবং বারকোড দেখান।</string>
|
||||
<string name="close_automatically">অনুলিপি/ভাগ করার পরে পিছনে যাও</string>
|
||||
<string name="close_automatically_summary">তথ্য অনুলিপি/ভাগ করার পরে স্বয়ংক্রিয়ভাবে পিছনে যাও।</string>
|
||||
<string name="default_search_engine">Open unknown data in</string>
|
||||
<string name="always_ask">Always ask</string>
|
||||
<string name="default_search_engine">অজানা ডেটা খোলুন</string>
|
||||
<string name="always_ask">সবসময় জিজ্ঞাসা করুন</string>
|
||||
<string name="open_with_url">অজানা ইউআরএল খুলো</string>
|
||||
|
||||
<string name="automated_actions">স্বয়ংক্রিয় ক্রিয়াসমূহ</string>
|
||||
<string name="automated_actions_none">কোনো স্বয়ংক্রিয় ক্রিয়া নেই</string>
|
||||
<string name="automated_actions_empty">এখনো কোনো স্বয়ংক্রিয় ক্রিয়া নেই</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%dটি স্বয়ংক্রিয় ক্রিয়া</item>
|
||||
<item quantity="other">%dটি স্বয়ংক্রিয় ক্রিয়া</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">ক্রিয়া যোগ করুন</string>
|
||||
<string name="automated_action_edit">ক্রিয়া সম্পাদনা</string>
|
||||
<string name="automated_action_regex">রেগেক্স</string>
|
||||
<string name="automated_action_regex_hint">উদাহরণ ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">রেগেক্স প্রয়োজন</string>
|
||||
<string name="automated_action_regex_invalid">অবৈধ রেগেক্স</string>
|
||||
<string name="automated_action_type">ক্রিয়ার ধরন</string>
|
||||
<string name="automated_action_type_intent">URL খুলুন</string>
|
||||
<string name="automated_action_url_template">URL টেমপ্লেট</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL টেমপ্লেট প্রয়োজন</string>
|
||||
<string name="automated_action_invalid_url">অবৈধ URL টেমপ্লেট</string>
|
||||
<string name="automated_action_remove_confirm">এই ক্রিয়াটি সরাবেন?</string>
|
||||
<string name="automated_action_list_intent">URL খুলুন: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL খুলুন</string>
|
||||
<string name="automated_action_webview_title">স্বয়ংক্রিয় ক্রিয়া</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="really_remove_all_networks">সব নেটওয়ার্ক সত্যিই সরান?</string>
|
||||
<string name="clear_network_suggestions_success">নেটওয়ার্ক পরামর্শ মোছা হয়েছে</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">মুছতে কিছু নেই</string>
|
||||
<string name="send_category">অন্যকে পাঠাও</string>
|
||||
<string name="send_scan_active">Forward scans</string>
|
||||
<string name="send_scan_active">পুনরায় স্ক্যান পাঠান</string>
|
||||
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
|
||||
<string name="send_scan_url">প্রতিটি পাঠোদ্ধার ইউআরএল-এ পাঠাও</string>
|
||||
<string name="send_scan_type">প্রতি পাঠোদ্ধারের জন্য অনুরোধ</string>
|
||||
@@ -134,18 +175,18 @@
|
||||
<string name="send_type_get_query_string">সম্পূর্ণ কুয়েরি স্ট্রিং দিয়ে গেট(GET) করো</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Open in external browser</string>
|
||||
<string name="send_type_external_browser">বাহ্যিক ব্রাউজারে খোলুন</string>
|
||||
<string name="test_url">পরীক্ষার জন্য ইউআরএল</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">ব্লুটুথ দিয়ে স্ক্যান ফরোয়ার্ড করুন</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">হোস্ট</string>
|
||||
<string name="no_bluetooth_hosts_paired">কোন হোস্ট পেয়ার করা হয়নি</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">প্রজন্ম</string>
|
||||
<string name="brighten_screen">স্ক্রিন উজ্জ্বল করুন</string>
|
||||
<string name="brighten_screen_summary">স্ক্রিন থেকে বারকোড স্ক্যান করার জন্য উজ্জ্বলতা সর্বোচ্চ করুন।</string>
|
||||
<string name="really_remove_scan">আসলেই এটা মুছবে?</string>
|
||||
<string name="really_remove_all_scans">আসলেই সব মুছবে?</string>
|
||||
<string name="really_remove_selected_scans">আসলেই নির্বাচিত সব মুছবে?</string>
|
||||
@@ -179,8 +220,8 @@
|
||||
<string name="otpauth_add">২এফএ যোগ করো</string>
|
||||
<string name="search_web">ওয়েবে খুঁজো</string>
|
||||
<string name="search_scan">আগেরগুলোতে খুঁজো</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">ইতিহাসে যোগ করুন</string>
|
||||
<string name="added_to_history">ইতিহাসে যোগ করা হয়েছে</string>
|
||||
<string name="export_to_file">নথিতে রপ্তানি করো</string>
|
||||
<string name="export_as">রপ্তানির ধরণ?</string>
|
||||
<string name="export_csv_comma">কমাসহ সিএসভি(.csv) নথি</string>
|
||||
@@ -189,25 +230,39 @@
|
||||
<string name="export_database">এসকিউলাইট তথ্যভিত্তি</string>
|
||||
<string name="saved_in_downloads">ডাউনলোডে সংরক্ষিত</string>
|
||||
<string name="rotate_image_cw">ছবি ঘড়ির দিকে ঘুরাও</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">মুক্ত ঘূর্ণন টগল করুন</string>
|
||||
<string name="pick_file">একটি ফাইল চয়ন করুন</string>
|
||||
<string name="pick_image_file">ছবি নাও</string>
|
||||
<string name="pick_code_to_scan">খুঁজার জন্য কোড নাও</string>
|
||||
<string name="shortcut_decode">বারকোড খুজো</string>
|
||||
<string name="shortcut_encode">বারকোড বানাও</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">ইতিহাস</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>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="entry_type">ধরণ</string>
|
||||
<string name="wifi_network">ওয়াই-ফাই নেটওয়ার্ক</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>
|
||||
<string name="network_suggestions">নেটওয়ার্ক সুপারিশ</string>
|
||||
<string name="remove_suggestion">প্রস্তাব সরান</string>
|
||||
<string name="email_to">প্রাপক</string>
|
||||
<string name="email_subject">বিষয়</string>
|
||||
<string name="email_body">বার্তা</string>
|
||||
<string name="scheme">ব্যবস্থা</string>
|
||||
<string name="host">হোস্ট</string>
|
||||
<string name="query">অনুসন্ধান</string>
|
||||
<string name="automated_action_type_custom_intent">কাস্টম Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI টেমপ্লেট</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI প্রয়োজন</string>
|
||||
<string name="automated_action_intent_uri_invalid">অবৈধ Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">কাস্টম Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">কাস্টম Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Vítejte!</string>
|
||||
<string name="mode_expert">Pokročilý</string>
|
||||
<string name="mode_expert_description">Chci zkontrolovat načtený obsah a otevřít jej ručně.</string>
|
||||
<string name="mode_simple">Jednoduchý</string>
|
||||
<string name="mode_simple_description">Chci jen skenovat čárové kódy a okamžitě je otevírat.</string>
|
||||
<string name="camera_error">Nepodařilo se otevřít fotoaparát, prosím zkuste to znovu</string>
|
||||
<string name="scan_code">Naskenovat kód</string>
|
||||
<string name="compose_barcode">Vytvořit čárový kód</string>
|
||||
@@ -12,11 +18,11 @@
|
||||
<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="label">Label</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="label">Štítek</string>
|
||||
<string name="colors">Popředí a pozadí</string>
|
||||
<string name="colors_black_on_white">Černá na bílé</string>
|
||||
<string name="colors_white_on_black">Bílá na černé</string>
|
||||
@@ -31,23 +37,23 @@
|
||||
<string name="gtin_add_on">rozšíření UPC EAN</string>
|
||||
<string name="barcode_version_number">Verze</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modulů)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Maska dat</string>
|
||||
<string name="toggle_flash">Přepnout blesk</string>
|
||||
<string name="error_flash">Zapnutí/vypnutí blesku selhalo</string>
|
||||
<string name="share">Sdílet</string>
|
||||
<string name="share_file">Sdílet jako soubor</string>
|
||||
<string name="share_as">Sdílet jako</string>
|
||||
<string name="share_as">Sdílet jako?</string>
|
||||
<string name="copy_to_clipboard">Zkopírovat do schránky</string>
|
||||
<string name="copy_as_deeplink">Kopírovat jako deeplink</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 toto uměla otevřít</string>
|
||||
<string name="pick_search_engine">Zvolte vyhledávač</string>
|
||||
<string name="format">Formát</string>
|
||||
<string name="size_width_by_height">Velikost v pixelech: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Žádné zvětšení</string>
|
||||
<string name="add_quiet_zone">Přidat tichou zónu</string>
|
||||
<string name="input_content_here">Sem vložte obsah</string>
|
||||
<string name="unescape">Rozšířit escape sekvence</string>
|
||||
<string name="encode">ZAKÓDOVAT</string>
|
||||
@@ -61,10 +67,11 @@
|
||||
<string name="bulk_mode_delay">Prodleva mezi skeny</string>
|
||||
<string name="restrict_format">Omezit na formát</string>
|
||||
<string name="remove_restriction">Zrušit omezení formátu</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Naskenovat %s</string>
|
||||
<string name="find_code">Najít kód</string>
|
||||
<string name="find_code_with_content">Co obsah?</string>
|
||||
<string name="find_code_hint">Termín nebo regulární výraz</string>
|
||||
<string name="does_not_match_search_term">Neodpovídá vyhledávacímu termínu</string>
|
||||
<string name="scan_for">Naskenovat %s</string>
|
||||
<string name="quarter_second">Čtvrt sekundy</string>
|
||||
<string name="half_second">Půl sekundy</string>
|
||||
<string name="a_second">Jedna sekunda</string>
|
||||
@@ -75,6 +82,17 @@
|
||||
<string name="scan_category">Skenování</string>
|
||||
<string name="content_category">Obsah</string>
|
||||
<string name="locale_category">Jazyk</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Výchozí</string>
|
||||
<string name="profile_add">Přidat nový profil</string>
|
||||
<string name="profile_enter_name">Zadejte název profilu</string>
|
||||
<string name="profile_enter_name_hint">Název</string>
|
||||
<string name="profile_invalid_name">Neplatný název profilu</string>
|
||||
<string name="profile_empty">Zatím žádné profily</string>
|
||||
<string name="profile_current">Aktuální profil</string>
|
||||
<string name="profile_remove_confirm">Odebrat tento profil?</string>
|
||||
<string name="current_profile">Profil: %s</string>
|
||||
<string name="custom_locale">Nastavit jazyk</string>
|
||||
<string name="follow_system_settings">Podle systému</string>
|
||||
<string name="show_crop_handle">Zobrazovat hrany výřezu</string>
|
||||
@@ -94,17 +112,17 @@
|
||||
<string name="beep_summary">Povolte, pokud chcete pípnutí při rozpoznání kódu.</string>
|
||||
<string name="beep_tone">Tón pípnutí</string>
|
||||
<string name="tone_cdma_confirm">Potvrzení CDMA</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_sup_confirm">Potvrzení dohledu volání</string>
|
||||
<string name="tone_sup_radio_ack">Hovor na dohledové rádiové cestě potvrzení</string>
|
||||
<string name="tone_prop_ack">Kladné potvrzení příjmu</string>
|
||||
<string name="tone_prop_beep">Obecné pípnutí</string>
|
||||
<string name="tone_prop_beep2">Dvojité obecné pípnutí</string>
|
||||
<string name="use_history">Ukládat historii skenování</string>
|
||||
<string name="use_history_summary">Rozpoznané kódy se uloží do zařízení.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Ignorovat duplicity</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorovat duplikáty</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Přijmout duplicity</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>
|
||||
@@ -113,8 +131,8 @@
|
||||
<string name="show_meta_data_summary">Zobrazí další data o naskenovaném čárovém kódu.</string>
|
||||
<string name="show_hex_dump">Zobrazit hex dump</string>
|
||||
<string name="show_hex_dump_summary">Zobrazí hex dump naskenovaného obsahu.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">Zobrazit kontrolní součet</string>
|
||||
<string name="no_checksum">Žádný kontrolní součet</string>
|
||||
<string name="show_recreation">Zobrazit zrekonstruovaný kód</string>
|
||||
<string name="show_recreation_summary">Zrekonstruovat a zobrazit čárový kód z přečteného obrazu, pokud je to možné.</string>
|
||||
<string name="close_automatically">Vrátit se po zkopírování/sdílení</string>
|
||||
@@ -122,6 +140,32 @@
|
||||
<string name="default_search_engine">Nerozpoznaná data otevřít v</string>
|
||||
<string name="always_ask">Vždy se zeptat</string>
|
||||
<string name="open_with_url">Otevřít nerozpoznaná data pomocí URL</string>
|
||||
|
||||
<string name="automated_actions">Automatizované akce</string>
|
||||
<string name="automated_actions_none">Žádné automatizované akce</string>
|
||||
<string name="automated_actions_empty">Zatím žádné automatizované akce</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d automatizovaná akce</item>
|
||||
<item quantity="few">%d automatizované akce</item>
|
||||
<item quantity="many">%d automatizovaných akcí</item>
|
||||
<item quantity="other">%d automatizované akce</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Přidat akci</string>
|
||||
<string name="automated_action_edit">Upravit akci</string>
|
||||
<string name="automated_action_regex">Regulární výraz</string>
|
||||
<string name="automated_action_regex_hint">např. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regulární výraz je povinný</string>
|
||||
<string name="automated_action_regex_invalid">Neplatný regulární výraz</string>
|
||||
<string name="automated_action_type">Typ akce</string>
|
||||
<string name="automated_action_type_intent">Otevřít URL</string>
|
||||
<string name="automated_action_url_template">Šablona URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Šablona URL je povinná</string>
|
||||
<string name="automated_action_invalid_url">Neplatná šablona URL</string>
|
||||
<string name="automated_action_remove_confirm">Odstranit tuto akci?</string>
|
||||
<string name="automated_action_list_intent">Otevřít URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Otevřít URL</string>
|
||||
<string name="automated_action_webview_title">Automatizovaná akce</string>
|
||||
<string name="clear_network_suggestions">Smazat navrhované sítě</string>
|
||||
<string name="clear_network_suggestions_summary">Smazat všechny sítě, které byly navrženy touto aplikací.</string>
|
||||
<string name="really_remove_all_networks">Opravdu smazat všechny sítě?</string>
|
||||
@@ -129,11 +173,11 @@
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Nic ke smazání</string>
|
||||
<string name="send_category">Předávání</string>
|
||||
<string name="send_scan_active">Předávat skeny</string>
|
||||
<string name="send_scan_active_summary">Zapnout předávání skenů na danou URL</string>
|
||||
<string name="send_scan_active_summary">Zapnout předávání skenů na danou URL.</string>
|
||||
<string name="send_scan_url">Posílat každý sken na URL</string>
|
||||
<string name="send_scan_type">Typ požadavku pro každý sken</string>
|
||||
<string name="send_type_get_add_content">GET a simply add content</string>
|
||||
<string name="send_type_get_query_string">GET with complete query string</string>
|
||||
<string name="send_type_get_query_string">GET s kompletním řetězcem dotazu</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Otevřít v prohlížeči</string>
|
||||
@@ -145,9 +189,9 @@
|
||||
<string name="bluetooth_connect_fail">Nelze se připojit k zařízení Bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">Nelze odesílat na zařízení Bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Odesílání přes Bluetooth se zdařilo.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Generace</string>
|
||||
<string name="brighten_screen">Zvýšit jas obrazovky</string>
|
||||
<string name="brighten_screen_summary">Nastavte jas na maximum pro zlepšení skenování čárového kódu ze obrazovky.</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>
|
||||
@@ -161,7 +205,7 @@
|
||||
<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="save_as_file_name">Uložit 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>
|
||||
@@ -181,10 +225,10 @@
|
||||
<string name="otpauth_add">Přidat 2FA</string>
|
||||
<string name="search_web">Vyhledat na webu</string>
|
||||
<string name="search_scan">Vyhledat sken</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Přidat do historie</string>
|
||||
<string name="added_to_history">Přidáno do historie</string>
|
||||
<string name="export_to_file">Exportovat do souboru</string>
|
||||
<string name="export_as">Exportovat jako</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>
|
||||
@@ -197,7 +241,7 @@
|
||||
<string name="pick_code_to_scan">Vyberte kód k naskenování</string>
|
||||
<string name="shortcut_decode">Skenovat čárový kód</string>
|
||||
<string name="shortcut_encode">Vytvořit čárový kód</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Historie</string>
|
||||
<string name="shortcut_preferences">Nastavení</string>
|
||||
<string name="background_request_failed">Požadavek na pozadí selhal</string>
|
||||
<string name="entry_type">Typ</string>
|
||||
@@ -212,4 +256,18 @@
|
||||
<string name="wifi_phase2">Ověření Phase 2</string>
|
||||
<string name="network_suggestions">Návrhy sítí</string>
|
||||
<string name="remove_suggestion">Odebrat návrh</string>
|
||||
<string name="email_to">Příjemce</string>
|
||||
<string name="email_subject">Předmět</string>
|
||||
<string name="email_body">Tělo zprávy</string>
|
||||
<string name="scheme">Schéma</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="query">Dotaz</string>
|
||||
<string name="automated_action_type_custom_intent">Vlastní intent</string>
|
||||
<string name="automated_action_intent_uri_template">Šablona URI intentu</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI intentu je povinné</string>
|
||||
<string name="automated_action_intent_uri_invalid">Neplatné URI intentu</string>
|
||||
<string name="automated_action_list_custom_intent">Vlastní intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Vlastní intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Velkommen!</string>
|
||||
<string name="mode_expert">Avanceret</string>
|
||||
<string name="mode_expert_description">Jeg vil kontrollere det læste indhold og åbne det manuelt.</string>
|
||||
<string name="mode_simple">Simpel</string>
|
||||
<string name="mode_simple_description">Jeg vil bare scanne stregkoder og få dem åbnet med det samme.</string>
|
||||
<string name="camera_error">Kan ikke få adgang til kamera, prøv igen</string>
|
||||
<string name="scan_code">Scan kode</string>
|
||||
<string name="compose_barcode">Opret stregkode</string>
|
||||
@@ -14,7 +19,7 @@
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% korrigering)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kvartil (~25% korrigering)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Høj (~30% korrigering)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="label">Mærke</string>
|
||||
<string name="colors">For- og baggrund</string>
|
||||
<string name="colors_black_on_white">Sort på hvidt</string>
|
||||
<string name="colors_white_on_black">Hvid på sort</string>
|
||||
@@ -33,21 +38,21 @@
|
||||
<string name="toggle_flash">Slå blitz til/fra</string>
|
||||
<string name="error_flash">Der opstod en fejl ved at slå blitz til/fra</string>
|
||||
<string name="share">Del</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">Del som fil</string>
|
||||
<string name="share_as">Del som?</string>
|
||||
<string name="copy_to_clipboard">Kopier til udklipsholder</string>
|
||||
<string name="copy_as_deeplink">Kopiér som deeplink</string>
|
||||
<string name="copied_to_clipboard">Kopieret til udklipsholder</string>
|
||||
<string name="copy_password">Kopier adgangskode til udklipsholderen</string>
|
||||
<string name="copied_password_to_clipboard">Adgangskode kopieret til udklipsholderen</string>
|
||||
<string name="open_url">Åbn URL</string>
|
||||
<string name="cannot_resolve_action">Inge applikation kan åbne det</string>
|
||||
<string name="pick_search_engine">Vælg en søgemaskine</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size_width_by_height">Størrelse i pixels: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Ingen forstørrelse</string>
|
||||
<string name="add_quiet_zone">Tilføj stille zone</string>
|
||||
<string name="input_content_here">Indtast indhold her</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">Udvid escape-sekvenser</string>
|
||||
<string name="encode">INDKOD</string>
|
||||
<string name="error_no_content">Manglende indhold</string>
|
||||
<string name="error_encoding_barcode">Stregkode kan ikke genereres</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Forsinkelse mellem kontinuerlige scanninger</string>
|
||||
<string name="restrict_format">Begræns format</string>
|
||||
<string name="remove_restriction">Fjern begrænsningen</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="find_code">Find kode</string>
|
||||
<string name="find_code_with_content">Hvad indhold?</string>
|
||||
<string name="find_code_hint">Term eller regulært udtryk</string>
|
||||
<string name="does_not_match_search_term">Stemmer ikke overens med søgeterm</string>
|
||||
<string name="scan_for">Scan %s</string>
|
||||
<string name="quarter_second">Et kvart sekund</string>
|
||||
<string name="half_second">Et halvt sekund</string>
|
||||
<string name="a_second">Et sekund</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Scan</string>
|
||||
<string name="content_category">Indhold</string>
|
||||
<string name="locale_category">Sprog</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Standard</string>
|
||||
<string name="profile_add">Tilføj ny profil</string>
|
||||
<string name="profile_enter_name">Indtast profilnavn</string>
|
||||
<string name="profile_enter_name_hint">Navn</string>
|
||||
<string name="profile_invalid_name">Ugyldigt profilnavn</string>
|
||||
<string name="profile_empty">Ingen profiler endnu</string>
|
||||
<string name="profile_current">Nuværende profil</string>
|
||||
<string name="profile_remove_confirm">Fjern denne profil?</string>
|
||||
<string name="current_profile">Profil: %s</string>
|
||||
<string name="custom_locale">Brugerdefineret sprog</string>
|
||||
<string name="follow_system_settings">Følg systemindstillingerne</string>
|
||||
<string name="show_crop_handle">Vis beskæringsbegrænser</string>
|
||||
@@ -92,14 +109,14 @@
|
||||
<string name="beep_summary">Aktiver dette, hvis du vil have din enhed til at bippe, når en kode genkendes.</string>
|
||||
<string name="beep_tone">Bip tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA bekræftelse</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_sup_confirm">Opkald tilsyn bekræft</string>
|
||||
<string name="tone_sup_radio_ack">Opkald tilsynsradio sti anerkendelse</string>
|
||||
<string name="tone_prop_ack">Positiv anerkendelse</string>
|
||||
<string name="tone_prop_beep">Generelt bip</string>
|
||||
<string name="tone_prop_beep2">Generelt dobbelt bip</string>
|
||||
<string name="use_history">Gem scanningshistorik</string>
|
||||
<string name="use_history_summary">Gem genkendte koder på din enhed.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Ignorer duplikater</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorer dubletter</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
@@ -111,8 +128,8 @@
|
||||
<string name="show_meta_data_summary">Vis yderligere data om den scannede stregkode.</string>
|
||||
<string name="show_hex_dump">Vis hex-dump</string>
|
||||
<string name="show_hex_dump_summary">Vis et hex-dump af det scannede indhold.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">Vis kontrolsum</string>
|
||||
<string name="no_checksum">Ingen kontrolsum</string>
|
||||
<string name="show_recreation">Vis genskabt stregkode</string>
|
||||
<string name="show_recreation_summary">Genskab og vis stregkode fra læst indhold, hvis det er muligt.</string>
|
||||
<string name="close_automatically">Gå tilbage efter Kopier/Del</string>
|
||||
@@ -120,6 +137,30 @@
|
||||
<string name="default_search_engine">Åbn ukendte data i</string>
|
||||
<string name="always_ask">Spørg altid</string>
|
||||
<string name="open_with_url">Åbn ukendte data med URL</string>
|
||||
|
||||
<string name="automated_actions">Automatiserede handlinger</string>
|
||||
<string name="automated_actions_none">Ingen automatiserede handlinger</string>
|
||||
<string name="automated_actions_empty">Ingen automatiserede handlinger endnu</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d automatiseret handling</item>
|
||||
<item quantity="other">%d automatiserede handlinger</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Tilføj handling</string>
|
||||
<string name="automated_action_edit">Rediger handling</string>
|
||||
<string name="automated_action_regex">Regex</string>
|
||||
<string name="automated_action_regex_hint">f.eks. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regex påkrævet</string>
|
||||
<string name="automated_action_regex_invalid">Ugyldig regex</string>
|
||||
<string name="automated_action_type">Handlingstype</string>
|
||||
<string name="automated_action_type_intent">Åbn URL</string>
|
||||
<string name="automated_action_url_template">URL-skabelon</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL-skabelon påkrævet</string>
|
||||
<string name="automated_action_invalid_url">Ugyldig URL-skabelon</string>
|
||||
<string name="automated_action_remove_confirm">Fjern denne handling?</string>
|
||||
<string name="automated_action_list_intent">Åbn URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Åbn URL</string>
|
||||
<string name="automated_action_webview_title">Automatiseret handling</string>
|
||||
<string name="clear_network_suggestions">Fjern netværksforslag</string>
|
||||
<string name="clear_network_suggestions_summary">Fjern netværksforslag, der tidligere blev tilføjet med denne app.</string>
|
||||
<string name="really_remove_all_networks">Vil du virkelig fjerne alle netværk?</string>
|
||||
@@ -136,16 +177,16 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Åbn i ekstern browser</string>
|
||||
<string name="test_url">Test URL</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">Send scanninger med Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">Vært</string>
|
||||
<string name="no_bluetooth_hosts_paired">Ingen værter parret</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="brighten_screen">Skærm lysere</string>
|
||||
<string name="brighten_screen_summary">Indstil lysstyrken til maksimum for at forbedre scanning af en stregkode fra skærmen.</string>
|
||||
<string name="really_remove_scan">Vil du virkelig fjerne scanningen?</string>
|
||||
<string name="really_remove_all_scans">Vil du virkelig fjerne alle scanninger?</string>
|
||||
<string name="really_remove_selected_scans">Vil du virkelig fjerne valgte scanninger?</string>
|
||||
@@ -179,23 +220,23 @@
|
||||
<string name="otpauth_add">Tilføj 2FA</string>
|
||||
<string name="search_web">Søg på nettet</string>
|
||||
<string name="search_scan">Søg scanning</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Tilføj til historik</string>
|
||||
<string name="added_to_history">Tilføjet til historik</string>
|
||||
<string name="export_to_file">Eksporter til fil</string>
|
||||
<string name="export_as">Eksporter som?</string>
|
||||
<string name="export_csv_comma">CSV-fil med kommaer</string>
|
||||
<string name="export_csv_semicolon">CSV-fil med semikoloner</string>
|
||||
<string name="export_json">JSON fil</string>
|
||||
<string name="export_database">SQLite database</string>
|
||||
<string name="export_database">SQLite-database</string>
|
||||
<string name="saved_in_downloads">Gemt i downloads</string>
|
||||
<string name="rotate_image_cw">Roter billedet med uret</string>
|
||||
<string name="toggle_free_rotation">Slå fri rotation til/fra</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_file">Vælg en fil</string>
|
||||
<string name="pick_image_file">Vælg billedfil</string>
|
||||
<string name="pick_code_to_scan">Vælg kode til at scanne</string>
|
||||
<string name="shortcut_decode">Scan en stregkode</string>
|
||||
<string name="shortcut_encode">Opret en stregkode</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Historik</string>
|
||||
<string name="shortcut_preferences">Indstillinger</string>
|
||||
<string name="background_request_failed">Baggrundsanmodning mislykkedes</string>
|
||||
<string name="entry_type">Type</string>
|
||||
@@ -210,4 +251,18 @@
|
||||
<string name="wifi_phase2">Fase 2 metode</string>
|
||||
<string name="network_suggestions">Netværksforslag</string>
|
||||
<string name="remove_suggestion">Fjern forslag</string>
|
||||
<string name="email_to">Modtager</string>
|
||||
<string name="email_subject">Emne</string>
|
||||
<string name="email_body">Brødtekst</string>
|
||||
<string name="scheme">Ordning</string>
|
||||
<string name="host">Vært</string>
|
||||
<string name="query">Forespørgsel</string>
|
||||
<string name="automated_action_type_custom_intent">Brugerdefineret intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent-URI-skabelon</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent-URI påkrævet</string>
|
||||
<string name="automated_action_intent_uri_invalid">Ugyldig Intent-URI</string>
|
||||
<string name="automated_action_list_custom_intent">Brugerdefineret intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Brugerdefineret intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Willkommen!</string>
|
||||
<string name="mode_expert">Erweitert</string>
|
||||
<string name="mode_expert_description">Ich möchte den gelesenen Inhalt überprüfen und manuell öffnen.</string>
|
||||
<string name="mode_simple">Einfach</string>
|
||||
<string name="mode_simple_description">Ich möchte nur Barcodes scannen und sie sofort öffnen.</string>
|
||||
<string name="camera_error">Auf die Kamera kann nicht zugegriffen werden, bitte versuche es nochmal</string>
|
||||
<string name="scan_code">Code scannen</string>
|
||||
<string name="compose_barcode">Barcode erstellen</string>
|
||||
@@ -20,9 +25,9 @@
|
||||
<string name="colors_white_on_black">Weiß auf Schwarz</string>
|
||||
<string name="colors_black_on_transparent">Schwarz auf Transparent</string>
|
||||
<string name="colors_white_on_transparent">Weiß auf Transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="sequence_size">Sequenzgröße</string>
|
||||
<string name="sequence_index">Sequenzindex</string>
|
||||
<string name="sequence_id">Sequenz-ID</string>
|
||||
<string name="gtin_issue_number">Ausgabe Nummer</string>
|
||||
<string name="gtin_country">Mögliches Ursprungsland</string>
|
||||
<string name="gtin_price">Preisvorschlag</string>
|
||||
@@ -36,9 +41,9 @@
|
||||
<string name="share_file">Als Datei teilen</string>
|
||||
<string name="share_as">Teilen als?</string>
|
||||
<string name="copy_to_clipboard">In die Zwischenablage kopieren</string>
|
||||
<string name="copy_as_deeplink">Als Deeplink 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>
|
||||
<string name="pick_search_engine">Suchmaschine auswählen</string>
|
||||
@@ -61,8 +66,9 @@
|
||||
<string name="remove_restriction">Einschränkung entfernen</string>
|
||||
<string name="find_code">Barcode finden</string>
|
||||
<string name="find_code_with_content">Mit welchem Inhalt?</string>
|
||||
<string name="find_code_hint">Begriff eingeben</string>
|
||||
<string name="scan_format">%s scannen</string>
|
||||
<string name="find_code_hint">Begriff oder regulärer Ausdruck</string>
|
||||
<string name="does_not_match_search_term">Entspricht nicht dem Suchbegriff</string>
|
||||
<string name="scan_for">%s scannen</string>
|
||||
<string name="quarter_second">Eine Viertelsekunde</string>
|
||||
<string name="half_second">Eine halbe Sekunde</string>
|
||||
<string name="a_second">Eine Sekunde</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Scannen</string>
|
||||
<string name="content_category">Inhalt</string>
|
||||
<string name="locale_category">Sprache</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Standard</string>
|
||||
<string name="profile_add">Neues Profil hinzufügen</string>
|
||||
<string name="profile_enter_name">Profilnamen eingeben</string>
|
||||
<string name="profile_enter_name_hint">Name</string>
|
||||
<string name="profile_invalid_name">Ungültiger Profilname</string>
|
||||
<string name="profile_empty">Noch keine Profile</string>
|
||||
<string name="profile_current">Aktuelles Profil</string>
|
||||
<string name="profile_remove_confirm">Dieses Profil entfernen?</string>
|
||||
<string name="current_profile">Profil: %s</string>
|
||||
<string name="custom_locale">Spracheinstellung</string>
|
||||
<string name="follow_system_settings">Systemeinstellung übernehmen</string>
|
||||
<string name="show_crop_handle">Ausschnitt verkleinern anzeigen</string>
|
||||
@@ -91,12 +108,12 @@
|
||||
<string name="beep">Signalton bei Erkennung</string>
|
||||
<string name="beep_summary">Bei Erkennung eines Codes soll ein Signalton abgespielt werden.</string>
|
||||
<string name="beep_tone">Signalton</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="tone_cdma_confirm">CDMA bestätigen</string>
|
||||
<string name="tone_sup_confirm">Anrufaufsicht bestätigen</string>
|
||||
<string name="tone_sup_radio_ack">Anrufüberwachungsfunkpfadbestätigung</string>
|
||||
<string name="tone_prop_ack">Positive Bestätigung</string>
|
||||
<string name="tone_prop_beep">Allgemeines Piepen</string>
|
||||
<string name="tone_prop_beep2">Allgemeiner Doppelton</string>
|
||||
<string name="use_history">Codes speichern</string>
|
||||
<string name="use_history_summary">Eingelesene Barcodes auf dem Gerät speichern.</string>
|
||||
<string name="ignore_duplicates">Ignoriere Duplikate</string>
|
||||
@@ -120,6 +137,30 @@
|
||||
<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="automated_actions">Automatisierte Aktionen</string>
|
||||
<string name="automated_actions_none">Keine automatisierten Aktionen</string>
|
||||
<string name="automated_actions_empty">Noch keine automatisierten Aktionen</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d automatisierte Aktion</item>
|
||||
<item quantity="other">%d automatisierte Aktionen</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Aktion hinzufügen</string>
|
||||
<string name="automated_action_edit">Aktion bearbeiten</string>
|
||||
<string name="automated_action_regex">Regex</string>
|
||||
<string name="automated_action_regex_hint">z.B. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regex erforderlich</string>
|
||||
<string name="automated_action_regex_invalid">Ungültiger Regex</string>
|
||||
<string name="automated_action_type">Aktionstyp</string>
|
||||
<string name="automated_action_type_intent">URL öffnen</string>
|
||||
<string name="automated_action_url_template">URL-Vorlage</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL-Vorlage erforderlich</string>
|
||||
<string name="automated_action_invalid_url">Ungültige URL-Vorlage</string>
|
||||
<string name="automated_action_remove_confirm">Diese Aktion entfernen?</string>
|
||||
<string name="automated_action_list_intent">URL öffnen: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL öffnen</string>
|
||||
<string name="automated_action_webview_title">Automatisierte Aktion</string>
|
||||
<string name="clear_network_suggestions">WiFi Netzwerkvorschläge entfernen</string>
|
||||
<string name="clear_network_suggestions_summary">Betrifft nur Netzwerke, die zuvor mit dieser App bereitgestellt wurden.</string>
|
||||
<string name="really_remove_all_networks">Alle Netzwerkvorschläge entfernen?</string>
|
||||
@@ -210,4 +251,18 @@
|
||||
<string name="wifi_phase2">Phase 2 Methode</string>
|
||||
<string name="network_suggestions">WiFi Netzwerkvorschläge</string>
|
||||
<string name="remove_suggestion">Vorschlag entfernen</string>
|
||||
<string name="email_to">Empfänger</string>
|
||||
<string name="email_subject">Betreff</string>
|
||||
<string name="email_body">Nachricht</string>
|
||||
<string name="scheme">Schema</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="query">Query</string>
|
||||
<string name="automated_action_type_custom_intent">Benutzerdefinierter Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent-URI-Vorlage</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent-URI erforderlich</string>
|
||||
<string name="automated_action_intent_uri_invalid">Ungültige Intent-URI</string>
|
||||
<string name="automated_action_list_custom_intent">Benutzerdefinierter Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Benutzerdefinierter Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">¡Bienvenido!</string>
|
||||
<string name="mode_expert">Avanzado</string>
|
||||
<string name="mode_expert_description">Quiero verificar el contenido leído y abrirlo manualmente.</string>
|
||||
<string name="mode_simple">Sencillo</string>
|
||||
<string name="mode_simple_description">Solo quiero escanear códigos de barras y abrirlos de inmediato.</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</string>
|
||||
<string name="compose_barcode">Componer código</string>
|
||||
@@ -14,7 +19,7 @@
|
||||
<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="label">Label</string>
|
||||
<string name="label">Etiqueta</string>
|
||||
<string name="colors">Color frontal y fondo</string>
|
||||
<string name="colors_black_on_white">Negro sobre blanco</string>
|
||||
<string name="colors_white_on_black">Blanco sobre negro</string>
|
||||
@@ -27,25 +32,25 @@
|
||||
<string name="gtin_country">Posible país de fabricación</string>
|
||||
<string name="gtin_price">Precio sugerido</string>
|
||||
<string name="gtin_add_on">Extensión UPC EAN</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="barcode_version_number">Versión</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modulos)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Máscara de datos</string>
|
||||
<string name="toggle_flash">Activar el flash</string>
|
||||
<string name="error_flash">Error activando flash</string>
|
||||
<string name="share">Compartir</string>
|
||||
<string name="share_file">Compartir como archivo</string>
|
||||
<string name="share_as">¿Compartir como?</string>
|
||||
<string name="copy_to_clipboard">Copiar al portapapeles</string>
|
||||
<string name="copy_as_deeplink">Copiar como deeplink</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 eso</string>
|
||||
<string name="pick_search_engine">Seleccionar motor de búsqueda</string>
|
||||
<string name="format">Formato</string>
|
||||
<string name="size_width_by_height">Tamaño en píxeles: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Sin aumento</string>
|
||||
<string name="add_quiet_zone">Agregar zona tranquila</string>
|
||||
<string name="input_content_here">Introduzca el contenido aquí</string>
|
||||
<string name="unescape">Expandir secuencia de escape</string>
|
||||
<string name="encode">CODIFICAR</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Demora entre escaneos continuos</string>
|
||||
<string name="restrict_format">Restringir formato</string>
|
||||
<string name="remove_restriction">Eliminar restricción</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Escanear %s</string>
|
||||
<string name="find_code">Encontrar código</string>
|
||||
<string name="find_code_with_content">¿Qué contenido?</string>
|
||||
<string name="find_code_hint">Término o expresión regular</string>
|
||||
<string name="does_not_match_search_term">No coincide con el término de búsqueda</string>
|
||||
<string name="scan_for">Escanear %s</string>
|
||||
<string name="quarter_second">Un cuarto de segundo</string>
|
||||
<string name="half_second">Medio segundo</string>
|
||||
<string name="a_second">Un segundo</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Escanear</string>
|
||||
<string name="content_category">Contenido</string>
|
||||
<string name="locale_category">Idioma</string>
|
||||
<string name="profile_category">Perfil</string>
|
||||
<string name="profile">Perfil</string>
|
||||
<string name="profile_default">Predeterminado</string>
|
||||
<string name="profile_add">Añadir nuevo perfil</string>
|
||||
<string name="profile_enter_name">Introduce el nombre del perfil</string>
|
||||
<string name="profile_enter_name_hint">Nombre</string>
|
||||
<string name="profile_invalid_name">Nombre de perfil no válido</string>
|
||||
<string name="profile_empty">Aún no hay perfiles</string>
|
||||
<string name="profile_current">Perfil actual</string>
|
||||
<string name="profile_remove_confirm">¿Eliminar este perfil?</string>
|
||||
<string name="current_profile">Perfil: %s</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 delimitador de recorte</string>
|
||||
@@ -99,10 +116,10 @@
|
||||
<string name="tone_prop_beep2">Sonido doble general</string>
|
||||
<string name="use_history">Guardar historial de escaneo</string>
|
||||
<string name="use_history_summary">Guarda los códigos reconocidos en su dispositivo.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Ignorar duplicados</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignorar duplicados</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Aceptar duplicados</string>
|
||||
<string name="open_immediately">Abrir inmediatamente</string>
|
||||
<string name="open_immediately_summary">Omite la inspección y abre el contenido inmediatamente. Podría abrir contenido dañino si está activado.</string>
|
||||
<string name="copy_immediately">Copiar en el portapapeles</string>
|
||||
@@ -111,8 +128,8 @@
|
||||
<string name="show_meta_data_summary">Muestra datos adicionales del código escaneado.</string>
|
||||
<string name="show_hex_dump">Mostrar volcado hexadecimal</string>
|
||||
<string name="show_hex_dump_summary">Muestra un volcado hexadecimal del contenido escaneado.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">Mostrar suma de comprobación</string>
|
||||
<string name="no_checksum">Sin suma de comprobación</string>
|
||||
<string name="show_recreation">Mostrar reconstrucción del código</string>
|
||||
<string name="show_recreation_summary">Reconstruye y muestra el código de barras desde el contenido leído si es posible.</string>
|
||||
<string name="close_automatically">Retroceder tras Copiar/Compartir</string>
|
||||
@@ -120,6 +137,30 @@
|
||||
<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 en la URL</string>
|
||||
|
||||
<string name="automated_actions">Acciones automatizadas</string>
|
||||
<string name="automated_actions_none">No hay acciones automatizadas</string>
|
||||
<string name="automated_actions_empty">Aún no hay acciones automatizadas</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d acción automatizada</item>
|
||||
<item quantity="other">%d acciones automatizadas</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Añadir acción</string>
|
||||
<string name="automated_action_edit">Editar acción</string>
|
||||
<string name="automated_action_regex">Expresión regular</string>
|
||||
<string name="automated_action_regex_hint">p. ej. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Se requiere expresión regular</string>
|
||||
<string name="automated_action_regex_invalid">Expresión regular inválida</string>
|
||||
<string name="automated_action_type">Tipo de acción</string>
|
||||
<string name="automated_action_type_intent">Abrir URL</string>
|
||||
<string name="automated_action_url_template">Plantilla de URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Se requiere plantilla de URL</string>
|
||||
<string name="automated_action_invalid_url">Plantilla de URL inválida</string>
|
||||
<string name="automated_action_remove_confirm">¿Eliminar esta acción?</string>
|
||||
<string name="automated_action_list_intent">Abrir URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Abrir URL</string>
|
||||
<string name="automated_action_webview_title">Acción automatizada</string>
|
||||
<string name="clear_network_suggestions">Eliminar sugerencias de red</string>
|
||||
<string name="clear_network_suggestions_summary">Elimina todas las sugerencias de red proporcionadas por esta aplicación.</string>
|
||||
<string name="really_remove_all_networks">¿Realmente eliminar todas las redes?</string>
|
||||
@@ -138,14 +179,14 @@
|
||||
<string name="test_url">URL de prueba</string>
|
||||
<string name="send_scan_bluetooth">Enviar escaneos con Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Habilita el envío de escaneos a un host Bluetooth.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="send_scan_bluetooth_host">Anfitrión</string>
|
||||
<string name="no_bluetooth_hosts_paired">Ningún host emparejado</string>
|
||||
<string name="bluetooth_connect_fail">No se pudo conectar a un dispositivo bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">No se pudo enviar a un dispositivo bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Envío bluetooth completado.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Generación</string>
|
||||
<string name="brighten_screen">Aumentar el brillo de la pantalla</string>
|
||||
<string name="brighten_screen_summary">Suba el brillo al máximo para mejorar la lectura del código de barras desde la pantalla.</string>
|
||||
<string name="really_remove_scan">¿Eliminar el escaneo seleccionado?</string>
|
||||
<string name="really_remove_all_scans">¿Eliminar todos los escaneos?</string>
|
||||
<string name="really_remove_selected_scans">¿Eliminar los escaneos seleccionados?</string>
|
||||
@@ -179,8 +220,8 @@
|
||||
<string name="otpauth_add">Añadir 2FA</string>
|
||||
<string name="search_web">Buscar en la web</string>
|
||||
<string name="search_scan">Buscar escaneo</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Añadir al historial</string>
|
||||
<string name="added_to_history">Añadido al historial</string>
|
||||
<string name="export_to_file">Exportar a archivo</string>
|
||||
<string name="export_as">¿Exportar como?</string>
|
||||
<string name="export_csv_comma">Archivo CSV con comas</string>
|
||||
@@ -195,7 +236,7 @@
|
||||
<string name="pick_code_to_scan">Seleccione el código a escanear</string>
|
||||
<string name="shortcut_decode">Escanear un código</string>
|
||||
<string name="shortcut_encode">Crear un código</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Historial</string>
|
||||
<string name="shortcut_preferences">Ajustes</string>
|
||||
<string name="background_request_failed">Solicitud de fondo fallida</string>
|
||||
<string name="entry_type">Tipo</string>
|
||||
@@ -210,4 +251,18 @@
|
||||
<string name="wifi_phase2">Método Phase 2</string>
|
||||
<string name="network_suggestions">Sugerencias de red</string>
|
||||
<string name="remove_suggestion">Eliminar sugerencia</string>
|
||||
<string name="email_to">Destinatario</string>
|
||||
<string name="email_subject">Asunto</string>
|
||||
<string name="email_body">Cuerpo</string>
|
||||
<string name="scheme">Esquema</string>
|
||||
<string name="host">Anfitrión</string>
|
||||
<string name="query">Consulta</string>
|
||||
<string name="automated_action_type_custom_intent">Intent personalizado</string>
|
||||
<string name="automated_action_intent_uri_template">Plantilla de URI de Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI de Intent requerida</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI de Intent no válida</string>
|
||||
<string name="automated_action_list_custom_intent">Intent personalizado: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent personalizado</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">خوش آمدید!</string>
|
||||
<string name="mode_expert">پیشرفته</string>
|
||||
<string name="mode_expert_description">میخواهم محتوای خوانده شده را بررسی کرده و به صورت دستی باز کنم.</string>
|
||||
<string name="mode_simple">ساده</string>
|
||||
<string name="mode_simple_description">فقط میخواهم بارکدها را اسکن کنم و فوراً باز شوند.</string>
|
||||
<string name="camera_error">نمیتوان به دوربین دسترسی داشت، لطفاً دوباره تلاش کنید</string>
|
||||
<string name="scan_code">پویش کد</string>
|
||||
<string name="compose_barcode">ایجاد بارکد</string>
|
||||
@@ -14,40 +19,40 @@
|
||||
<string name="error_correction_level_m" formatted="false">متوسط (~۱۵٪ تصحیح)</string>
|
||||
<string name="error_correction_level_q" formatted="false">یکچهارم (~۲۵٪ تصحیح)</string>
|
||||
<string name="error_correction_level_h" formatted="false">زیاد (~۳۰٪ تصحیح)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="label">برچسب</string>
|
||||
<string name="colors">پس زمینه و پیش زمینه</string>
|
||||
<string name="colors_black_on_white">سیاه روی سفید</string>
|
||||
<string name="colors_white_on_black">سفید روی سیاه</string>
|
||||
<string name="colors_black_on_transparent">سیاه روی شفاف</string>
|
||||
<string name="colors_white_on_transparent">سفید روی شفاف</string>
|
||||
<string name="sequence_size">اندازه دنباله</string>
|
||||
<string name="sequence_index">اندیکس دنباله</string>
|
||||
<string name="sequence_id">شناسه دنباله</string>
|
||||
<string name="gtin_issue_number">شمارهٔ اشکال</string>
|
||||
<string name="gtin_country">کشور احتمالی سازنده</string>
|
||||
<string name="gtin_price">قیمت پیشنهادی</string>
|
||||
<string name="gtin_add_on">UPC EAN extension</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="gtin_add_on">تمدید UPC EAN</string>
|
||||
<string name="barcode_version_number">نسخه</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">ماسک داده</string>
|
||||
<string name="toggle_flash">روشن/خاموش کردن چراغ</string>
|
||||
<string name="error_flash">خطا هنگام روشن/خاموش کردن چراغ</string>
|
||||
<string name="share">همرسانی</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">اشتراک گذاری به عنوان فایل</string>
|
||||
<string name="share_as">همرسانی به عنوان؟</string>
|
||||
<string name="copy_to_clipboard">رونوشت به تخهگیره</string>
|
||||
<string name="copy_as_deeplink">کپی به صورت پیوند عمیق</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_width_by_height">اندازه به پیکسل: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">بدون بزرگنمایی</string>
|
||||
<string name="add_quiet_zone">اضافه کردن حوزه ساکت</string>
|
||||
<string name="input_content_here">محتویات ورودی را اینجا بنویسید</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">توسیع دنبالههای فراری</string>
|
||||
<string name="encode">رمزگذاری</string>
|
||||
<string name="error_no_content">محتویاتی نیست</string>
|
||||
<string name="error_encoding_barcode">بارکد نمیتواند ایجاد شود</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">تأخیر بین پویشهای مداوم</string>
|
||||
<string name="restrict_format">محدود کردن قالب</string>
|
||||
<string name="remove_restriction">برداشتن محدودیت</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">پویش %s</string>
|
||||
<string name="find_code">کد را پیدا کنید</string>
|
||||
<string name="find_code_with_content">چه محتوا؟</string>
|
||||
<string name="find_code_hint">عبارت یا عبارت منظم</string>
|
||||
<string name="does_not_match_search_term">با عبارت جستجو مطابقت ندارد</string>
|
||||
<string name="scan_for">پویش %s</string>
|
||||
<string name="quarter_second">یکچهارم ثانیه</string>
|
||||
<string name="half_second">نیم ثانیه</string>
|
||||
<string name="a_second">یک ثانیه</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">پویش</string>
|
||||
<string name="content_category">محتویات</string>
|
||||
<string name="locale_category">زبان</string>
|
||||
<string name="profile_category">نمایه</string>
|
||||
<string name="profile">نمایه</string>
|
||||
<string name="profile_default">پیشفرض</string>
|
||||
<string name="profile_add">افزودن نمایهٔ جدید</string>
|
||||
<string name="profile_enter_name">نام نمایه را وارد کنید</string>
|
||||
<string name="profile_enter_name_hint">نام</string>
|
||||
<string name="profile_invalid_name">نام نمایه نامعتبر است</string>
|
||||
<string name="profile_empty">هنوز هیچ نمایهای نیست</string>
|
||||
<string name="profile_current">نمایهٔ فعلی</string>
|
||||
<string name="profile_remove_confirm">این نمایه حذف شود؟</string>
|
||||
<string name="current_profile">نمایه: %s</string>
|
||||
<string name="custom_locale">زبان سفارشی</string>
|
||||
<string name="follow_system_settings">پیروی از زبان سامانه</string>
|
||||
<string name="show_crop_handle">نمایش محدود کننده برش</string>
|
||||
@@ -88,21 +105,21 @@
|
||||
<string name="show_toast_in_bulk_mode_summary">هنگام پویش مداوم، دادههای پویش شده را به طور خلاصه نشان میدهید.</string>
|
||||
<string name="vibrate">لرزش هنگام تشخیص</string>
|
||||
<string name="vibrate_summary">اگر میخواهید دستگاهتان هنگام شناسایی کد بلرزد، این را فعال کنید.</string>
|
||||
<string name="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="beep">صدای بیپ در شناسایی</string>
|
||||
<string name="beep_summary">اگر میخواهید دستگاه شما هنگام شناسایی یک کد صدا کند، این را فعال کنید.</string>
|
||||
<string name="beep_tone">صدای بیپ</string>
|
||||
<string name="tone_cdma_confirm">تأیید CDMA</string>
|
||||
<string name="tone_sup_confirm">تماس نظارتی تأیید کنید</string>
|
||||
<string name="tone_sup_radio_ack">تائید مسیر رادیویی نظارت تماس</string>
|
||||
<string name="tone_prop_ack">تایید مثبت</string>
|
||||
<string name="tone_prop_beep">صدای عمومی</string>
|
||||
<string name="tone_prop_beep2">صدای دو بیپ عمومی</string>
|
||||
<string name="use_history">ذخیرهٔ تاریخچهٔ پویش</string>
|
||||
<string name="use_history_summary">کدهای شناسایی شده را در همین دستگاه ذخیره میکند.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">نادیده گرفتن تکراری ها</string>
|
||||
<string name="ignore_consecutive_duplicates">نادیده گرفتن موارد تکراری</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">تکراریها را پذیرا باش</string>
|
||||
<string name="open_immediately">گشودن بلافاصله</string>
|
||||
<string name="open_immediately_summary">بازرسی را رها کنید و محتویات را فورا باز کنید. در صورت فعال بودن ممکن است محتوای مضر را باز کند.</string>
|
||||
<string name="copy_immediately">قرار دادن در تختهگیره</string>
|
||||
@@ -111,15 +128,39 @@
|
||||
<string name="show_meta_data_summary">نمایش دادههای اضافی در مورد بارکد پویش شده.</string>
|
||||
<string name="show_hex_dump">نمایش کد هگز استخراج شده</string>
|
||||
<string name="show_hex_dump_summary">نمایش کد هگز استخراج شده از محتویات پویش شده.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="show_checksum">نمایش مجموعه کنترلی</string>
|
||||
<string name="no_checksum">بدون چکسام</string>
|
||||
<string name="show_recreation">نمایش بارکد بازسازی شده</string>
|
||||
<string name="show_recreation_summary">دوباره ایجاد کرده و بارکد را از محتوای خوانده شده نشان دهید اگر امکان دارد.</string>
|
||||
<string name="close_automatically">بازگشت پس از رونوشت یا همرسانی</string>
|
||||
<string name="close_automatically_summary">پس از رونوشت یا همرسانی مطالب خوانده شده، به طور خودکار به صفحهٔ پویش بازگردید.</string>
|
||||
<string name="default_search_engine">گشودن دادهٔ نامشخص در</string>
|
||||
<string name="always_ask">همیشه بپرس</string>
|
||||
<string name="open_with_url">دادههای ناشناخته را با URL باز کنید</string>
|
||||
|
||||
<string name="automated_actions">اقدامهای خودکار</string>
|
||||
<string name="automated_actions_none">هیچ اقدام خودکاری وجود ندارد</string>
|
||||
<string name="automated_actions_empty">هنوز اقدام خودکاری وجود ندارد</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d اقدام خودکار</item>
|
||||
<item quantity="other">%d اقدام خودکار</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">افزودن اقدام</string>
|
||||
<string name="automated_action_edit">ویرایش اقدام</string>
|
||||
<string name="automated_action_regex">عبارت منظم</string>
|
||||
<string name="automated_action_regex_hint">مثلاً ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">عبارت منظم لازم است</string>
|
||||
<string name="automated_action_regex_invalid">عبارت منظم نامعتبر است</string>
|
||||
<string name="automated_action_type">نوع اقدام</string>
|
||||
<string name="automated_action_type_intent">باز کردن URL</string>
|
||||
<string name="automated_action_url_template">قالب URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">قالب URL لازم است</string>
|
||||
<string name="automated_action_invalid_url">قالب URL نامعتبر است</string>
|
||||
<string name="automated_action_remove_confirm">این اقدام حذف شود؟</string>
|
||||
<string name="automated_action_list_intent">باز کردن URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">باز کردن URL</string>
|
||||
<string name="automated_action_webview_title">اقدام خودکار</string>
|
||||
<string name="clear_network_suggestions">پاک کردن پیشنهادات شبکه</string>
|
||||
<string name="clear_network_suggestions_summary">همه پیشنهادات شبکه را که قبلاً توسط این برنامه ارائه شده است حذف کنید.</string>
|
||||
<string name="really_remove_all_networks">واقعاً همه شبکهها را حذف میکنید؟</string>
|
||||
@@ -132,20 +173,20 @@
|
||||
<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_form">POST application/x-www-form-urlencoded ارسال</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">گشودن در مرورگر خارجی</string>
|
||||
<string name="test_url">آزمودن نشانی</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">انتقال اسکن ها با بلوتوث</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">میزبان</string>
|
||||
<string name="no_bluetooth_hosts_paired">میزبان های جفت نشده</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">نسل</string>
|
||||
<string name="brighten_screen">روشن کردن صفحه نمایش</string>
|
||||
<string name="brighten_screen_summary">تنظیم روشنایی به حداکثر برای افزایش اسکن کردن بارکد از صفحه نمایش.</string>
|
||||
<string name="really_remove_scan">برای برداشتن پویش مطمئنید؟</string>
|
||||
<string name="really_remove_all_scans">برای برداشتن همهٔ پویشها مطمئنید؟</string>
|
||||
<string name="really_remove_selected_scans">برای برداشتن پویشهای برگزیده شده مطمئنید؟</string>
|
||||
@@ -179,8 +220,8 @@
|
||||
<string name="otpauth_add">افزودن احراز هویت چندعاملی(2FA)</string>
|
||||
<string name="search_web">جستوجوی وب</string>
|
||||
<string name="search_scan">جستوجوی پویش</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">اضافه به تاریخچه</string>
|
||||
<string name="added_to_history">اضافه شد به تاریخچه</string>
|
||||
<string name="export_to_file">برونریزی به پرونده</string>
|
||||
<string name="export_as">برونریزی به عنوان؟</string>
|
||||
<string name="export_csv_comma">پروندهٔ سیاسوی با ویرگول</string>
|
||||
@@ -189,13 +230,13 @@
|
||||
<string name="export_database">پایگاهدادهٔ اسکیولایت</string>
|
||||
<string name="saved_in_downloads">در بارگیریها ذخیره شد</string>
|
||||
<string name="rotate_image_cw">تصویر را در جهت ساعتگرد بچرخانید</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">تغییر چرخش آزاد</string>
|
||||
<string name="pick_file">یک فایل را انتخاب کنید</string>
|
||||
<string name="pick_image_file">پروندهٔ تصویری را برگزینید</string>
|
||||
<string name="pick_code_to_scan">کدی را برای پویش برگزینید</string>
|
||||
<string name="shortcut_decode">پویش یک بارکد</string>
|
||||
<string name="shortcut_encode">ایجاد یک بارکد</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">تاریخچه</string>
|
||||
<string name="shortcut_preferences">تنظیمات</string>
|
||||
<string name="background_request_failed">درخواست پسزمینه انجام نشد</string>
|
||||
<string name="entry_type">گونه</string>
|
||||
@@ -208,6 +249,20 @@
|
||||
<string name="wifi_anonymous_identity">هویت ناشناس</string>
|
||||
<string name="wifi_identity">هویت</string>
|
||||
<string name="wifi_phase2">روش دو مرحلهای</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">پیشنهادهای شبکه</string>
|
||||
<string name="remove_suggestion">حذف پیشنهاد</string>
|
||||
<string name="email_to">گیرنده</string>
|
||||
<string name="email_subject">موضوع</string>
|
||||
<string name="email_body">متن</string>
|
||||
<string name="scheme">برنامه</string>
|
||||
<string name="host">میزبان</string>
|
||||
<string name="query">پرس و جو</string>
|
||||
<string name="automated_action_type_custom_intent">Intent سفارشی</string>
|
||||
<string name="automated_action_intent_uri_template">الگوی URI Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI Intent لازم است</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI Intent نامعتبر</string>
|
||||
<string name="automated_action_list_custom_intent">Intent سفارشی: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent سفارشی</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Bienvenue !</string>
|
||||
<string name="mode_expert">Avancé</string>
|
||||
<string name="mode_expert_description">Je souhaite vérifier le contenu lu et l\'ouvrir manuellement.</string>
|
||||
<string name="mode_simple">Simple</string>
|
||||
<string name="mode_simple_description">Je veux simplement scanner les codes-barres et les ouvrir immédiatement.</string>
|
||||
<string name="camera_error">Impossible d\'accéder à la caméra, veuillez réessayer</string>
|
||||
<string name="scan_code">Scanner un code</string>
|
||||
<string name="compose_barcode">Créer un code-barres</string>
|
||||
@@ -14,7 +19,7 @@
|
||||
<string name="error_correction_level_m" formatted="false">Moyen (~15% de correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% de correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Élevé (~30% de correction)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="label">Étiquette</string>
|
||||
<string name="colors">Premier plan et arrière-plan</string>
|
||||
<string name="colors_black_on_white">Noir sur blanc</string>
|
||||
<string name="colors_white_on_black">Blanc sur noir</string>
|
||||
@@ -29,23 +34,23 @@
|
||||
<string name="gtin_add_on">Extension UPC EAN</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Masquage</string>
|
||||
<string name="toggle_flash">Activer/Désactiver le flash</string>
|
||||
<string name="error_flash">Erreur de changement d\'état du flash</string>
|
||||
<string name="share">Partager</string>
|
||||
<string name="share_file">Partager en tant que fichier</string>
|
||||
<string name="share_as">Partager en tant que ?</string>
|
||||
<string name="copy_to_clipboard">Copier dans le presse-papiers</string>
|
||||
<string name="copy_as_deeplink">Copier sous forme de lien profond</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 cela</string>
|
||||
<string name="pick_search_engine">Choisir un moteur de recherche</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size_width_by_height">Taille en pixels : %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Pas de grossissement</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="add_quiet_zone">Ajouter une zone blanche</string>
|
||||
<string name="input_content_here">Insérer le contenu ici</string>
|
||||
<string name="unescape">Étendre les caractères d\'échappement</string>
|
||||
<string name="encode">ENCODER</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Délai entre les scans continus</string>
|
||||
<string name="restrict_format">Restreindre le format</string>
|
||||
<string name="remove_restriction">Supprimer la restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="find_code">Trouver un code</string>
|
||||
<string name="find_code_with_content">Quel contenu ?</string>
|
||||
<string name="find_code_hint">Terme ou expression régulière</string>
|
||||
<string name="does_not_match_search_term">Ne correspond pas au terme de recherche</string>
|
||||
<string name="scan_for">Numériser %s</string>
|
||||
<string name="quarter_second">Un quart de seconde</string>
|
||||
<string name="half_second">Une demi-seconde</string>
|
||||
<string name="a_second">Une seconde</string>
|
||||
@@ -70,9 +76,20 @@
|
||||
<string name="five_seconds">Cinq secondes</string>
|
||||
<string name="history">Historique</string>
|
||||
<string name="preferences">Préférences</string>
|
||||
<string name="scan_category">Scan</string>
|
||||
<string name="scan_category">Numériser</string>
|
||||
<string name="content_category">Contenu</string>
|
||||
<string name="locale_category">Langue</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Par défaut</string>
|
||||
<string name="profile_add">Ajouter un nouveau profil</string>
|
||||
<string name="profile_enter_name">Entrez le nom du profil</string>
|
||||
<string name="profile_enter_name_hint">Nom</string>
|
||||
<string name="profile_invalid_name">Nom de profil invalide</string>
|
||||
<string name="profile_empty">Aucun profil pour le moment</string>
|
||||
<string name="profile_current">Profil actuel</string>
|
||||
<string name="profile_remove_confirm">Supprimer ce profil ?</string>
|
||||
<string name="current_profile">Profil : %s</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 contrôle du cadrage</string>
|
||||
@@ -91,12 +108,12 @@
|
||||
<string name="beep">Biper à la détection</string>
|
||||
<string name="beep_summary">Émettre un son lorsqu\'un code est détecté.</string>
|
||||
<string name="beep_tone">Tonalité du signal sonore</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="tone_cdma_confirm">Confirmation CDMA</string>
|
||||
<string name="tone_sup_confirm">Confirmation de la supervision de l\'appel</string>
|
||||
<string name="tone_sup_radio_ack">Accusé de réception du chemin radio de supervision d\'appel</string>
|
||||
<string name="tone_prop_ack">Accusé de réception positif</string>
|
||||
<string name="tone_prop_beep">Bip simple</string>
|
||||
<string name="tone_prop_beep2">Bip double</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_duplicates">Ignorer les doublons</string>
|
||||
@@ -120,6 +137,30 @@
|
||||
<string name="default_search_engine">Ouvrir les données inconnues dans</string>
|
||||
<string name="always_ask">Toujours demander</string>
|
||||
<string name="open_with_url">Ouvrir les données inconnues avec l\'URL</string>
|
||||
|
||||
<string name="automated_actions">Actions automatiques</string>
|
||||
<string name="automated_actions_none">Aucune action automatique</string>
|
||||
<string name="automated_actions_empty">Pas encore d’actions automatiques</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d action automatique</item>
|
||||
<item quantity="other">%d actions automatiques</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Ajouter une action</string>
|
||||
<string name="automated_action_edit">Modifier l’action</string>
|
||||
<string name="automated_action_regex">Expression régulière</string>
|
||||
<string name="automated_action_regex_hint">ex. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Expression régulière requise</string>
|
||||
<string name="automated_action_regex_invalid">Expression régulière invalide</string>
|
||||
<string name="automated_action_type">Type d’action</string>
|
||||
<string name="automated_action_type_intent">Ouvrir l’URL</string>
|
||||
<string name="automated_action_url_template">Modèle d’URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Modèle d’URL requis</string>
|
||||
<string name="automated_action_invalid_url">Modèle d’URL invalide</string>
|
||||
<string name="automated_action_remove_confirm">Supprimer cette action ?</string>
|
||||
<string name="automated_action_list_intent">Ouvrir l’URL : %s</string>
|
||||
<string name="automated_action_list_intent_empty">Ouvrir l’URL</string>
|
||||
<string name="automated_action_webview_title">Action automatique</string>
|
||||
<string name="clear_network_suggestions">Supprimer les suggestions de réseau</string>
|
||||
<string name="clear_network_suggestions_summary">Supprimer toutes les suggestions de réseau précédemment fournies par cette application.</string>
|
||||
<string name="really_remove_all_networks">Vraiment supprimer tous les réseaux ?</string>
|
||||
@@ -210,4 +251,18 @@
|
||||
<string name="wifi_phase2">Méthode de la phase 2</string>
|
||||
<string name="network_suggestions">Suggestions de réseaux</string>
|
||||
<string name="remove_suggestion">Supprimer les suggestions</string>
|
||||
<string name="email_to">Destinataire</string>
|
||||
<string name="email_subject">Sujet</string>
|
||||
<string name="email_body">Corps du message</string>
|
||||
<string name="scheme">Schéma</string>
|
||||
<string name="host">Hôte</string>
|
||||
<string name="query">Requête</string>
|
||||
<string name="automated_action_type_custom_intent">Intent personnalisé</string>
|
||||
<string name="automated_action_intent_uri_template">Modèle d’URI d’Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI d’Intent requise</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI d’Intent invalide</string>
|
||||
<string name="automated_action_list_custom_intent">Intent personnalisé : %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent personnalisé</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Üdvözöljük!</string>
|
||||
<string name="mode_expert">Haladó</string>
|
||||
<string name="mode_expert_description">Szeretném ellenőrizni az olvasott tartalmat és kézzel megnyitni.</string>
|
||||
<string name="mode_simple">Egyszerű</string>
|
||||
<string name="mode_simple_description">Csak be akarom olvasni a vonalkódokat, és azonnal megnyitni őket.</string>
|
||||
<string name="camera_error">Nem lehet hozzáférni a kamerához, próbálja meg újra</string>
|
||||
<string name="scan_code">Kód beolvasása</string>
|
||||
<string name="compose_barcode">Vonalkód létrehozása</string>
|
||||
@@ -14,40 +19,40 @@
|
||||
<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="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="label">Címke</string>
|
||||
<string name="colors">Háttér és előtér</string>
|
||||
<string name="colors_black_on_white">Fekete fehér háttéren</string>
|
||||
<string name="colors_white_on_black">Fehér fekete hátteren</string>
|
||||
<string name="colors_black_on_transparent">Fekete átlátszó háttéren</string>
|
||||
<string name="colors_white_on_transparent">Fehér átlátszó hátteren</string>
|
||||
<string name="sequence_size">Sorozat mérete</string>
|
||||
<string name="sequence_index">Sorrend index</string>
|
||||
<string name="sequence_id">Sorozat azonosító</string>
|
||||
<string name="gtin_issue_number">Hibaszám</string>
|
||||
<string name="gtin_country">Gyártó lehetséges országa</string>
|
||||
<string name="gtin_price">Ajánlott ár</string>
|
||||
<string name="gtin_add_on">UPC EAN kiterjesztés</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="barcode_version_number">Verzió</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Adatmaszk</string>
|
||||
<string name="toggle_flash">Vaku be- vagy kikapcsolása</string>
|
||||
<string name="error_flash">Hiba a vaku be- vagy kikapcsolásakor</string>
|
||||
<string name="share">Megosztás</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">Fájlként 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="copy_as_deeplink">Másolás mélyhivatkozásként</string>
|
||||
<string name="copied_to_clipboard">Vágólapra helyezés</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>
|
||||
<string name="format">Formátum</string>
|
||||
<string name="size_width_by_height">Méret képpontban: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Nincs nagyítás</string>
|
||||
<string name="add_quiet_zone">Nyugodt övezet hozzáadása</string>
|
||||
<string name="input_content_here">Itt adja meg a tartalmat</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">Kibontja a menekülési sorokat</string>
|
||||
<string name="encode">KÓDOLÁS</string>
|
||||
<string name="error_no_content">Hiányzó tartalom</string>
|
||||
<string name="error_encoding_barcode">A vonalkódot nem lehet előállítani</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Folyamatos beolvasások közti késleltetés</string>
|
||||
<string name="restrict_format">Formátum korlátozása</string>
|
||||
<string name="remove_restriction">Korlátozás eltávolítása</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">%s beolvasása</string>
|
||||
<string name="find_code">Kód keresése</string>
|
||||
<string name="find_code_with_content">Mi a tartalom?</string>
|
||||
<string name="find_code_hint">Kifejezés vagy reguláris kifejezés</string>
|
||||
<string name="does_not_match_search_term">Nem egyezik a keresőkifejezéssel</string>
|
||||
<string name="scan_for">%s beolvasása</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>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Beolvasás</string>
|
||||
<string name="content_category">Tartalom</string>
|
||||
<string name="locale_category">Nyelv</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Alapértelmezett</string>
|
||||
<string name="profile_add">Új profil hozzáadása</string>
|
||||
<string name="profile_enter_name">Adja meg a profil nevét</string>
|
||||
<string name="profile_enter_name_hint">Név</string>
|
||||
<string name="profile_invalid_name">Érvénytelen profilnév</string>
|
||||
<string name="profile_empty">Még nincs profil</string>
|
||||
<string name="profile_current">Aktuális profil</string>
|
||||
<string name="profile_remove_confirm">Eltávolítja ezt a profilt?</string>
|
||||
<string name="current_profile">Profil: %s</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>
|
||||
@@ -88,21 +105,21 @@
|
||||
<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="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="beep">Jelzés hanggal</string>
|
||||
<string name="beep_summary">Engedélyezze ezt, ha azt szeretné, hogy eszköze pittyegjen, amikor egy kód felismerésre kerül.</string>
|
||||
<string name="beep_tone">Hangjelzés</string>
|
||||
<string name="tone_cdma_confirm">CDMA megerősítés</string>
|
||||
<string name="tone_sup_confirm">Hívás felügyeleti megerősítés</string>
|
||||
<string name="tone_sup_radio_ack">Hívás felügyeleti rádió útvonal megerősítés</string>
|
||||
<string name="tone_prop_ack">Pozitív visszaigazolás</string>
|
||||
<string name="tone_prop_beep">Általános csipogás</string>
|
||||
<string name="tone_prop_beep2">Általános dupla sípolás</string>
|
||||
<string name="use_history">Beolvasási előzmények mentése</string>
|
||||
<string name="use_history_summary">Felismert kódok mentése a saját eszközén.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Ismétlések figyelmen kívül hagyása</string>
|
||||
<string name="ignore_consecutive_duplicates">Ne mentsen egymást követő azonos adatokat</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Ismétlődések elfogadása</string>
|
||||
<string name="open_immediately">Vizsgálat kihagyása és a tartalom azonnali megnyitása</string>
|
||||
<string name="open_immediately_summary">Vizsgálat kihagyása és a tartalom azonnali megnyitása. Ártalmas tartalmat is megnyithat, ha engedélyezve van.</string>
|
||||
<string name="copy_immediately">Tartalom automatikus másolása a vágólapra</string>
|
||||
@@ -111,15 +128,39 @@
|
||||
<string name="show_meta_data_summary">További adatok megjelenítése a beolvasott vonalkódokról.</string>
|
||||
<string name="show_hex_dump">Hexakiírás megjelenítése</string>
|
||||
<string name="show_hex_dump_summary">A beolvasott tartalom hexakiírásának megjelenítése.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="show_checksum">Mutassa meg az ellenőrző összeget</string>
|
||||
<string name="no_checksum">Nincs ellenőrző összeg</string>
|
||||
<string name="show_recreation">Mutasd az újrateremtett vonalkódot</string>
|
||||
<string name="show_recreation_summary">Ha lehetséges, újra létrehoz és mutasson vonalkódot az olvasott tartalomból.</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="automated_actions">Automatizált műveletek</string>
|
||||
<string name="automated_actions_none">Nincsenek automatizált műveletek</string>
|
||||
<string name="automated_actions_empty">Még nincsenek automatizált műveletek</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d automatizált művelet</item>
|
||||
<item quantity="other">%d automatizált művelet</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Művelet hozzáadása</string>
|
||||
<string name="automated_action_edit">Művelet szerkesztése</string>
|
||||
<string name="automated_action_regex">Reguláris kifejezés</string>
|
||||
<string name="automated_action_regex_hint">pl. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">A reguláris kifejezés kötelező</string>
|
||||
<string name="automated_action_regex_invalid">Érvénytelen reguláris kifejezés</string>
|
||||
<string name="automated_action_type">Művelet típusa</string>
|
||||
<string name="automated_action_type_intent">URL megnyitása</string>
|
||||
<string name="automated_action_url_template">URL-sablon</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL-sablon kötelező</string>
|
||||
<string name="automated_action_invalid_url">Érvénytelen URL-sablon</string>
|
||||
<string name="automated_action_remove_confirm">Törli ezt a műveletet?</string>
|
||||
<string name="automated_action_list_intent">URL megnyitása: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL megnyitása</string>
|
||||
<string name="automated_action_webview_title">Automatizált művelet</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>
|
||||
@@ -136,16 +177,16 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Megnyitás külső böngészőben</string>
|
||||
<string name="test_url">Teszt URL</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">Bluetooth segítségével továbbítás</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="no_bluetooth_hosts_paired">Nincsenek párosított hosztok</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Generáció</string>
|
||||
<string name="brighten_screen">Képernyő világosítása</string>
|
||||
<string name="brighten_screen_summary">Állítsa a fényerőt maximumra a vonalkód olvasásának érdekében a képernyőről.</string>
|
||||
<string name="really_remove_scan">Valóban eltávolítja a beolvasást?</string>
|
||||
<string name="really_remove_all_scans">Valóban eltávolítja az összes beolvasását?</string>
|
||||
<string name="really_remove_selected_scans">Valóban eltávolítja a kijelölt beolvasásokat?</string>
|
||||
@@ -179,8 +220,8 @@
|
||||
<string name="otpauth_add">Kétlépcsős hitelesítés hozzáadása</string>
|
||||
<string name="search_web">Keresés a weben</string>
|
||||
<string name="search_scan">Beolvasás keresése</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Hozzáadás a történethez</string>
|
||||
<string name="added_to_history">Hozzáadva a történethez</string>
|
||||
<string name="export_to_file">Exportálás fájlba</string>
|
||||
<string name="export_as">Exportálja másként?</string>
|
||||
<string name="export_csv_comma">CSV-fájl vesszővel</string>
|
||||
@@ -189,13 +230,13 @@
|
||||
<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="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">Szabad forgatás váltása</string>
|
||||
<string name="pick_file">Válasszon egy fájlt</string>
|
||||
<string name="pick_image_file">Képfájl kiválasztása</string>
|
||||
<string name="pick_code_to_scan">Kód kiválasztása a beolvasáshoz</string>
|
||||
<string name="shortcut_decode">Vonalkód beolvasása</string>
|
||||
<string name="shortcut_encode">Vonalkód létrehozása</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Előzmények</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>
|
||||
@@ -208,6 +249,20 @@
|
||||
<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>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">Hálózati javaslatok</string>
|
||||
<string name="remove_suggestion">Javaslat eltávolítása</string>
|
||||
<string name="email_to">Címzett</string>
|
||||
<string name="email_subject">Tárgy</string>
|
||||
<string name="email_body">Törzs</string>
|
||||
<string name="scheme">Terv</string>
|
||||
<string name="host">Házigazda</string>
|
||||
<string name="query">Lekérdezés</string>
|
||||
<string name="automated_action_type_custom_intent">Egyéni intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI-sablon</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI szükséges</string>
|
||||
<string name="automated_action_intent_uri_invalid">Érvénytelen Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">Egyéni intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Egyéni intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Selamat datang!</string>
|
||||
<string name="mode_expert">Lanjutan</string>
|
||||
<string name="mode_expert_description">Saya ingin memeriksa konten yang dibaca dan membukanya secara manual.</string>
|
||||
<string name="mode_simple">Sederhana</string>
|
||||
<string name="mode_simple_description">Saya hanya ingin memindai kode batang dan langsung membukanya.</string>
|
||||
<string name="camera_error">Tidak bisa mengakses kamera, silakan coba lagi</string>
|
||||
<string name="scan_code">Pindai kode</string>
|
||||
<string name="compose_barcode">Buat barcode</string>
|
||||
@@ -13,7 +18,7 @@
|
||||
<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="label">Label</string>
|
||||
<string name="label">Etiqueta</string>
|
||||
<string name="colors">Muka dan latar belakang</string>
|
||||
<string name="colors_black_on_white">Hitam di atas putih</string>
|
||||
<string name="colors_white_on_black">Putih di atas hitam</string>
|
||||
@@ -28,40 +33,41 @@
|
||||
<string name="gtin_add_on">Ekstensi UPC EAN</string>
|
||||
<string name="barcode_version_number">Versi</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modul)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Maschera dati</string>
|
||||
<string name="toggle_flash">Nyala/matikan blitz</string>
|
||||
<string name="error_flash">Galat nyala/matikan blitz</string>
|
||||
<string name="share">Bagikan</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">Dijeli kao datoteku</string>
|
||||
<string name="share_as">Bagikan sebagai?</string>
|
||||
<string name="copy_to_clipboard">Salin ke clipboard</string>
|
||||
<string name="copy_as_deeplink">Salin sebagai tautan langsung</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>
|
||||
<string name="format">Format</string>
|
||||
<string name="size_width_by_height">Ukuran dalam piksel: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">無放大</string>
|
||||
<string name="add_quiet_zone">Dodaj cichą strefę</string>
|
||||
<string name="input_content_here">Masukkan konten di sini</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">Escapar secuencias de escape</string>
|
||||
<string name="encode">ENKODE</string>
|
||||
<string name="error_no_content">Tidak ada konten</string>
|
||||
<string name="error_encoding_barcode">Barcode tidak bisa dibuat</string>
|
||||
<string name="view_barcode">Lihat barcode</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="info">Informazioni</string>
|
||||
<string name="switch_camera">Ganti kamera</string>
|
||||
<string name="bulk_mode">Pindai tanpa henti</string>
|
||||
<string name="bulk_mode_summary">Selalu mulai pemindaian tanpa henti.</string>
|
||||
<string name="bulk_mode_delay">Tundaan antara pemindaian tanpa henti</string>
|
||||
<string name="restrict_format">Batasi format</string>
|
||||
<string name="remove_restriction">Hapus pembatasan</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Pindai %s</string>
|
||||
<string name="find_code">Trouver le code</string>
|
||||
<string name="find_code_with_content">Quel contenu?</string>
|
||||
<string name="find_code_hint">Istilah atau ekspresi reguler</string>
|
||||
<string name="does_not_match_search_term">Tidak cocok dengan istilah pencarian</string>
|
||||
<string name="scan_for">Pindai %s</string>
|
||||
<string name="quarter_second">Seperempat detik</string>
|
||||
<string name="half_second">Setengah detik</string>
|
||||
<string name="a_second">Satu detik</string>
|
||||
@@ -72,6 +78,17 @@
|
||||
<string name="scan_category">Pemindaian</string>
|
||||
<string name="content_category">Konten</string>
|
||||
<string name="locale_category">Bahasa</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Bawaan</string>
|
||||
<string name="profile_add">Tambah profil baru</string>
|
||||
<string name="profile_enter_name">Masukkan nama profil</string>
|
||||
<string name="profile_enter_name_hint">Nama</string>
|
||||
<string name="profile_invalid_name">Nama profil tidak valid</string>
|
||||
<string name="profile_empty">Belum ada profil</string>
|
||||
<string name="profile_current">Profil saat ini</string>
|
||||
<string name="profile_remove_confirm">Hapus profil ini?</string>
|
||||
<string name="current_profile">Profil: %s</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>
|
||||
@@ -90,12 +107,12 @@
|
||||
<string name="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_cdma_confirm">CDMA 확인</string>
|
||||
<string name="tone_sup_confirm">تأكيد الإشراف على المكالمة</string>
|
||||
<string name="tone_sup_radio_ack">Llamada de supervisión de la ruta de radio de confirmación</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="tone_prop_beep">Generale segnale acustico</string>
|
||||
<string name="tone_prop_beep2">Generelle Doppelton</string>
|
||||
<string name="use_history">Simpan riwayat pemindaian</string>
|
||||
<string name="use_history_summary">Simpan kode yang berhasil dipindai pada perangkat anda.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
@@ -110,8 +127,8 @@
|
||||
<string name="show_meta_data_summary">Tampilkan data tambahan tentang barcode yang dipindai.</string>
|
||||
<string name="show_hex_dump">Tampilkan hex dump</string>
|
||||
<string name="show_hex_dump_summary">Tampilkan hex dump dari konten hasil pemindaian.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">Mostrar suma de verificación</string>
|
||||
<string name="no_checksum">Ingen kontrollsiffer</string>
|
||||
<string name="show_recreation">Tampilkan barcode yang dibuat ulang</string>
|
||||
<string name="show_recreation_summary">Buat ulang dan tampilkan barcode dari isi konten jika memungkinkan.</string>
|
||||
<string name="close_automatically">Kembali setelah Salin/Berbagi</string>
|
||||
@@ -119,6 +136,30 @@
|
||||
<string name="default_search_engine">Buka data tak dikenal di</string>
|
||||
<string name="always_ask">Selalu tanya</string>
|
||||
<string name="open_with_url">Buka data tak dikenal dengan URL</string>
|
||||
|
||||
<string name="automated_actions">Tindakan otomatis</string>
|
||||
<string name="automated_actions_none">Tidak ada tindakan otomatis</string>
|
||||
<string name="automated_actions_empty">Belum ada tindakan otomatis</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d tindakan otomatis</item>
|
||||
<item quantity="other">%d tindakan otomatis</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Tambah tindakan</string>
|
||||
<string name="automated_action_edit">Edit tindakan</string>
|
||||
<string name="automated_action_regex">Regex</string>
|
||||
<string name="automated_action_regex_hint">mis. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regex wajib diisi</string>
|
||||
<string name="automated_action_regex_invalid">Regex tidak valid</string>
|
||||
<string name="automated_action_type">Jenis tindakan</string>
|
||||
<string name="automated_action_type_intent">Buka URL</string>
|
||||
<string name="automated_action_url_template">Templat URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Templat URL wajib diisi</string>
|
||||
<string name="automated_action_invalid_url">Templat URL tidak valid</string>
|
||||
<string name="automated_action_remove_confirm">Hapus tindakan ini?</string>
|
||||
<string name="automated_action_list_intent">Buka URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Buka URL</string>
|
||||
<string name="automated_action_webview_title">Tindakan otomatis</string>
|
||||
<string name="clear_network_suggestions">Hapus saran jaringan</string>
|
||||
<string name="clear_network_suggestions_summary">Hapus semua saran jaringan yang sebelumnya disediakan oleh aplikasi ini.</string>
|
||||
<string name="really_remove_all_networks">Yakin menghapus semua jaringan?</string>
|
||||
@@ -135,15 +176,15 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Buka di peramban eksternal</string>
|
||||
<string name="test_url">URL Tes</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">Reenviar exploraciones con Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="send_scan_bluetooth_host">مضيف</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="generation_category">Generasi</string>
|
||||
<string name="brighten_screen">明るさを強調する</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="really_remove_scan">Yakin menghapus pindaian?</string>
|
||||
<string name="really_remove_all_scans">Yakin menghapus semua pindaian?</string>
|
||||
@@ -178,8 +219,8 @@
|
||||
<string name="otpauth_add">Tambahkan 2FA</string>
|
||||
<string name="search_web">Cari secara daring</string>
|
||||
<string name="search_scan">Cari pindaian</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Aggiungi alla cronologia</string>
|
||||
<string name="added_to_history">Dodano do historii</string>
|
||||
<string name="export_to_file">Ekspor ke berkas</string>
|
||||
<string name="export_as">Ekspor sebagai?</string>
|
||||
<string name="export_csv_comma">CSV dengan koma</string>
|
||||
@@ -189,12 +230,12 @@
|
||||
<string name="saved_in_downloads">Simpan di dalam unduhan</string>
|
||||
<string name="rotate_image_cw">Putar gambar searah jarum jam</string>
|
||||
<string name="toggle_free_rotation">Nyala/matikan rotasi bebas</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_file">Vælg en fil</string>
|
||||
<string name="pick_image_file">Pilih berkas gambar</string>
|
||||
<string name="pick_code_to_scan">Pilih kode untuk dipindai</string>
|
||||
<string name="shortcut_decode">Pindai barcode</string>
|
||||
<string name="shortcut_encode">Buat barcode</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Istoric</string>
|
||||
<string name="shortcut_preferences">Pengaturan</string>
|
||||
<string name="background_request_failed">Permintaan latar belakang gagal</string>
|
||||
<string name="entry_type">Tipe</string>
|
||||
@@ -207,6 +248,20 @@
|
||||
<string name="wifi_anonymous_identity">Identitas anonim</string>
|
||||
<string name="wifi_identity">Identitas</string>
|
||||
<string name="wifi_phase2">Metode fase 2</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">Suggerimenti di rete</string>
|
||||
<string name="remove_suggestion">Elimina sugerencia</string>
|
||||
<string name="email_to">Penerima</string>
|
||||
<string name="email_subject">Subjek</string>
|
||||
<string name="email_body">Isi</string>
|
||||
<string name="scheme">Schema</string>
|
||||
<string name="host">Anfitrión</string>
|
||||
<string name="query">Consulta</string>
|
||||
<string name="automated_action_type_custom_intent">Intent kustom</string>
|
||||
<string name="automated_action_intent_uri_template">Templat URI Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI Intent wajib diisi</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI Intent tidak valid</string>
|
||||
<string name="automated_action_list_custom_intent">Intent kustom: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent kustom</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Benvenuto!</string>
|
||||
<string name="mode_expert">Avanzato</string>
|
||||
<string name="mode_expert_description">Voglio controllare il contenuto letto e aprirlo manualmente.</string>
|
||||
<string name="mode_simple">Semplice</string>
|
||||
<string name="mode_simple_description">Voglio solo scansionare codici a barre e aprirli immediatamente.</string>
|
||||
<string name="camera_error">Impossibile accedere alla fotocamera. Riprova</string>
|
||||
<string name="scan_code">Scansione codice</string>
|
||||
<string name="compose_barcode">Crea codice a barre</string>
|
||||
@@ -29,23 +34,23 @@
|
||||
<string name="gtin_add_on">Estensione UPC EAN</string>
|
||||
<string name="barcode_version_number">Versione</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d moduli)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Maschera dati</string>
|
||||
<string name="toggle_flash">Attiva/disattiva flash</string>
|
||||
<string name="error_flash">Errore durante attivazione/disattivazione flash</string>
|
||||
<string name="share">Condividi</string>
|
||||
<string name="share_file">Condividi come file</string>
|
||||
<string name="share_as">Condividi come?</string>
|
||||
<string name="copy_to_clipboard">Copia negli Appunti</string>
|
||||
<string name="copy_as_deeplink">Copia come deeplink</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>
|
||||
<string name="pick_search_engine">Scegli motore di ricerca</string>
|
||||
<string name="format">Formato</string>
|
||||
<string name="size_width_by_height">Dimensioni (pixel): %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Nessun ingrandimento</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="add_quiet_zone">Aggiungi zona tranquilla</string>
|
||||
<string name="input_content_here">Inserisci qui il contenuto</string>
|
||||
<string name="unescape">Espandi sequenze escape</string>
|
||||
<string name="encode">CODIFICA</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Ritardo tra scansioni continue</string>
|
||||
<string name="restrict_format">Limita formato</string>
|
||||
<string name="remove_restriction">Rimuovi limitazione</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scansiona %s</string>
|
||||
<string name="find_code">Trova codice</string>
|
||||
<string name="find_code_with_content">Quale contenuto?</string>
|
||||
<string name="find_code_hint">Termine o espressione regolare</string>
|
||||
<string name="does_not_match_search_term">Non corrisponde al termine di ricerca</string>
|
||||
<string name="scan_for">Scansiona %s</string>
|
||||
<string name="quarter_second">Un quarto di secondo</string>
|
||||
<string name="half_second">Mezzo secondo</string>
|
||||
<string name="a_second">Un secondo</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Scansione</string>
|
||||
<string name="content_category">Contenuto</string>
|
||||
<string name="locale_category">Lingua</string>
|
||||
<string name="profile_category">Profilo</string>
|
||||
<string name="profile">Profilo</string>
|
||||
<string name="profile_default">Predefinito</string>
|
||||
<string name="profile_add">Aggiungi nuovo profilo</string>
|
||||
<string name="profile_enter_name">Inserisci nome profilo</string>
|
||||
<string name="profile_enter_name_hint">Nome</string>
|
||||
<string name="profile_invalid_name">Nome profilo non valido</string>
|
||||
<string name="profile_empty">Nessun profilo per ora</string>
|
||||
<string name="profile_current">Profilo attuale</string>
|
||||
<string name="profile_remove_confirm">Vuoi rimuovere questo profilo?</string>
|
||||
<string name="current_profile">Profilo: %s</string>
|
||||
<string name="custom_locale">Lingua personalizzata</string>
|
||||
<string name="follow_system_settings">Usa impostazioni di sistema</string>
|
||||
<string name="show_crop_handle">Visualizza riquadro limite</string>
|
||||
@@ -110,7 +127,7 @@
|
||||
<string name="show_meta_data">Visualizza metadati</string>
|
||||
<string name="show_meta_data_summary">Visualizza dati aggiuntivi codice a barre scansionato.</string>
|
||||
<string name="show_hex_dump">Visualizza dump esadecimale</string>
|
||||
<string name="show_hex_dump_summary">Visualizza un dump esadecimale dei contenuti scansionati.</string>
|
||||
<string name="show_hex_dump_summary">Visualizza dump esadecimale contenuti scansionati.</string>
|
||||
<string name="show_checksum">Visualizza checksum</string>
|
||||
<string name="no_checksum">Nessuna checksum</string>
|
||||
<string name="show_recreation">Visualizza codice a barre ricreato</string>
|
||||
@@ -120,6 +137,36 @@
|
||||
<string name="default_search_engine">Apri dati sconosciuti con</string>
|
||||
<string name="always_ask">Chiedi sempre</string>
|
||||
<string name="open_with_url">Apri dati sconosciuti con URL</string>
|
||||
<string name="automated_actions">Azioni automatizzate</string>
|
||||
<string name="automated_actions_none">Nessuna azione automatizzata</string>
|
||||
<string name="automated_actions_empty">Nessuna azione automatizzata ancora</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d azione automatizzata</item>
|
||||
<item quantity="other">%d azioni automatizzate</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Aggiungi azione</string>
|
||||
<string name="automated_action_edit">Modifica azione</string>
|
||||
<string name="automated_action_regex">Espressione regolare</string>
|
||||
<string name="automated_action_regex_hint">es. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Richiesta espressione regolare</string>
|
||||
<string name="automated_action_regex_invalid">Espressione regolare non valida</string>
|
||||
<string name="automated_action_type">Tipo azione</string>
|
||||
<string name="automated_action_type_intent">Apri URL</string>
|
||||
<string name="automated_action_type_custom_intent">Intento personalizzato</string>
|
||||
<string name="automated_action_url_template">Modello URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Richiesto modello URL</string>
|
||||
<string name="automated_action_intent_uri_template">Modello URI intento</string>
|
||||
<string name="automated_action_intent_uri_hint">intento:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Richiesto URI intento</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI intento non valido</string>
|
||||
<string name="automated_action_invalid_url">Modello URL non valido</string>
|
||||
<string name="automated_action_remove_confirm">Vuoi rimuovere questa azione?</string>
|
||||
<string name="automated_action_list_intent">Apri URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Apri URL</string>
|
||||
<string name="automated_action_list_custom_intent">Intento personalizzato: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intento personalizzato</string>
|
||||
<string name="automated_action_webview_title">Azione automatizzata</string>
|
||||
<string name="clear_network_suggestions">Cancella suggerimenti di rete</string>
|
||||
<string name="clear_network_suggestions_summary">Cancella tutti i suggerimenti di rete precedentemente forniti da questa app.</string>
|
||||
<string name="really_remove_all_networks">Vuoi rimuovere tutte le reti?</string>
|
||||
@@ -142,7 +189,7 @@
|
||||
<string name="no_bluetooth_hosts_paired">Nessun host accoppiato</string>
|
||||
<string name="bluetooth_connect_fail">Impossibile connettersi al dispositivo Bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">Impossibile inviare al dispositivo Bluetooth.</string>
|
||||
<string name="bluetooth_send_success">Invio via Bluetooth riuscito.</string>
|
||||
<string name="bluetooth_send_success">Invio via Bluetooth completato.</string>
|
||||
<string name="generation_category">Generazione</string>
|
||||
<string name="brighten_screen">Schiarisci schermo</string>
|
||||
<string name="brighten_screen_summary">Imposta luminosità al massimo per migliorare la scansione di un codice a barre dallo schermo.</string>
|
||||
@@ -210,4 +257,10 @@
|
||||
<string name="wifi_phase2">Metodo fase 2</string>
|
||||
<string name="network_suggestions">Suggerimenti rete</string>
|
||||
<string name="remove_suggestion">Elimina suggerimento</string>
|
||||
<string name="email_to">Destinatario</string>
|
||||
<string name="email_subject">Oggetto</string>
|
||||
<string name="email_body">Corpo</string>
|
||||
<string name="scheme">Schema</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="query">Richiesta</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">ようこそ!</string>
|
||||
<string name="mode_expert">上級</string>
|
||||
<string name="mode_expert_description">読み取った内容を確認し、手動で開きたい。</string>
|
||||
<string name="mode_simple">簡単</string>
|
||||
<string name="mode_simple_description">バーコードをスキャンしてすぐに開きたい。</string>
|
||||
<string name="camera_error">カメラに接続できませんでした。再試行してください。</string>
|
||||
<string name="scan_code">バーコードをスキャン</string>
|
||||
<string name="compose_barcode">バーコードを作成</string>
|
||||
@@ -13,7 +18,7 @@
|
||||
<string name="error_correction_level_m" formatted="false">中 (~15% の正確性)</string>
|
||||
<string name="error_correction_level_q" formatted="false">高 (~25% の正確性)</string>
|
||||
<string name="error_correction_level_h" formatted="false">最高 (~30% の正確性)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="label">ラベル</string>
|
||||
<string name="colors">背面と前面</string>
|
||||
<string name="colors_black_on_white">白地に黒色</string>
|
||||
<string name="colors_white_on_black">黒地に白色</string>
|
||||
@@ -28,25 +33,25 @@
|
||||
<string name="gtin_add_on">UPC/EAN 拡張型</string>
|
||||
<string name="barcode_version_number">バージョン</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">データマスク</string>
|
||||
<string name="toggle_flash">フラッシュの切り替え</string>
|
||||
<string name="error_flash">フラッシュの切り替えエラー</string>
|
||||
<string name="share">共有</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">ファイルとして共有</string>
|
||||
<string name="share_as">画像形式を選択</string>
|
||||
<string name="copy_to_clipboard">クリップボードにコピー</string>
|
||||
<string name="copy_as_deeplink">ディープリンクとしてコピー</string>
|
||||
<string name="copied_to_clipboard">クリップボードにコピーされました</string>
|
||||
<string name="copy_password">クリップボードにパスワードをコピー</string>
|
||||
<string name="copied_password_to_clipboard">パスワードがクリップボードにコピーされました</string>
|
||||
<string name="open_url">URLを開く</string>
|
||||
<string name="cannot_resolve_action">開くためのアプリがありません!</string>
|
||||
<string name="pick_search_engine">検索エンジンを選択</string>
|
||||
<string name="format">フォーマット</string>
|
||||
<string name="size_width_by_height">大きさ(ピクセル): %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_width_by_height">大きさ(ピクセル): %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">拡大なし</string>
|
||||
<string name="add_quiet_zone">外側に余白(クワイエットゾーン)を追加する</string>
|
||||
<string name="input_content_here">ここに内容を入力</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">エスケープシーケンスを展開する</string>
|
||||
<string name="encode">エンコード</string>
|
||||
<string name="error_no_content">内容が指定されていません</string>
|
||||
<string name="error_encoding_barcode">バーコードを作成できませんでした</string>
|
||||
@@ -58,10 +63,11 @@
|
||||
<string name="bulk_mode_delay">連続スキャンの間隔</string>
|
||||
<string name="restrict_format">フォーマットの制限</string>
|
||||
<string name="remove_restriction">制限を解除</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">%sをスキャン</string>
|
||||
<string name="find_code">コードを検索</string>
|
||||
<string name="find_code_with_content">何の内容ですか?</string>
|
||||
<string name="find_code_hint">検索ワードまたは正規表現</string>
|
||||
<string name="does_not_match_search_term">検索ワードと一致しません</string>
|
||||
<string name="scan_for">%sをスキャン</string>
|
||||
<string name="quarter_second">0.25秒</string>
|
||||
<string name="half_second">0.5秒</string>
|
||||
<string name="a_second">1秒</string>
|
||||
@@ -72,6 +78,17 @@
|
||||
<string name="scan_category">スキャン</string>
|
||||
<string name="content_category">コンテンツ</string>
|
||||
<string name="locale_category">言語</string>
|
||||
<string name="profile_category">プロファイル</string>
|
||||
<string name="profile">プロファイル</string>
|
||||
<string name="profile_default">デフォルト</string>
|
||||
<string name="profile_add">新しいプロファイルを追加</string>
|
||||
<string name="profile_enter_name">プロファイル名を入力</string>
|
||||
<string name="profile_enter_name_hint">名前</string>
|
||||
<string name="profile_invalid_name">無効なプロファイル名</string>
|
||||
<string name="profile_empty">まだプロファイルはありません</string>
|
||||
<string name="profile_current">現在のプロファイル</string>
|
||||
<string name="profile_remove_confirm">このプロファイルを削除しますか?</string>
|
||||
<string name="current_profile">プロファイル: %s</string>
|
||||
<string name="custom_locale">言語の変更</string>
|
||||
<string name="follow_system_settings">システム設定に従う</string>
|
||||
<string name="show_crop_handle">トリミングツールを表示</string>
|
||||
@@ -88,20 +105,20 @@
|
||||
<string name="vibrate">認識時に振動する</string>
|
||||
<string name="vibrate_summary">バーコードが認識されたときにバイブレーションを行います。</string>
|
||||
<string name="beep">検出時にビープ音を鳴らす</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_summary">コードが認識されたときにデバイスがビープする場合は、これを有効にしてください。</string>
|
||||
<string name="beep_tone">ビープ音</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_cdma_confirm">CDMA 確認</string>
|
||||
<string name="tone_sup_confirm">コール監督確認</string>
|
||||
<string name="tone_sup_radio_ack">コール監督ラジオ経路確認</string>
|
||||
<string name="tone_prop_ack">ポジティブな承認</string>
|
||||
<string name="tone_prop_beep">一般的なビープ音</string>
|
||||
<string name="tone_prop_beep2">一般的なダブルビープ音</string>
|
||||
<string name="use_history">スキャン履歴を保存する</string>
|
||||
<string name="use_history_summary">認識されたバーコードを端末に保存しておきます。</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">重複を無視する</string>
|
||||
<string name="ignore_consecutive_duplicates">重複を破棄する</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">重複を許可</string>
|
||||
<string name="open_immediately">すぐにコンテンツを開く</string>
|
||||
<string name="open_immediately_summary">確認画面なしでコンテンツをすぐに開くようにします。有害なコンテンツを開いてしまうリスクがあります。</string>
|
||||
<string name="copy_immediately">自動的にクリップボードにコピー</string>
|
||||
@@ -110,8 +127,8 @@
|
||||
<string name="show_meta_data_summary">スキャンされたバーコードの追加データを確認できるようにします。</string>
|
||||
<string name="show_hex_dump">16進数を表示</string>
|
||||
<string name="show_hex_dump_summary">スキャンされたコンテンツの16進数データを確認できるようにします。</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">チェックサムを表示</string>
|
||||
<string name="no_checksum">チェックサムなし</string>
|
||||
<string name="show_recreation">再生成したバーコードを表示</string>
|
||||
<string name="show_recreation_summary">可能であれば、読み取ったコンテンツからバーコードを再生成して表示します。</string>
|
||||
<string name="close_automatically">コピー/共有後に戻る</string>
|
||||
@@ -119,6 +136,30 @@
|
||||
<string name="default_search_engine">未知のデータの表示方法</string>
|
||||
<string name="always_ask">常に尋ねる</string>
|
||||
<string name="open_with_url">未知のデータを次のURLから開く</string>
|
||||
|
||||
<string name="automated_actions">自動アクション</string>
|
||||
<string name="automated_actions_none">自動アクションはありません</string>
|
||||
<string name="automated_actions_empty">まだ自動アクションがありません</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d 件の自動アクション</item>
|
||||
<item quantity="other">%d 件の自動アクション</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">アクションを追加</string>
|
||||
<string name="automated_action_edit">アクションを編集</string>
|
||||
<string name="automated_action_regex">正規表現</string>
|
||||
<string name="automated_action_regex_hint">例: ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">正規表現が必要です</string>
|
||||
<string name="automated_action_regex_invalid">正規表現が無効です</string>
|
||||
<string name="automated_action_type">アクションの種類</string>
|
||||
<string name="automated_action_type_intent">URL を開く</string>
|
||||
<string name="automated_action_url_template">URLテンプレート</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URLテンプレートが必要です</string>
|
||||
<string name="automated_action_invalid_url">URLテンプレートが無効です</string>
|
||||
<string name="automated_action_remove_confirm">このアクションを削除しますか?</string>
|
||||
<string name="automated_action_list_intent">URLを開く: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URLを開く</string>
|
||||
<string name="automated_action_webview_title">自動アクション</string>
|
||||
<string name="clear_network_suggestions">ネットワークの提案を消去</string>
|
||||
<string name="clear_network_suggestions_summary">このアプリのネットワークの提案をすべて削除します。</string>
|
||||
<string name="really_remove_all_networks">ネットワークの提案を消去してもよろしいですか?</string>
|
||||
@@ -135,16 +176,16 @@
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">外部ブラウザで開く</string>
|
||||
<string name="test_url">URLをテスト</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">Bluetooth でスキャンを転送</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">ホスト</string>
|
||||
<string name="no_bluetooth_hosts_paired">ホストがペアリングされていません</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">作成</string>
|
||||
<string name="brighten_screen">画面を明るくする</string>
|
||||
<string name="brighten_screen_summary">画面からバーコードをスキャンするために、明るさを最大に設定します。</string>
|
||||
<string name="really_remove_scan">このスキャン履歴を削除しても宜しいですか?</string>
|
||||
<string name="really_remove_all_scans">全てのスキャン履歴を削除しても宜しいですか?</string>
|
||||
<string name="really_remove_selected_scans">選択されたスキャン履歴を削除しても宜しいですか?</string>
|
||||
@@ -178,8 +219,8 @@
|
||||
<string name="otpauth_add">二段階認証を追加</string>
|
||||
<string name="search_web">ウェブで検索</string>
|
||||
<string name="search_scan">スキャン結果を検索</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">履歴に追加</string>
|
||||
<string name="added_to_history">履歴に追加されました</string>
|
||||
<string name="export_to_file">ファイルにエクスポート</string>
|
||||
<string name="export_as">ファイル形式を選択</string>
|
||||
<string name="export_csv_comma">コンマ区切りのCSVファイル</string>
|
||||
@@ -188,13 +229,13 @@
|
||||
<string name="export_database">SQLiteデータベース</string>
|
||||
<string name="saved_in_downloads">ダウンロードフォルダに保存されました</string>
|
||||
<string name="rotate_image_cw">時計回りに回転</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">自由回転を切り替える</string>
|
||||
<string name="pick_file">ファイルを選択</string>
|
||||
<string name="pick_image_file">画像を選択して読み込み</string>
|
||||
<string name="pick_code_to_scan">スキャンするバーコードを選択</string>
|
||||
<string name="shortcut_decode">バーコードをスキャン</string>
|
||||
<string name="shortcut_encode">バーコードを作成</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">履歴</string>
|
||||
<string name="shortcut_preferences">設定</string>
|
||||
<string name="background_request_failed">バックグラウンド要求に失敗しました</string>
|
||||
<string name="entry_type">種類</string>
|
||||
@@ -204,9 +245,23 @@
|
||||
<string name="wifi_password">パスワード</string>
|
||||
<string name="wifi_hidden">非表示のネットワーク</string>
|
||||
<string name="wifi_eap">EAP方式</string>
|
||||
<string name="wifi_anonymous_identity">Anonymous identity</string>
|
||||
<string name="wifi_identity">Identity</string>
|
||||
<string name="wifi_anonymous_identity">匿名ID</string>
|
||||
<string name="wifi_identity">アイデンティティ</string>
|
||||
<string name="wifi_phase2">フェーズ2方式</string>
|
||||
<string name="network_suggestions">ネットワークに関する提案</string>
|
||||
<string name="remove_suggestion">提案の削除</string>
|
||||
<string name="email_to">宛先</string>
|
||||
<string name="email_subject">件名</string>
|
||||
<string name="email_body">本文</string>
|
||||
<string name="scheme">スキーム</string>
|
||||
<string name="host">ホスト</string>
|
||||
<string name="query">クエリ</string>
|
||||
<string name="automated_action_type_custom_intent">カスタム Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI テンプレート</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI が必要です</string>
|
||||
<string name="automated_action_intent_uri_invalid">無効な Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">カスタム Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">カスタム Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">მოგესალმებით!</string>
|
||||
<string name="mode_expert">გაფართოებული</string>
|
||||
<string name="mode_expert_description">მინდა გადავამოწმო წაკითხული შინაარსი და გავხსნა ხელით.</string>
|
||||
<string name="mode_simple">მარტივი</string>
|
||||
<string name="mode_simple_description">მხოლოდ მინდა დავასკანერო ბარკოდი და გავხსნა დაუყოვნებლივ.</string>
|
||||
<string name="camera_error">კამერაზე წვდომის მოპოვება ვერ ხერხდება, გთხოვთ, კიდევ სცადეთ</string>
|
||||
<string name="scan_code">შტრიხ-კოდის სკანირება</string>
|
||||
<string name="compose_barcode">შტრიხ-კოდის შექმნა</string>
|
||||
@@ -14,40 +19,40 @@
|
||||
<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="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="label">წარწერა</string>
|
||||
<string name="colors">წინა და ფონი</string>
|
||||
<string name="colors_black_on_white">შავი თეთრზე</string>
|
||||
<string name="colors_white_on_black">თეთრი შავ ფონზე</string>
|
||||
<string name="colors_black_on_transparent">შავი გაუსრული</string>
|
||||
<string name="colors_white_on_transparent">თეთრი სატრანსპარენტო</string>
|
||||
<string name="sequence_size">სიას ზომა</string>
|
||||
<string name="sequence_index">სამიზეისის ინდექსი</string>
|
||||
<string name="sequence_id">მიმდინარე ნამდვილი ID</string>
|
||||
<string name="gtin_issue_number">გამოშვების ნომერი</string>
|
||||
<string name="gtin_country">შესაძლო მწარმოებელი ქვეყანა</string>
|
||||
<string name="gtin_price">დაახლოებითი ფასი</string>
|
||||
<string name="gtin_add_on">UPC EAN გაფართოება</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="barcode_version_number">ვერსია</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">მონაცემთა მასკა</string>
|
||||
<string name="toggle_flash">განათების ჩართვა</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="error_flash">შეცდომა ფლეშის ჩართვისას</string>
|
||||
<string name="share">გაზიარება</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="share_file">გაზიარეთ ფაილის სახით</string>
|
||||
<string name="share_as">გაზიარე როგორ?</string>
|
||||
<string name="copy_to_clipboard">გაცვლის ბუფერში კოპირება</string>
|
||||
<string name="copy_as_deeplink">კოპირება deeplink-ის სახით</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_width_by_height">ზომა პიქსელებში: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">არ არის დიდება</string>
|
||||
<string name="add_quiet_zone">დაამატეთ შესული ზონა</string>
|
||||
<string name="input_content_here">შეიყვანეთ ტექსტი აქ</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">ექსპანდირების გასადარები სიმბოლოები</string>
|
||||
<string name="encode">შექმნა"</string>
|
||||
<string name="error_no_content">მონაცემები არაა</string>
|
||||
<string name="error_encoding_barcode">შტრიხ-კოდის შექმნა შეუძლებელია</string>
|
||||
@@ -55,54 +60,66 @@
|
||||
<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="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</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="bulk_mode_summary">ყოველთვის დაიწყეთ სკანირება უწყვეტად.</string>
|
||||
<string name="bulk_mode_delay">განაგრძეთ გადანომრვას შორის შეზღუდვა</string>
|
||||
<string name="restrict_format">ფორმატის შეზღუდვა</string>
|
||||
<string name="remove_restriction">შეასწორე შეზღუდვა</string>
|
||||
<string name="find_code">კოდის პოვნა</string>
|
||||
<string name="find_code_with_content">რა შინაა?</string>
|
||||
<string name="find_code_hint">ტერმინი ან რეგულარული გამოთქმა</string>
|
||||
<string name="does_not_match_search_term">არ შეესაბამება ძიების ტერმინს</string>
|
||||
<string name="scan_for">სკანირე %s</string>
|
||||
<string name="quarter_second">ერთი კვარტალი წამი</string>
|
||||
<string name="half_second">ნახე წამში</string>
|
||||
<string name="a_second">ერთი წამი</string>
|
||||
<string name="two_seconds">ორი წამი</string>
|
||||
<string name="five_seconds">ხუთი წამი</string>
|
||||
<string name="history">ისტორია</string>
|
||||
<string name="preferences">პარამეტრები</string>
|
||||
<string name="scan_category">სკანირება</string>
|
||||
<string name="content_category">კონტენტი</string>
|
||||
<string name="locale_category">Language</string>
|
||||
<string name="custom_locale">Custom language</string>
|
||||
<string name="follow_system_settings">Follow system settings</string>
|
||||
<string name="locale_category">ენა</string>
|
||||
<string name="profile_category">პროფილი</string>
|
||||
<string name="profile">პროფილი</string>
|
||||
<string name="profile_default">ნაგულისხმევი</string>
|
||||
<string name="profile_add">ახალი პროფილის დამატება</string>
|
||||
<string name="profile_enter_name">შეიყვანეთ პროფილის სახელი</string>
|
||||
<string name="profile_enter_name_hint">სახელი</string>
|
||||
<string name="profile_invalid_name">პროფილის სახელი არასწორია</string>
|
||||
<string name="profile_empty">პროფილები ჯერ არ არის</string>
|
||||
<string name="profile_current">მიმდინარე პროფილი</string>
|
||||
<string name="profile_remove_confirm">წაიშალოს ეს პროფილი?</string>
|
||||
<string name="current_profile">პროფილი: %s</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="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="show_toast_in_bulk_mode">მონაცემების ჩვენება მუდმივ რეჟიმში</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">ჩანაწერების მთხოვნელი ნაჩვენე განსხვავებულ რეჟიმში სკანირების დროს.</string>
|
||||
<string name="vibrate">ვიბრირება პოვნისას</string>
|
||||
<string name="vibrate_summary">ჩართეთ ეს პარამეტრი, თუ გსურთ მოწყობილობის ვიბრირება,როდესაც შტრიხ-კოდი ამოცნობილი იქნება.</string>
|
||||
<string name="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="beep">ამოხსნაზე სიჩქარე</string>
|
||||
<string name="beep_summary">აქტივირებეთ ეს, თუ გსურთ, რომ თქვენი მოწყობილობა შემირჩიეთ კოდის აღცილების დროს.</string>
|
||||
<string name="beep_tone">ბიპ ტონი</string>
|
||||
<string name="tone_cdma_confirm">CDMA დადასტუდება</string>
|
||||
<string name="tone_sup_confirm">ზარის წესის დადასტურება</string>
|
||||
<string name="tone_sup_radio_ack">ზარის სუპერვიზორების რადიო გზის დადასტურება</string>
|
||||
<string name="tone_prop_ack">დადებითი მიღწევა</string>
|
||||
<string name="tone_prop_beep">ზოგადი ბიპი</string>
|
||||
<string name="tone_prop_beep2">ზოგადი ორმხრივი ბიპი</string>
|
||||
<string name="use_history">სკანირების ისტორიის შენახვა</string>
|
||||
<string name="use_history_summary">ამოცნობილი შტრიხ-კოდების მოწყობილობაზე შენახვა.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">გაუმხავად დუბლირებები</string>
|
||||
<string name="ignore_consecutive_duplicates">არ შევინახოთ შემდგომი ასლები</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">დუპლიკატების მიღება</string>
|
||||
<string name="open_immediately">შემოწმების გამოტოვება და მყისიერი გახსნა</string>
|
||||
<string name="open_immediately_summary">შემოწმების გამოტოვება და მყისიერი გახსნა. შესაძლოა გამოიწვიოს არასასარგებლო კონტენტის ჩვენება.</string>
|
||||
<string name="copy_immediately">გაცვლის ბუფერში ავტომატური კოპირება</string>
|
||||
@@ -111,20 +128,44 @@
|
||||
<string name="show_meta_data_summary">სკანირებულ შტრიხ-კოდებზე დამატებითი ინფორმაციის ჩვენება.</string>
|
||||
<string name="show_hex_dump">თექვსმეტობითი dump-ის ჩვენება</string>
|
||||
<string name="show_hex_dump_summary">სკანირებული შტრიხ-კოდის კონტენტის თექვსმეტობითი dump-ის ჩვენება.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<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="show_checksum">ჩვენება შემოწმება</string>
|
||||
<string name="no_checksum">გადამოსაშვები კოდი არ არის</string>
|
||||
<string name="show_recreation">აჩვენეთ აღდგენილი შტრიხკოდი</string>
|
||||
<string name="show_recreation_summary">ახელმძღვანე და გამოჩნდეს ბარკოდი წაკითხული შიგთავსიდან, თუ შესაძლებელია.</string>
|
||||
<string name="close_automatically">დაბრუნება შემდეგ დაკოპი/გაზიარებისას</string>
|
||||
<string name="close_automatically_summary">ავტომატურად დაბრუნება სკანირების ეკრანზე კოპირების ან გაზის შემთხვევაში.</string>
|
||||
<string name="default_search_engine">გახსნის უცნობი მონაცემები</string>
|
||||
<string name="always_ask">ყოველთვის კითხვა</string>
|
||||
<string name="open_with_url">უცნობი მონაცემების ამ ბმულის საშუალებით გახსნა</string>
|
||||
<string name="clear_network_suggestions">Remove network suggestions</string>
|
||||
|
||||
<string name="automated_actions">ავტომატური მოქმედებები</string>
|
||||
<string name="automated_actions_none">ავტომატური მოქმედებები არ არის</string>
|
||||
<string name="automated_actions_empty">ჯერ ავტომატური მოქმედებები არ არის</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d ავტომატური მოქმედება</item>
|
||||
<item quantity="other">%d ავტომატური მოქმედება</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">მოქმედების დამატება</string>
|
||||
<string name="automated_action_edit">მოქმედების რედაქტირება</string>
|
||||
<string name="automated_action_regex">რეგულარული გამოსახულება</string>
|
||||
<string name="automated_action_regex_hint">მაგ. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">რეგულარული გამოსახულება აუცილებელია</string>
|
||||
<string name="automated_action_regex_invalid">არასწორი რეგულარული გამოსახულება</string>
|
||||
<string name="automated_action_type">მოქმედების ტიპი</string>
|
||||
<string name="automated_action_type_intent">URL-ის გახსნა</string>
|
||||
<string name="automated_action_url_template">URL შაბლონი</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL შაბლონი აუცილებელია</string>
|
||||
<string name="automated_action_invalid_url">არასწორი URL შაბლონი</string>
|
||||
<string name="automated_action_remove_confirm">ამ მოქმედების წაშლა?</string>
|
||||
<string name="automated_action_list_intent">URL გახსნა: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL გახსნა</string>
|
||||
<string name="automated_action_webview_title">ავტომატური მოქმედება</string>
|
||||
<string name="clear_network_suggestions">ქსელის შეთანხმებების წაშლა</string>
|
||||
<string name="clear_network_suggestions_summary">Remove network suggestions that were previously added with this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
<string name="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="clear_network_suggestions_nothing_to_remove">არაფერი წასაშლელი არ არის</string>
|
||||
<string name="send_category">გადაგზავნა</string>
|
||||
<string name="send_scan_active">Forward scans</string>
|
||||
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
|
||||
@@ -138,14 +179,14 @@
|
||||
<string name="test_url">Test URL</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">ჰოსტი</string>
|
||||
<string name="no_bluetooth_hosts_paired">პარიები არ არის შემერთებული</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">თანამედროვე</string>
|
||||
<string name="brighten_screen">ეკრანის განანახლება</string>
|
||||
<string name="brighten_screen_summary">დააყენეთ სიკანის სკრინის სკანირების გაუმარტივებისთვის სიკანის სიმაღლე მაქსიმალურ დონეზე.</string>
|
||||
<string name="really_remove_scan">ნამდვილად გსურთ სკანირების წაშლა?</string>
|
||||
<string name="really_remove_all_scans">ნამდვილად გსურთ ყველაფრის წაშლა?</string>
|
||||
<string name="really_remove_selected_scans">ნამდვილად გსურთ შერჩეული შტრიხ-კოდების წაშლა?</string>
|
||||
@@ -179,8 +220,8 @@
|
||||
<string name="otpauth_add">დავამატოთ 2FA</string>
|
||||
<string name="search_web">ქსელში მოძებნა</string>
|
||||
<string name="search_scan">სკანირების ძიება</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">დაამატე ისტორიაში</string>
|
||||
<string name="added_to_history">დაემატა ისტორიაში</string>
|
||||
<string name="export_to_file">ექსპორტი ფაილში</string>
|
||||
<string name="export_as">შესანახი ფაილის ფორმატი</string>
|
||||
<string name="export_csv_comma">CSV (გამყოფი - მძიმე)</string>
|
||||
@@ -189,25 +230,39 @@
|
||||
<string name="export_database">SQLite მონაცემთა ბაზა</string>
|
||||
<string name="saved_in_downloads">შენახულია გადმოწერებში</string>
|
||||
<string name="rotate_image_cw">გამოსახულების შემობრუნება საათის ისრის მიხედვით</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">გადართეთ თავისუფლებითი როტაცია</string>
|
||||
<string name="pick_file">აირჩიეთ ფაილი</string>
|
||||
<string name="pick_image_file">აირჩიეთ ფაილი გამოსახულებით</string>
|
||||
<string name="pick_code_to_scan">აირჩიეთ შტრიხ-კოდი სკანირებისთვის</string>
|
||||
<string name="shortcut_decode">შტრიხ-კოდის სკანირება</string>
|
||||
<string name="shortcut_encode">შტრიხ-კოდის შექმნა</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">ისტორია</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>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</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>
|
||||
<string name="network_suggestions">ქსელის რჩევები</string>
|
||||
<string name="remove_suggestion">წაშალე წერილი</string>
|
||||
<string name="email_to">მიმღები</string>
|
||||
<string name="email_subject">თემა</string>
|
||||
<string name="email_body">შინაარსი</string>
|
||||
<string name="scheme">სქემა</string>
|
||||
<string name="host">ჰოსტი</string>
|
||||
<string name="query">კითხვა</string>
|
||||
<string name="automated_action_type_custom_intent">კონფიგურირებადი Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI შაბლონი</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI აუცილებელია</string>
|
||||
<string name="automated_action_intent_uri_invalid">არასწორი Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">კონფიგურირებადი Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">კონფიგურირებადი Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
<resources>
|
||||
<string name="welcome">환영합니다!</string>
|
||||
<string name="mode_expert">고급</string>
|
||||
<string name="mode_expert_description">읽은 내용을 확인하고 수동으로 열고 싶습니다.</string>
|
||||
<string name="mode_simple">간단</string>
|
||||
<string name="mode_simple_description">바코드를 스캔하고 즉시 열고 싶습니다.</string>
|
||||
<string name="camera_error">카메라를 접근할 수 없습니다. 다시 시도하세요</string>
|
||||
<string name="scan_code">Scan code</string>
|
||||
<string name="compose_barcode">Compose barcode</string>
|
||||
<string name="decode_barcode">Decode barcode</string>
|
||||
<string name="content">Content</string>
|
||||
<string name="binary_data">(binary data)</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="other">%2$d characters, %1$s</item>
|
||||
</plurals>
|
||||
@@ -13,200 +18,250 @@
|
||||
<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="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="label">라벨</string>
|
||||
<string name="colors">전경과 배경</string>
|
||||
<string name="colors_black_on_white">흰색에 검정색</string>
|
||||
<string name="colors_white_on_black">흰색 글자 검정색 배경</string>
|
||||
<string name="colors_black_on_transparent">투명한 배경 위의 검정색</string>
|
||||
<string name="colors_white_on_transparent">투명한 배경에 흰색</string>
|
||||
<string name="sequence_size">시퀀스 크기</string>
|
||||
<string name="sequence_index">시퀀스 인덱스</string>
|
||||
<string name="sequence_id">시퀀스 ID</string>
|
||||
<string name="gtin_issue_number">이슈번호</string>
|
||||
<string name="gtin_country">Possible country of manufacture</string>
|
||||
<string name="gtin_price">Suggested price</string>
|
||||
<string name="gtin_add_on">UPC EAN extension</string>
|
||||
<string name="gtin_country">제조 국가 가능성</string>
|
||||
<string name="gtin_price">제안 가격</string>
|
||||
<string name="gtin_add_on">UPC EAN 확장</string>
|
||||
<string name="barcode_version_number">버전</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="toggle_flash">Toggle flash</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="share">Share</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="copy_to_clipboard">Copy to clipboard</string>
|
||||
<string name="copied_to_clipboard">Copied to clipboard</string>
|
||||
<string name="copy_password">Copy password into clipboard</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="qr_data_mask">데이터 마스크</string>
|
||||
<string name="toggle_flash">플래시 전환</string>
|
||||
<string name="error_flash">플래시 전환 오류</string>
|
||||
<string name="share">공유</string>
|
||||
<string name="share_file">파일로 공유</string>
|
||||
<string name="share_as">공유할까요?</string>
|
||||
<string name="copy_to_clipboard">클립보드에 복사</string>
|
||||
<string name="copy_as_deeplink">딥링크로 복사</string>
|
||||
<string name="copied_to_clipboard">클립보드에 복사되었습니다</string>
|
||||
<string name="copy_password">클립보드에 비밀번호 복사</string>
|
||||
<string name="open_url">Open url</string>
|
||||
<string name="cannot_resolve_action">No application can open that</string>
|
||||
<string name="pick_search_engine">Pick a search engine</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="size_width_by_height">Size in pixels: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="input_content_here">Input content here</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="encode">ENCODE</string>
|
||||
<string name="error_no_content">Missing content</string>
|
||||
<string name="error_encoding_barcode">Barcode cannot be generated</string>
|
||||
<string name="view_barcode">View barcode</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="switch_camera">Switch camera</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="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</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">History</string>
|
||||
<string name="cannot_resolve_action">어떤 앱도 열 수 없습니다</string>
|
||||
<string name="pick_search_engine">검색 엔진을 선택하세요</string>
|
||||
<string name="format">형식</string>
|
||||
<string name="size_width_by_height">크기(픽셀): %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">확대하지 않음</string>
|
||||
<string name="add_quiet_zone">조용한 지역 추가</string>
|
||||
<string name="input_content_here">여기에 내용을 입력하세요</string>
|
||||
<string name="unescape">이스케이프 시퀀스 확장</string>
|
||||
<string name="encode">인코딩</string>
|
||||
<string name="error_no_content">내용이 없습니다</string>
|
||||
<string name="error_encoding_barcode">바코드를 생성할 수 없습니다</string>
|
||||
<string name="view_barcode">보기 바코드</string>
|
||||
<string name="info">정보</string>
|
||||
<string name="switch_camera">카메라 전환</string>
|
||||
<string name="bulk_mode">지속적으로 스캔</string>
|
||||
<string name="bulk_mode_summary">항상 지속적으로 스캔을 시작합니다.</string>
|
||||
<string name="bulk_mode_delay">연속 스캔 간의 지연</string>
|
||||
<string name="restrict_format">형식 제한</string>
|
||||
<string name="remove_restriction">제한 해제</string>
|
||||
<string name="find_code">코드 찾기</string>
|
||||
<string name="find_code_with_content">무슨 내용?</string>
|
||||
<string name="find_code_hint">용어 또는 정규 표현식</string>
|
||||
<string name="does_not_match_search_term">검색어와 일치하지 않음</string>
|
||||
<string name="scan_for">스캔 %s</string>
|
||||
<string name="quarter_second">0.25초</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">Preferences</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="show_crop_handle">Show cropping limiter</string>
|
||||
<string name="show_crop_handle_summary">Restrict scanning to a customizable region.</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="zoom_by_swiping">Swipe up/down to zoom</string>
|
||||
<string name="zoom_by_swiping_summary">Swipe up or down in camera screen to control the camera zoom.</string>
|
||||
<string name="auto_rotate">Recognize vertical 1D barcodes</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="try_harder">Optimize reader for accuracy</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="vibrate">Vibrate on detection</string>
|
||||
<string name="vibrate_summary">Enable this if you want your device to vibrate when a code is recognized.</string>
|
||||
<string name="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="use_history">Save scan history</string>
|
||||
<string name="use_history_summary">Save recognized codes on your device.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="scan_category">스캔</string>
|
||||
<string name="content_category">콘텐츠</string>
|
||||
<string name="locale_category">언어</string>
|
||||
<string name="profile_category">프로필</string>
|
||||
<string name="profile">프로필</string>
|
||||
<string name="profile_default">기본</string>
|
||||
<string name="profile_add">새 프로필 추가</string>
|
||||
<string name="profile_enter_name">프로필 이름 입력</string>
|
||||
<string name="profile_enter_name_hint">이름</string>
|
||||
<string name="profile_invalid_name">유효하지 않은 프로필 이름</string>
|
||||
<string name="profile_empty">아직 프로필 없음</string>
|
||||
<string name="profile_current">현재 프로필</string>
|
||||
<string name="profile_remove_confirm">이 프로필을 제거할까요?</string>
|
||||
<string name="current_profile">프로필: %s</string>
|
||||
<string name="custom_locale">사용자 정의 언어</string>
|
||||
<string name="follow_system_settings">시스템 설정 따르기</string>
|
||||
<string name="show_crop_handle">크롭 제한기 표시</string>
|
||||
<string name="show_crop_handle_summary">사용자 지정 가능한 영역으로 스캔을 제한합니다.</string>
|
||||
<string name="barcode_formats">바코드 형식</string>
|
||||
<string name="zoom_by_swiping">위아래로 스와이프하여 확대/축소</string>
|
||||
<string name="zoom_by_swiping_summary">카메라 화면에서 위 또는 아래로 스와이프하여 카메라 줌을 제어합니다.</string>
|
||||
<string name="auto_rotate">수직 1D 바코드를 인식합니다</string>
|
||||
<string name="auto_rotate_summary">카메라 프레임을 자동으로 회전하여 수직 1D 바코드를 인식합니다. 장치에 따라 성능에 영향을 줄 수 있습니다.</string>
|
||||
<string name="try_harder">정확성을 위해 리더를 최적화하십시오</string>
|
||||
<string name="try_harder_summary">이 옵션을 활성화하면 매우 읽기 어려운 코드에 영향을 미칠 수 있습니다. 성능에 영향을 줄 수 있습니다.</string>
|
||||
<string name="show_toast_in_bulk_mode">연속 모드로 데이터 표시</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">연속 스캔시 스캔된 데이터를 간단히 표시합니다.</string>
|
||||
<string name="vibrate">감지시 진동</string>
|
||||
<string name="vibrate_summary">코드가 인식될 때 기기가 진동하도록 하려면이 옵션을 활성화하십시오.</string>
|
||||
<string name="beep">감지 시 비프음</string>
|
||||
<string name="beep_summary">코드가 인식되면 장치에서 소리가 나게 하려면 이 기능을 활성화하세요.</string>
|
||||
<string name="beep_tone">소리</string>
|
||||
<string name="tone_cdma_confirm">CDMA 확인</string>
|
||||
<string name="tone_sup_confirm">통화 감독 확인</string>
|
||||
<string name="tone_sup_radio_ack">통화 감독 무선 경로 응답</string>
|
||||
<string name="tone_prop_ack">긍정적인 인식</string>
|
||||
<string name="tone_prop_beep">일반적인 비프음</string>
|
||||
<string name="tone_prop_beep2">일반 이중 비프음</string>
|
||||
<string name="use_history">스캔 기록 저장</string>
|
||||
<string name="use_history_summary">기기에 인식된 코드를 저장합니다.</string>
|
||||
<string name="ignore_duplicates">중복 무시</string>
|
||||
<string name="ignore_consecutive_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="open_immediately">Open immediately</string>
|
||||
<string name="open_immediately_summary">Skip inspection and open contents immediately. May open harmful content if enabled.</string>
|
||||
<string name="copy_immediately">Put into clipboard</string>
|
||||
<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_meta_data">Show metadata</string>
|
||||
<string name="show_meta_data_summary">Show additional data about the scanned barcode.</string>
|
||||
<string name="show_hex_dump">Show hex dump</string>
|
||||
<string name="show_hex_dump_summary">Show a hex dump of the scanned contents.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<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">Open unknown data with URL</string>
|
||||
<string name="clear_network_suggestions">Remove network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove network suggestions that were previously added with 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_active">Forward scans</string>
|
||||
<string name="accept_duplicates">중복 허용</string>
|
||||
<string name="open_immediately">즉시 열기</string>
|
||||
<string name="open_immediately_summary">검사를 건너뛰고 즉시 내용물을 엽니다. 활성화된 경우 유해한 내용물을 열 수 있습니다.</string>
|
||||
<string name="copy_immediately">클립보드에 복사하기</string>
|
||||
<string name="copy_immediately_summary">스캔한 내용을 자동으로 클립보드에 복사합니다. 다른 앱들이 백그라운드에서 당신의 클립보드를 엿볼 수도 있음을 주의하세요.</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="show_checksum">체크섬 표시</string>
|
||||
<string name="no_checksum">체크섬 없음</string>
|
||||
<string name="show_recreation">재생된 바코드 보기</string>
|
||||
<string name="show_recreation_summary">가능한 경우 읽은 내용에서 바코드를 재생성하고 표시합니다.</string>
|
||||
<string name="close_automatically">복사/공유 후로 돌아가기</string>
|
||||
<string name="close_automatically_summary">읽은 내용을 복사하거나 공유한 후 스캔 화면으로 자동으로 돌아갑니다.</string>
|
||||
<string name="default_search_engine">알 수 없는 데이터 열기:</string>
|
||||
<string name="always_ask">항상 물어보기</string>
|
||||
<string name="open_with_url">URL로 알려지지 않은 데이터 열기</string>
|
||||
|
||||
<string name="automated_actions">자동 작업</string>
|
||||
<string name="automated_actions_none">자동 작업 없음</string>
|
||||
<string name="automated_actions_empty">아직 자동 작업 없음</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d개의 자동 작업</item>
|
||||
<item quantity="other">%d개의 자동 작업</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">작업 추가</string>
|
||||
<string name="automated_action_edit">작업 편집</string>
|
||||
<string name="automated_action_regex">정규식</string>
|
||||
<string name="automated_action_regex_hint">예: ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">정규식이 필요합니다</string>
|
||||
<string name="automated_action_regex_invalid">잘못된 정규식입니다</string>
|
||||
<string name="automated_action_type">작업 유형</string>
|
||||
<string name="automated_action_type_intent">URL 열기</string>
|
||||
<string name="automated_action_url_template">URL 템플릿</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL 템플릿이 필요합니다</string>
|
||||
<string name="automated_action_invalid_url">잘못된 URL 템플릿입니다</string>
|
||||
<string name="automated_action_remove_confirm">이 작업을 제거할까요?</string>
|
||||
<string name="automated_action_list_intent">URL 열기: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL 열기</string>
|
||||
<string name="automated_action_webview_title">자동 작업</string>
|
||||
<string name="clear_network_suggestions">네트워크 제안 사항 제거</string>
|
||||
<string name="clear_network_suggestions_summary">이 앱을 통해 이전에 추가된 네트워크 제안을 제거합니다.</string>
|
||||
<string name="really_remove_all_networks">모든 네트워크를 정말로 삭제하시겠습니까?</string>
|
||||
<string name="clear_network_suggestions_success">네트워크 제안이 지워졌습니다</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">삭제할 항목이 없습니다</string>
|
||||
<string name="send_category">전달</string>
|
||||
<string name="send_scan_active">전달 스캔</string>
|
||||
<string name="send_scan_active_summary">Enable to forward scans to a the given URL.</string>
|
||||
<string name="send_scan_url">URL to forward to</string>
|
||||
<string name="send_scan_type">Request type</string>
|
||||
<string name="send_type_get_add_content">GET and simply add content</string>
|
||||
<string name="send_type_get_query_string">GET with complete query string</string>
|
||||
<string name="send_scan_url">전달 할 URL</string>
|
||||
<string name="send_scan_type">요청 유형</string>
|
||||
<string name="send_type_get_add_content">GET 및 간단히 콘텐츠 추가</string>
|
||||
<string name="send_type_get_query_string">전체 쿼리 문자열이 포함된 GET</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Open in external browser</string>
|
||||
<string name="test_url">Test URL</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_type_external_browser">외부 브라우저에서 열기</string>
|
||||
<string name="test_url">테스트 URL</string>
|
||||
<string name="send_scan_bluetooth">블루투스로 스캔 전송</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">호스트</string>
|
||||
<string name="no_bluetooth_hosts_paired">연결된 호스트가 없습니다</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="really_remove_scan">Really remove scan?</string>
|
||||
<string name="really_remove_all_scans">Really remove all scans?</string>
|
||||
<string name="really_remove_selected_scans">Really remove selected scans?</string>
|
||||
<string name="clear_history">Clear history</string>
|
||||
<string name="copy_scan">Copy scan</string>
|
||||
<string name="edit_label">Edit label</string>
|
||||
<string name="remove_scan">Remove scan</string>
|
||||
<string name="enter_name">Enter a name to describe the scan</string>
|
||||
<string name="enter_name_hint">Name of the scan</string>
|
||||
<string name="no_barcode_found">No barcode found</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="generation_category">세대</string>
|
||||
<string name="brighten_screen">화면 밝기 높이기</string>
|
||||
<string name="brighten_screen_summary">화면에서 바코드를 스캔하기 위해 밝기를 최대로 설정합니다.</string>
|
||||
<string name="really_remove_scan">정말 스캔을 삭제 하시겠습니까?</string>
|
||||
<string name="really_remove_all_scans">모든 스캔을 정말로 삭제 하시겠습니까?</string>
|
||||
<string name="really_remove_selected_scans">선택한 스캔을 정말로 삭제 하시겠습니까?</string>
|
||||
<string name="clear_history">기록 지우기</string>
|
||||
<string name="copy_scan">복사 스캔</string>
|
||||
<string name="edit_label">레이블 편집</string>
|
||||
<string name="remove_scan">스캔 제거</string>
|
||||
<string name="enter_name">스캔을 설명할 이름을 입력하세요</string>
|
||||
<string name="enter_name_hint">스캔 이름</string>
|
||||
<string name="no_barcode_found">바코드를 찾을 수 없습니다</string>
|
||||
<string name="pick_list_separator">리스트 항목을 어떻게 구분하시겠습니까?</string>
|
||||
<string name="separator_line_break">줄 바꿈</string>
|
||||
<string name="separator_ruler">자</string>
|
||||
<string name="save_as_file_name">Save as in Downloads 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="file_name">파일 이름</string>
|
||||
<string name="error_saving_file">파일을 저장할 수 없습니다</string>
|
||||
<string name="error_file_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="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="export_to_file">Export to file</string>
|
||||
<string name="export_as">Export as?</string>
|
||||
<string name="export_csv_comma">CSV file with commas</string>
|
||||
<string name="export_csv_semicolon">CSV file with semicolons</string>
|
||||
<string name="export_json">JSON file</string>
|
||||
<string name="export_database">SQLite database</string>
|
||||
<string name="saved_in_downloads">Saved in downloads</string>
|
||||
<string name="rotate_image_cw">Rotate image clockwise</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="pick_image_file">Pick image file</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="add_to_history">히스토리에 추가</string>
|
||||
<string name="added_to_history">역사에 추가되었습니다</string>
|
||||
<string name="export_to_file">파일로 내보내기</string>
|
||||
<string name="export_as">내보내기?</string>
|
||||
<string name="export_csv_comma">쉼표가 있는 CSV 파일</string>
|
||||
<string name="export_csv_semicolon">세미콜론으로 구분된 CSV 파일</string>
|
||||
<string name="export_json">JSON 파일</string>
|
||||
<string name="export_database">SQLite 데이터베이스</string>
|
||||
<string name="saved_in_downloads">다운로드에 저장되었습니다</string>
|
||||
<string name="rotate_image_cw">이미지를 시계 방향으로 회전</string>
|
||||
<string name="toggle_free_rotation">자유 회전 전환</string>
|
||||
<string name="pick_file">파일 선택</string>
|
||||
<string name="pick_image_file">이미지 파일 선택</string>
|
||||
<string name="pick_code_to_scan">Pick code to scan</string>
|
||||
<string name="shortcut_decode">Scan a barcode</string>
|
||||
<string name="shortcut_encode">Create a barcode</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_preferences">Settings</string>
|
||||
<string name="background_request_failed">Background request failed</string>
|
||||
<string name="entry_type">Type</string>
|
||||
<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>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="shortcut_decode">바코드를 스캔합니다</string>
|
||||
<string name="shortcut_encode">바코드 만들기</string>
|
||||
<string name="shortcut_history">연혁</string>
|
||||
<string name="shortcut_preferences">설정</string>
|
||||
<string name="background_request_failed">백그라운드 요청 실패</string>
|
||||
<string name="entry_type">유형</string>
|
||||
<string name="wifi_network">무선 네트워크</string>
|
||||
<string name="wifi_ssid">이름</string>
|
||||
<string name="wifi_type">인증 유형</string>
|
||||
<string name="wifi_password">암호</string>
|
||||
<string name="wifi_hidden">숨겨진 네트워크</string>
|
||||
<string name="wifi_eap">EAP 방식</string>
|
||||
<string name="wifi_anonymous_identity">익명 신분</string>
|
||||
<string name="wifi_identity">정체성</string>
|
||||
<string name="wifi_phase2">단계 2 방법</string>
|
||||
<string name="network_suggestions">네트워크 제안</string>
|
||||
<string name="remove_suggestion">건의 사항 삭제</string>
|
||||
<string name="email_to">받는 사람</string>
|
||||
<string name="email_subject">제목</string>
|
||||
<string name="email_body">본문</string>
|
||||
<string name="scheme">스키마</string>
|
||||
<string name="host">호스트</string>
|
||||
<string name="query">쿼리</string>
|
||||
<string name="automated_action_type_custom_intent">맞춤 Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI 템플릿</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI가 필요합니다</string>
|
||||
<string name="automated_action_intent_uri_invalid">잘못된 Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">맞춤 Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">맞춤 Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Welkom!</string>
|
||||
<string name="mode_expert">Geavanceerd</string>
|
||||
<string name="mode_expert_description">Ik wil de gelezen inhoud controleren en handmatig openen.</string>
|
||||
<string name="mode_simple">Eenvoudig</string>
|
||||
<string name="mode_simple_description">Ik wil gewoon barcodes scannen en direct openen.</string>
|
||||
<string name="camera_error">Geen toegang tot camera, probeer opnieuw.</string>
|
||||
<string name="scan_code">Scan een code</string>
|
||||
<string name="compose_barcode">Barcode scannen</string>
|
||||
@@ -15,54 +20,55 @@
|
||||
<string name="error_correction_level_q" formatted="false">Kwartiel (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Hoog (~30% correction)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="colors">Voor- en achtergrond</string>
|
||||
<string name="colors_black_on_white">Zwart op wit</string>
|
||||
<string name="colors_white_on_black">Wit op zwart</string>
|
||||
<string name="colors_black_on_transparent">Zwart op transparant</string>
|
||||
<string name="colors_white_on_transparent">Wit op transparant</string>
|
||||
<string name="sequence_size">Sequentiegrootte</string>
|
||||
<string name="sequence_index">Volgorde index</string>
|
||||
<string name="sequence_id">Sequentie-ID</string>
|
||||
<string name="gtin_issue_number">Uitgiftenummer</string>
|
||||
<string name="gtin_country">Mogelijk land van fabricage</string>
|
||||
<string name="gtin_price">Adviesprijs</string>
|
||||
<string name="gtin_add_on">UPC EAN extensie</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="barcode_version_number">Versie</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Gegevensmasker</string>
|
||||
<string name="toggle_flash">Zaklamp aan/uit</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="error_flash">Fout bij het wisselen van flits</string>
|
||||
<string name="share">Delen</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">Delen als bestand</string>
|
||||
<string name="share_as">Delen als?</string>
|
||||
<string name="copy_to_clipboard">Naar klembord kopiëren</string>
|
||||
<string name="copy_as_deeplink">Kopieer als deeplink</string>
|
||||
<string name="copied_to_clipboard">Naar klembord gekopieerd</string>
|
||||
<string name="copy_password">Kopieer wachtwoord naar klembord</string>
|
||||
<string name="copied_password_to_clipboard">Wachtwoord gekopieerd naar klembord</string>
|
||||
<string name="open_url">URL openen</string>
|
||||
<string name="cannot_resolve_action">Geen enkele toepassing kan dat openen</string>
|
||||
<string name="pick_search_engine">Zoekmachine kiezen</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="format">Formaat</string>
|
||||
<string name="size_width_by_height">Afmeting in pixels: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Geen vergroting</string>
|
||||
<string name="add_quiet_zone">Voeg stille zone toe</string>
|
||||
<string name="input_content_here">Voer hier de inhoud in</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">Escape-reeksen uitbreiden</string>
|
||||
<string name="encode">Coderen</string>
|
||||
<string name="error_no_content">Inhoud ontbreekt</string>
|
||||
<string name="error_encoding_barcode">Kan geen barcode aanmaken</string>
|
||||
<string name="view_barcode">Barcode bekijken</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="info">Informatie</string>
|
||||
<string name="switch_camera">Camera wisselen</string>
|
||||
<string name="bulk_mode">Continu scannen</string>
|
||||
<string name="bulk_mode_summary">Begin altijd continu te scannen</string>
|
||||
<string name="bulk_mode_delay">Vertraging tussen ononderbroken scans</string>
|
||||
<string name="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="restrict_format">Beperk formaat</string>
|
||||
<string name="remove_restriction">Verwijder beperking</string>
|
||||
<string name="find_code">Vind code</string>
|
||||
<string name="find_code_with_content">Wat voor inhoud?</string>
|
||||
<string name="find_code_hint">Zoekterm of reguliere expressie</string>
|
||||
<string name="does_not_match_search_term">Komt niet overeen met zoekterm</string>
|
||||
<string name="scan_for">Scan %s</string>
|
||||
<string name="quarter_second">¼ seconde</string>
|
||||
<string name="half_second">½ seconde</string>
|
||||
<string name="a_second">1 seconde</string>
|
||||
@@ -73,11 +79,22 @@
|
||||
<string name="scan_category">Scannen</string>
|
||||
<string name="content_category">Inhoud</string>
|
||||
<string name="locale_category">Taal</string>
|
||||
<string name="profile_category">Profiel</string>
|
||||
<string name="profile">Profiel</string>
|
||||
<string name="profile_default">Standaard</string>
|
||||
<string name="profile_add">Nieuw profiel toevoegen</string>
|
||||
<string name="profile_enter_name">Voer profielnaam in</string>
|
||||
<string name="profile_enter_name_hint">Naam</string>
|
||||
<string name="profile_invalid_name">Ongeldige profielnaam</string>
|
||||
<string name="profile_empty">Nog geen profielen</string>
|
||||
<string name="profile_current">Huidig profiel</string>
|
||||
<string name="profile_remove_confirm">Dit profiel verwijderen?</string>
|
||||
<string name="current_profile">Profiel: %s</string>
|
||||
<string name="custom_locale">Taal instelling</string>
|
||||
<string name="follow_system_settings">Systeeminstellingen volgen</string>
|
||||
<string name="show_crop_handle">Bijsnijd-begrenzer tonen</string>
|
||||
<string name="show_crop_handle_summary">Scannen beperken tot een aanpasbaar gebied</string>
|
||||
<string name="barcode_formats">Barcode formats</string>
|
||||
<string name="barcode_formats">Barcode formaten</string>
|
||||
<string name="zoom_by_swiping">Camera zoomen door omhoog/omlaag te vegen</string>
|
||||
<string name="zoom_by_swiping_summary">De zoom van de camera bedienen door in het camerascherm omhoog of omlaag te vegen.</string>
|
||||
<string name="auto_rotate">1D-barcodes verticaal herkennen</string>
|
||||
@@ -88,21 +105,21 @@
|
||||
<string name="show_toast_in_bulk_mode_summary">Kort de gescande gegevens tonen bij continu scannen.</string>
|
||||
<string name="vibrate">Trillen bij herkennen</string>
|
||||
<string name="vibrate_summary">Schakel dit in als u wilt dat uw toestel trilt wanneer een code wordt herkend.</string>
|
||||
<string name="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="beep">Piep bij detectie</string>
|
||||
<string name="beep_summary">Schakel dit in als je wilt dat je apparaat piept wanneer een code wordt herkend.</string>
|
||||
<string name="beep_tone">Pieptoon</string>
|
||||
<string name="tone_cdma_confirm">CDMA bevestigen</string>
|
||||
<string name="tone_sup_confirm">Beltoezicht bevestigen</string>
|
||||
<string name="tone_sup_radio_ack">Oproep toezichtradio pad bevestiging</string>
|
||||
<string name="tone_prop_ack">Positieve bevestiging</string>
|
||||
<string name="tone_prop_beep">Algemene piep</string>
|
||||
<string name="tone_prop_beep2">Algemene dubbele piep</string>
|
||||
<string name="use_history">Scancodes bewaren</string>
|
||||
<string name="use_history_summary">Bewaar herkende codes op je toestel.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Negeer duplicaten</string>
|
||||
<string name="ignore_consecutive_duplicates">Duplicaten negeren</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Accepteer duplicaten</string>
|
||||
<string name="open_immediately">Inhoud direct tonen, zonder inspectie</string>
|
||||
<string name="open_immediately_summary">Sla inspectie over en open meteen de inhoud. Indien geactiveerd, kan schadelijke inhoud worden geopend.</string>
|
||||
<string name="copy_immediately">Meteen op klembord zetten</string>
|
||||
@@ -111,41 +128,65 @@
|
||||
<string name="show_meta_data_summary">Toon extra gegevens over de gescande barcode.</string>
|
||||
<string name="show_hex_dump">Hex-dump tonen</string>
|
||||
<string name="show_hex_dump_summary">Hex-dump van de gescande inhoud tonen.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="show_checksum">Toon checksum</string>
|
||||
<string name="no_checksum">Geen checksum</string>
|
||||
<string name="show_recreation">Toon gereconstrueerde barcode</string>
|
||||
<string name="show_recreation_summary">Recreëren en de barcode tonen van de gelezen inhoud indien mogelijk.</string>
|
||||
<string name="close_automatically">Teruggaan na kopiëren/delen</string>
|
||||
<string name="close_automatically_summary">Automatisch terugkeren naar het scanscherm na het kopiëren of delen van de gelezen inhoud.</string>
|
||||
<string name="default_search_engine">Onbekende data openen in</string>
|
||||
<string name="always_ask">Altijd vragen</string>
|
||||
<string name="open_with_url">URL om niet bekende data te openen</string>
|
||||
|
||||
<string name="automated_actions">Geautomatiseerde acties</string>
|
||||
<string name="automated_actions_none">Geen geautomatiseerde acties</string>
|
||||
<string name="automated_actions_empty">Nog geen geautomatiseerde acties</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d geautomatiseerde actie</item>
|
||||
<item quantity="other">%d geautomatiseerde acties</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Actie toevoegen</string>
|
||||
<string name="automated_action_edit">Actie bewerken</string>
|
||||
<string name="automated_action_regex">Regex</string>
|
||||
<string name="automated_action_regex_hint">bijv. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regex vereist</string>
|
||||
<string name="automated_action_regex_invalid">Ongeldige regex</string>
|
||||
<string name="automated_action_type">Type actie</string>
|
||||
<string name="automated_action_type_intent">URL openen</string>
|
||||
<string name="automated_action_url_template">URL-sjabloon</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL-sjabloon vereist</string>
|
||||
<string name="automated_action_invalid_url">Ongeldig URL-sjabloon</string>
|
||||
<string name="automated_action_remove_confirm">Deze actie verwijderen?</string>
|
||||
<string name="automated_action_list_intent">URL openen: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL openen</string>
|
||||
<string name="automated_action_webview_title">Geautomatiseerde actie</string>
|
||||
<string name="clear_network_suggestions">Network suggesties wissen</string>
|
||||
<string name="clear_network_suggestions_summary">Verwijder alle netwerksuggesties die eerder door deze app werden gegeven.</string>
|
||||
<string name="really_remove_all_networks">Echt alle netwerken verwijderen?</string>
|
||||
<string name="clear_network_suggestions_success">Netwerksuggesties gewist</string>
|
||||
<string name="clear_network_suggestions_nothing_to_remove">Niets te wissen</string>
|
||||
<string name="send_category">Doorsturen</string>
|
||||
<string name="send_scan_active">Forward scans</string>
|
||||
<string name="send_scan_active">Stuur scans door</string>
|
||||
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</string>
|
||||
<string name="send_scan_url">Stuur elke scan naar URL</string>
|
||||
<string name="send_scan_type">Type aanvraag voor elke scan</string>
|
||||
<string name="send_type_get_add_content">GET en gewoon inhoud toevoegen</string>
|
||||
<string name="send_type_get_query_string">GET met volledige query string</string>
|
||||
<string name="send_type_post_form">POST toepassing/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST toepassing/json</string>
|
||||
<string name="send_type_external_browser">Open in external browser</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Openen in externe browser</string>
|
||||
<string name="test_url">Test URL</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">Stuur scans door met Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="no_bluetooth_hosts_paired">Geen hosts gekoppeld</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Generatie</string>
|
||||
<string name="brighten_screen">Helderheid scherm verhogen</string>
|
||||
<string name="brighten_screen_summary">Stel de helderheid in op maximaal om het scannen van een streepjescode van het scherm te verbeteren.</string>
|
||||
<string name="really_remove_scan">Scan echt verwijderen?</string>
|
||||
<string name="really_remove_all_scans">Alle scans echt verwijderen?</string>
|
||||
<string name="really_remove_selected_scans">Geselecteerde scans verwijderen?</string>
|
||||
@@ -179,23 +220,23 @@
|
||||
<string name="otpauth_add">2FA toevoegen</string>
|
||||
<string name="search_web">Zoeken op internet</string>
|
||||
<string name="search_scan">Scan op internet zoeken</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Toevoegen aan geschiedenis</string>
|
||||
<string name="added_to_history">Toegevoegd aan geschiedenis</string>
|
||||
<string name="export_to_file">Uitvoer naar bestand</string>
|
||||
<string name="export_as">Exporteren als?</string>
|
||||
<string name="export_csv_comma">CSV bestand met komma\'s</string>
|
||||
<string name="export_csv_semicolon">CSV bestand met puntkomma\'s</string>
|
||||
<string name="export_json">JSON bestand</string>
|
||||
<string name="export_database">SQLite database</string>
|
||||
<string name="export_database">SQLite-database</string>
|
||||
<string name="saved_in_downloads">Opgeslagen in downloads</string>
|
||||
<string name="rotate_image_cw">Afbeelding rechtsom draaien</string>
|
||||
<string name="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">Schakel vrije rotatie in/uit</string>
|
||||
<string name="pick_file">Kies een bestand</string>
|
||||
<string name="pick_image_file">Beeldbestand kiezen</string>
|
||||
<string name="pick_code_to_scan">Kies code om te scannen</string>
|
||||
<string name="shortcut_decode">Een barcode scannen</string>
|
||||
<string name="shortcut_encode">Een barcode aanmaken</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Geschiedenis</string>
|
||||
<string name="shortcut_preferences">Voorkeuren</string>
|
||||
<string name="background_request_failed">Achtergrondverzoek mislukt</string>
|
||||
<string name="entry_type">Type</string>
|
||||
@@ -208,6 +249,20 @@
|
||||
<string name="wifi_anonymous_identity">Anonieme identiteit</string>
|
||||
<string name="wifi_identity">Identiteit</string>
|
||||
<string name="wifi_phase2">Phase 2 methode</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="network_suggestions">Netwerksuggesties</string>
|
||||
<string name="remove_suggestion">Verwijder suggestie</string>
|
||||
<string name="email_to">Ontvanger</string>
|
||||
<string name="email_subject">Onderwerp</string>
|
||||
<string name="email_body">Bericht</string>
|
||||
<string name="scheme">Regeling</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="query">Query</string>
|
||||
<string name="automated_action_type_custom_intent">Aangepaste intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent-URI-sjabloon</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent-URI vereist</string>
|
||||
<string name="automated_action_intent_uri_invalid">Ongeldige Intent-URI</string>
|
||||
<string name="automated_action_list_custom_intent">Aangepaste intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Aangepaste intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
<resources>
|
||||
<string name="welcome">Witamy!</string>
|
||||
<string name="mode_expert">Zaawansowany</string>
|
||||
<string name="mode_expert_description">Chcę sprawdzić odczytaną treść i otworzyć ją ręcznie.</string>
|
||||
<string name="mode_simple">Prosty</string>
|
||||
<string name="mode_simple_description">Chcę tylko skanować kody kreskowe i otwierać je natychmiast.</string>
|
||||
<string name="open_url">Otwórz URL</string>
|
||||
<string name="content">Zawartość</string>
|
||||
<string name="copied_to_clipboard">Skopiowano do schowka</string>
|
||||
<string name="copy_to_clipboard">Skopiuj do schowka</string>
|
||||
<string name="copy_as_deeplink">Kopiuj jako link bezpośredni</string>
|
||||
<string name="info">Informacje</string>
|
||||
<string name="vcard_add">Dodaj do kontaktów</string>
|
||||
<string name="vevent_add">Dodaj do kalendarza</string>
|
||||
@@ -90,10 +96,11 @@
|
||||
<string name="bulk_mode_delay">Opóźnienie między kolejnymi skanami</string>
|
||||
<string name="restrict_format">Ogranicz format</string>
|
||||
<string name="remove_restriction">Usuń ograniczenie</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Skan %s</string>
|
||||
<string name="find_code">Znajdź kod</string>
|
||||
<string name="find_code_with_content">Jaki treść?</string>
|
||||
<string name="find_code_hint">Termin lub wyrażenie regularne</string>
|
||||
<string name="does_not_match_search_term">Nie pasuje do wyszukiwania</string>
|
||||
<string name="scan_for">Skan %s</string>
|
||||
<string name="quarter_second">Ćwierć sekundy</string>
|
||||
<string name="half_second">Pół sekundy</string>
|
||||
<string name="a_second">Sekunda</string>
|
||||
@@ -140,6 +147,32 @@
|
||||
<string name="default_search_engine">Otwórz nieznane dane w</string>
|
||||
<string name="always_ask">Zawsze pytaj</string>
|
||||
<string name="open_with_url">Otwieraj nieznane dane za pomocą adresu URL</string>
|
||||
|
||||
<string name="automated_actions">Automatyczne akcje</string>
|
||||
<string name="automated_actions_none">Brak automatycznych akcji</string>
|
||||
<string name="automated_actions_empty">Brak jeszcze automatycznych akcji</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d automatyczna akcja</item>
|
||||
<item quantity="few">%d automatyczne akcje</item>
|
||||
<item quantity="many">%d automatycznych akcji</item>
|
||||
<item quantity="other">%d automatyczne akcje</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Dodaj akcję</string>
|
||||
<string name="automated_action_edit">Edytuj akcję</string>
|
||||
<string name="automated_action_regex">Wyrażenie regularne</string>
|
||||
<string name="automated_action_regex_hint">np. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Wyrażenie regularne jest wymagane</string>
|
||||
<string name="automated_action_regex_invalid">Nieprawidłowe wyrażenie regularne</string>
|
||||
<string name="automated_action_type">Typ akcji</string>
|
||||
<string name="automated_action_type_intent">Otwórz URL</string>
|
||||
<string name="automated_action_url_template">Szablon URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Szablon URL jest wymagany</string>
|
||||
<string name="automated_action_invalid_url">Nieprawidłowy szablon URL</string>
|
||||
<string name="automated_action_remove_confirm">Usunąć tę akcję?</string>
|
||||
<string name="automated_action_list_intent">Otwórz URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Otwórz URL</string>
|
||||
<string name="automated_action_webview_title">Automatyczna akcja</string>
|
||||
<string name="clear_network_suggestions">Wyczyść sugestie z sieci</string>
|
||||
<string name="clear_network_suggestions_summary">Usuń wszystkie sugestie z sieci, które były wcześniej dostarczane przez tę aplikację.</string>
|
||||
<string name="really_remove_all_networks">Naprawdę usunąć wszystkie sieci?</string>
|
||||
@@ -158,28 +191,38 @@
|
||||
<string name="test_url">Testuj URL</string>
|
||||
<string name="send_scan_bluetooth">Przekazuj skany za pomocą Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="send_scan_bluetooth_host">Gospodarz</string>
|
||||
<string name="no_bluetooth_hosts_paired">Brak sparowanych hostów</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Pokolenie</string>
|
||||
<string name="brighten_screen">Rozjaśnić ekran</string>
|
||||
<string name="brighten_screen_summary">Ustaw jasność na maksimum, aby ułatwić skanowanie kodu kreskowego z ekranu.</string>
|
||||
<string name="copy_password">Skopiuj hasło do schowka</string>
|
||||
<string name="copied_password_to_clipboard">Hasło skopiowane do schowka</string>
|
||||
<string name="gtin_price">Sugerowana cena</string>
|
||||
<string name="preferences">Ustawienia</string>
|
||||
<string name="scan_category">Skanowanie</string>
|
||||
<string name="content_category">Zawarość</string>
|
||||
<string name="locale_category">Język</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Domyślny</string>
|
||||
<string name="profile_add">Dodaj nowy profil</string>
|
||||
<string name="profile_enter_name">Wprowadź nazwę profilu</string>
|
||||
<string name="profile_enter_name_hint">Nazwa</string>
|
||||
<string name="profile_invalid_name">Nieprawidłowa nazwa profilu</string>
|
||||
<string name="profile_empty">Brak profili</string>
|
||||
<string name="profile_current">Bieżący profil</string>
|
||||
<string name="profile_remove_confirm">Usunąć ten profil?</string>
|
||||
<string name="current_profile">Profil: %s</string>
|
||||
<string name="custom_locale">Język niestandardowy</string>
|
||||
<string name="follow_system_settings">Zgodny z ustawieniami systemu</string>
|
||||
<string name="decode_barcode">Dekoduj kod kreskowy</string>
|
||||
<string name="gtin_add_on">Dodatek UPC EAN</string>
|
||||
<string name="barcode_version_number">Wersja</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Maska danych</string>
|
||||
<string name="gtin_country">Możliwy kraj produkcji</string>
|
||||
<string name="encode">ZAKODUJ</string>
|
||||
<string name="error_no_content">Brak zawartości</string>
|
||||
@@ -189,8 +232,8 @@
|
||||
<string name="show_toast_in_bulk_mode_summary">Zwięźle pokazuje zeskanowane dane podczas skanowania ciągłego.</string>
|
||||
<string name="cannot_resolve_action">Żadna aplikacja nie może tego otworzyć</string>
|
||||
<string name="size_width_by_height">Rozmiar w pikselach: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Bez powiększenia</string>
|
||||
<string name="add_quiet_zone">Dodaj strefę cichą</string>
|
||||
<string name="input_content_here">Wprowadź zawartość tutaj</string>
|
||||
<string name="unescape">Rozwiń sekwencje ucieczki</string>
|
||||
<string name="pick_list_separator">Jak oddzielić elementy listy?</string>
|
||||
@@ -210,6 +253,20 @@
|
||||
<string name="wifi_anonymous_identity">Anonimowa tożsamość</string>
|
||||
<string name="wifi_identity">Tożsamość</string>
|
||||
<string name="wifi_phase2">Metoda fazy 2</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="network_suggestions">Sugestie sieci</string>
|
||||
<string name="remove_suggestion">Usuń sugestię</string>
|
||||
<string name="email_to">Odbiorca</string>
|
||||
<string name="email_subject">Temat</string>
|
||||
<string name="email_body">Treść</string>
|
||||
<string name="scheme">Schemat</string>
|
||||
<string name="host">Gospodarz</string>
|
||||
<string name="query">Zapytanie</string>
|
||||
<string name="automated_action_type_custom_intent">Niestandardowy Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Szablon URI Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI Intent jest wymagany</string>
|
||||
<string name="automated_action_intent_uri_invalid">Nieprawidłowy URI Intent</string>
|
||||
<string name="automated_action_list_custom_intent">Niestandardowy Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Niestandardowy Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Bem-vindo!</string>
|
||||
<string name="mode_expert">Avançado</string>
|
||||
<string name="mode_expert_description">Quero verificar o conteúdo lido e abri-lo manualmente.</string>
|
||||
<string name="mode_simple">Simples</string>
|
||||
<string name="mode_simple_description">Quero apenas ler códigos de barras e abri-los imediatamente.</string>
|
||||
<string name="camera_error">Não foi possível acessar a câmera, tente novamente</string>
|
||||
<string name="scan_code">Escanear código</string>
|
||||
<string name="compose_barcode">Compor código de barras</string>
|
||||
@@ -7,6 +13,7 @@
|
||||
<string name="binary_data">(dados em binário)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d caractere, %1$s</item>
|
||||
<item quantity="many">%2$d de characters, %1$s</item>
|
||||
<item quantity="other">%2$d caracteres, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Nível de correção de erro</string>
|
||||
@@ -29,23 +36,23 @@
|
||||
<string name="gtin_add_on">Extensão UPC EAN</string>
|
||||
<string name="barcode_version_number">Versão</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d módulos)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Máscara de dados</string>
|
||||
<string name="toggle_flash">Ligar lanterna</string>
|
||||
<string name="error_flash">Falha ao ligar a lanterna</string>
|
||||
<string name="share">Compartilhar</string>
|
||||
<string name="share_file">Compartilhar como arquivo</string>
|
||||
<string name="share_as">Compartilhar como?</string>
|
||||
<string name="copy_to_clipboard">Copiar para a área de transferência</string>
|
||||
<string name="copy_as_deeplink">Copiar como link direto</string>
|
||||
<string name="copied_to_clipboard">Copiado para a área de transferência</string>
|
||||
<string name="copy_password">Copiar senha para a área de transferência</string>
|
||||
<string name="copied_password_to_clipboard">Senha copiada para a área de transferência</string>
|
||||
<string name="open_url">Abrir URL</string>
|
||||
<string name="cannot_resolve_action">Nenhum app pode abrir isto</string>
|
||||
<string name="pick_search_engine">Escolha um motor de pesquisa</string>
|
||||
<string name="format">Formato</string>
|
||||
<string name="size_width_by_height">Tamanho em pixels: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Sem magnificação</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="add_quiet_zone">Adicionar zona tranquila</string>
|
||||
<string name="input_content_here">Digite algum conteúdo aqui</string>
|
||||
<string name="unescape">Expandir sequências de escape</string>
|
||||
<string name="encode">CODIFICAR</string>
|
||||
@@ -59,10 +66,11 @@
|
||||
<string name="bulk_mode_delay">Espera entre digitalizações contínuas</string>
|
||||
<string name="restrict_format">Restringir formato</string>
|
||||
<string name="remove_restriction">Remover restrição</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Digitalizar %s</string>
|
||||
<string name="find_code">Encontrar código</string>
|
||||
<string name="find_code_with_content">Qual conteúdo?</string>
|
||||
<string name="find_code_hint">Termo ou expressão regular</string>
|
||||
<string name="does_not_match_search_term">Não corresponde ao termo de busca</string>
|
||||
<string name="scan_for">Digitalizar %s</string>
|
||||
<string name="quarter_second">Um quarto de segundo</string>
|
||||
<string name="half_second">Meio segundo</string>
|
||||
<string name="a_second">Um segundo</string>
|
||||
@@ -73,6 +81,17 @@
|
||||
<string name="scan_category">Digitalização</string>
|
||||
<string name="content_category">Conteúdo</string>
|
||||
<string name="locale_category">Idioma</string>
|
||||
<string name="profile_category">Perfil</string>
|
||||
<string name="profile">Perfil</string>
|
||||
<string name="profile_default">Padrão</string>
|
||||
<string name="profile_add">Adicionar novo perfil</string>
|
||||
<string name="profile_enter_name">Insira o nome do perfil</string>
|
||||
<string name="profile_enter_name_hint">Nome</string>
|
||||
<string name="profile_invalid_name">Nome de perfil inválido</string>
|
||||
<string name="profile_empty">Nenhum perfil ainda</string>
|
||||
<string name="profile_current">Perfil atual</string>
|
||||
<string name="profile_remove_confirm">Remover este perfil?</string>
|
||||
<string name="current_profile">Perfil: %s</string>
|
||||
<string name="custom_locale">Idioma customizado</string>
|
||||
<string name="follow_system_settings">Seguir configurações do sistema</string>
|
||||
<string name="show_crop_handle">Mostrar limitador customizável</string>
|
||||
@@ -120,6 +139,30 @@
|
||||
<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="automated_actions">Ações automatizadas</string>
|
||||
<string name="automated_actions_none">Nenhuma ação automatizada</string>
|
||||
<string name="automated_actions_empty">Ainda não há ações automatizadas</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d ação automatizada</item>
|
||||
<item quantity="other">%d ações automatizadas</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Adicionar ação</string>
|
||||
<string name="automated_action_edit">Editar ação</string>
|
||||
<string name="automated_action_regex">Regex</string>
|
||||
<string name="automated_action_regex_hint">ex.: ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regex obrigatório</string>
|
||||
<string name="automated_action_regex_invalid">Regex inválido</string>
|
||||
<string name="automated_action_type">Tipo de ação</string>
|
||||
<string name="automated_action_type_intent">Abrir URL</string>
|
||||
<string name="automated_action_url_template">Modelo de URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Modelo de URL obrigatório</string>
|
||||
<string name="automated_action_invalid_url">Modelo de URL inválido</string>
|
||||
<string name="automated_action_remove_confirm">Remover esta ação?</string>
|
||||
<string name="automated_action_list_intent">Abrir URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Abrir URL</string>
|
||||
<string name="automated_action_webview_title">Ação automatizada</string>
|
||||
<string name="clear_network_suggestions">Excluir sugestões de rede</string>
|
||||
<string name="clear_network_suggestions_summary">Excluir todas as sugestões de rede que foram anteriormente adicionadas com este app.</string>
|
||||
<string name="really_remove_all_networks">Deseja excluir todas as redes?</string>
|
||||
@@ -138,7 +181,7 @@
|
||||
<string name="test_url">Testar a URL</string>
|
||||
<string name="send_scan_bluetooth">Encaminhar digitalizações com Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Ative para encaminhar digitalizações a um determinado host Bluetooth.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="send_scan_bluetooth_host">Anfitrião</string>
|
||||
<string name="no_bluetooth_hosts_paired">Nenhum Host Pareado</string>
|
||||
<string name="bluetooth_connect_fail">Não foi possível conectar com o dispositivo Bluetooth.</string>
|
||||
<string name="bluetooth_send_fail">Não foi possível enviar para o dispositivo Bluetooth.</string>
|
||||
@@ -210,4 +253,18 @@
|
||||
<string name="wifi_phase2">Método Phase 2</string>
|
||||
<string name="network_suggestions">Sugestões de rede</string>
|
||||
<string name="remove_suggestion">Apagar sugestão</string>
|
||||
<string name="email_to">Destinatário</string>
|
||||
<string name="email_subject">Assunto</string>
|
||||
<string name="email_body">Corpo</string>
|
||||
<string name="scheme">Esquema</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="query">Consulta</string>
|
||||
<string name="automated_action_type_custom_intent">Intent personalizado</string>
|
||||
<string name="automated_action_intent_uri_template">Modelo de URI de Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI de Intent obrigatório</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI de Intent inválido</string>
|
||||
<string name="automated_action_list_custom_intent">Intent personalizado: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent personalizado</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Добро пожаловать!</string>
|
||||
<string name="mode_expert">Расширенный</string>
|
||||
<string name="mode_expert_description">Я хочу проверять считанные данные и открывать их вручную.</string>
|
||||
<string name="mode_simple">Простой</string>
|
||||
<string name="mode_simple_description">Я просто хочу сканировать штрих-коды и сразу их открывать.</string>
|
||||
<string name="camera_error">Невозможно получить доступ к камере, попробуйте ещё раз</string>
|
||||
<string name="scan_code">Сканировать штрих-код</string>
|
||||
<string name="compose_barcode">Создать штрих-код</string>
|
||||
@@ -12,10 +18,10 @@
|
||||
<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="error_correction_level_l" formatted="false">Низкий (≈7% исправлений)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Средний (≈15% исправлений)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Квартиль (≈25% исправлений)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Высокий (≈30% исправлений)</string>
|
||||
<string name="label">Метка</string>
|
||||
<string name="colors">Цвета</string>
|
||||
<string name="colors_black_on_white">Чёрный на белом</string>
|
||||
@@ -36,11 +42,11 @@
|
||||
<string name="error_flash">Ошибка при переключении вспышки</string>
|
||||
<string name="share">Поделиться</string>
|
||||
<string name="share_file">Поделиться файлом</string>
|
||||
<string name="share_as">Поделиться как?</string>
|
||||
<string name="copy_to_clipboard">Скопировать в буфер обмена</string>
|
||||
<string name="share_as">Поделиться…</string>
|
||||
<string name="copy_to_clipboard">Копировать в буфер обмена</string>
|
||||
<string name="copy_as_deeplink">Копировать как прямую ссылку</string>
|
||||
<string name="copied_to_clipboard">Скопировано в буфер обмена</string>
|
||||
<string name="copy_password">Скопировать пароль в буфер обмена</string>
|
||||
<string name="copied_password_to_clipboard">Пароль скопирован в буфер обмена</string>
|
||||
<string name="copy_password">Копировать пароль в буфер обмена</string>
|
||||
<string name="open_url">Открыть URL</string>
|
||||
<string name="cannot_resolve_action">Не найдено приложение для этого действия</string>
|
||||
<string name="pick_search_engine">Выберите поисковую систему</string>
|
||||
@@ -61,10 +67,11 @@
|
||||
<string name="bulk_mode_delay">Задержка непрерывного сканирования</string>
|
||||
<string name="restrict_format">Исключить формат</string>
|
||||
<string name="remove_restriction">Включить формат</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Сканировать %s</string>
|
||||
<string name="find_code">Поиск кода</string>
|
||||
<string name="find_code_with_content">Что искать?</string>
|
||||
<string name="find_code_hint">Термин или регулярное выражение</string>
|
||||
<string name="does_not_match_search_term">Не соответствует поисковому запросу</string>
|
||||
<string name="scan_for">Сканировать %s</string>
|
||||
<string name="quarter_second">Четверть секунды</string>
|
||||
<string name="half_second">Полсекунды</string>
|
||||
<string name="a_second">Одну секунду</string>
|
||||
@@ -75,6 +82,17 @@
|
||||
<string name="scan_category">Сканирование</string>
|
||||
<string name="content_category">Содержимое</string>
|
||||
<string name="locale_category">Язык</string>
|
||||
<string name="profile_category">Профиль</string>
|
||||
<string name="profile">Профиль</string>
|
||||
<string name="profile_default">По умолчанию</string>
|
||||
<string name="profile_add">Добавить новый профиль</string>
|
||||
<string name="profile_enter_name">Введите имя профиля</string>
|
||||
<string name="profile_enter_name_hint">Имя</string>
|
||||
<string name="profile_invalid_name">Недопустимое имя профиля</string>
|
||||
<string name="profile_empty">Профилей пока нет</string>
|
||||
<string name="profile_current">Текущий профиль</string>
|
||||
<string name="profile_remove_confirm">Удалить этот профиль?</string>
|
||||
<string name="current_profile">Профиль: %s</string>
|
||||
<string name="custom_locale">Выбрать язык</string>
|
||||
<string name="follow_system_settings">Как в системе</string>
|
||||
<string name="show_crop_handle">Показывать область сканирования</string>
|
||||
@@ -122,6 +140,32 @@
|
||||
<string name="default_search_engine">Поиск неизвестных данных</string>
|
||||
<string name="always_ask">Всегда спрашивать</string>
|
||||
<string name="open_with_url">Открывать неизвестные данные по URL</string>
|
||||
|
||||
<string name="automated_actions">Автоматические действия</string>
|
||||
<string name="automated_actions_none">Нет автоматических действий</string>
|
||||
<string name="automated_actions_empty">Автоматических действий пока нет</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d автоматическое действие</item>
|
||||
<item quantity="few">%d автоматических действия</item>
|
||||
<item quantity="many">%d автоматических действий</item>
|
||||
<item quantity="other">%d автоматических действий</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Добавить действие</string>
|
||||
<string name="automated_action_edit">Изменить действие</string>
|
||||
<string name="automated_action_regex">Регулярное выражение</string>
|
||||
<string name="automated_action_regex_hint">например: ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Требуется регулярное выражение</string>
|
||||
<string name="automated_action_regex_invalid">Неверное регулярное выражение</string>
|
||||
<string name="automated_action_type">Тип действия</string>
|
||||
<string name="automated_action_type_intent">Открыть URL</string>
|
||||
<string name="automated_action_url_template">Шаблон URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Требуется шаблон URL</string>
|
||||
<string name="automated_action_invalid_url">Неверный шаблон URL</string>
|
||||
<string name="automated_action_remove_confirm">Удалить это действие?</string>
|
||||
<string name="automated_action_list_intent">Открыть URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Открыть URL</string>
|
||||
<string name="automated_action_webview_title">Автоматическое действие</string>
|
||||
<string name="clear_network_suggestions">Удалить сетевые предложения</string>
|
||||
<string name="clear_network_suggestions_summary">Удалить все сетевые предложения, ранее добавленные этим приложением.</string>
|
||||
<string name="really_remove_all_networks">Удалить все сетевые предложения?</string>
|
||||
@@ -134,8 +178,8 @@
|
||||
<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-приложение/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST-приложение/json</string>
|
||||
<string name="send_type_post_form">POST application/x-www-form-urlencoded</string>
|
||||
<string name="send_type_post_json">POST application/json</string>
|
||||
<string name="send_type_external_browser">Открыть во внешнем браузере</string>
|
||||
<string name="test_url">Проверка URL</string>
|
||||
<string name="send_scan_bluetooth">Отправлять сканирования по bluetooth</string>
|
||||
@@ -158,10 +202,10 @@
|
||||
<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="save_as_file_name">Сохранить в файл с именем</string>
|
||||
<string name="file_name">Имя файла</string>
|
||||
<string name="error_saving_file">Невозможно сохранить файл</string>
|
||||
<string name="error_file_exists">Файл уже существует</string>
|
||||
@@ -184,12 +228,12 @@
|
||||
<string name="add_to_history">Добавить в историю</string>
|
||||
<string name="added_to_history">Добавлено в историю</string>
|
||||
<string name="export_to_file">Экспортировать в файл</string>
|
||||
<string name="export_as">Формат файла экспорта</string>
|
||||
<string name="export_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="saved_in_downloads">Сохранено в папке Downloads</string>
|
||||
<string name="rotate_image_cw">Повернуть изображение по часовой стрелке</string>
|
||||
<string name="toggle_free_rotation">Переключить свободный поворот</string>
|
||||
<string name="pick_file">Открыть файл</string>
|
||||
@@ -212,4 +256,18 @@
|
||||
<string name="wifi_phase2">Двухэтапный метод</string>
|
||||
<string name="network_suggestions">Сетевые предложения</string>
|
||||
<string name="remove_suggestion">Удалить предложение</string>
|
||||
<string name="email_to">Получатель</string>
|
||||
<string name="email_subject">Тема</string>
|
||||
<string name="email_body">Текст</string>
|
||||
<string name="scheme">Схема</string>
|
||||
<string name="host">Узел</string>
|
||||
<string name="query">Запрос</string>
|
||||
<string name="automated_action_type_custom_intent">Пользовательский Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Шаблон URI Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Требуется URI Intent</string>
|
||||
<string name="automated_action_intent_uri_invalid">Недопустимый URI Intent</string>
|
||||
<string name="automated_action_list_custom_intent">Пользовательский Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Пользовательский Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Hoş geldiniz!</string>
|
||||
<string name="mode_expert">Gelişmiş</string>
|
||||
<string name="mode_expert_description">Okunan içeriği kontrol etmek ve manuel olarak açmak istiyorum.</string>
|
||||
<string name="mode_simple">Basit</string>
|
||||
<string name="mode_simple_description">Barkodları taramak ve hemen açmak istiyorum.</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 oluştur</string>
|
||||
@@ -29,23 +34,23 @@
|
||||
<string name="gtin_add_on">UPC EAN eklentisi</string>
|
||||
<string name="barcode_version_number">Sürüm</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modül)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Veri maskesi</string>
|
||||
<string name="toggle_flash">Flaşı aç</string>
|
||||
<string name="error_flash">Flaş açılırken hata oluştu</string>
|
||||
<string name="share">Paylaş</string>
|
||||
<string name="share_file">Dosya olarak paylaş</string>
|
||||
<string name="share_as">Şöyle paylaş:</string>
|
||||
<string name="copy_to_clipboard">Panoya kopyala</string>
|
||||
<string name="copy_as_deeplink">Derin bağlantı olarak 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_width_by_height">Piksel türünde boyut: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Büyütme Yok</string>
|
||||
<string name="add_quiet_zone">Sessiz bölge ekle</string>
|
||||
<string name="input_content_here">İçeriği buraya gir</string>
|
||||
<string name="unescape">Kaçış dizilerini genişlet</string>
|
||||
<string name="encode">KODLA</string>
|
||||
@@ -59,10 +64,11 @@
|
||||
<string name="bulk_mode_delay">Sürekli taramalar arasındaki gecikme</string>
|
||||
<string name="restrict_format">Biçimi kısıtla</string>
|
||||
<string name="remove_restriction">Kısıtlamayı kaldır</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">%s tara</string>
|
||||
<string name="find_code">Kod bul</string>
|
||||
<string name="find_code_with_content">Ne içerik?</string>
|
||||
<string name="find_code_hint">Terim veya düzenli ifade</string>
|
||||
<string name="does_not_match_search_term">Arama terimiyle eşleşmiyor</string>
|
||||
<string name="scan_for">%s tara</string>
|
||||
<string name="quarter_second">Çeyrek saniye</string>
|
||||
<string name="half_second">Yarım saniye</string>
|
||||
<string name="a_second">Bir saniye</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Tarama</string>
|
||||
<string name="content_category">İçerik</string>
|
||||
<string name="locale_category">Dil</string>
|
||||
<string name="profile_category">Profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="profile_default">Varsayılan</string>
|
||||
<string name="profile_add">Yeni profil ekle</string>
|
||||
<string name="profile_enter_name">Profil adını girin</string>
|
||||
<string name="profile_enter_name_hint">Ad</string>
|
||||
<string name="profile_invalid_name">Geçersiz profil adı</string>
|
||||
<string name="profile_empty">Henüz profil yok</string>
|
||||
<string name="profile_current">Geçerli profil</string>
|
||||
<string name="profile_remove_confirm">Bu profil kaldırılsın mı?</string>
|
||||
<string name="current_profile">Profil: %s</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>
|
||||
@@ -99,10 +116,10 @@
|
||||
<string name="tone_prop_beep2">Genel çift bip sesi</string>
|
||||
<string name="use_history">Tarama geçmişini kaydet</string>
|
||||
<string name="use_history_summary">Tanınan kodları aygıtınızda saklayın.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Yinelenenleri Yoksay</string>
|
||||
<string name="ignore_consecutive_duplicates">Yinelemeleri göz ardı et</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Yinelenenleri kabul et</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>
|
||||
@@ -111,8 +128,8 @@
|
||||
<string name="show_meta_data_summary">Taranan barkod ile ilgili ek veriyi göster</string>
|
||||
<string name="show_hex_dump">Hex yığınını göster</string>
|
||||
<string name="show_hex_dump_summary">Taranan içeriklerin hex yığınını göster.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">Özet göster</string>
|
||||
<string name="no_checksum">Özet yok</string>
|
||||
<string name="show_recreation">Yeniden oluşturulan barkodu göster</string>
|
||||
<string name="show_recreation_summary">Mümkünse okunan içerikten barkodu yeniden oluştur ve göster.</string>
|
||||
<string name="close_automatically">Kopyala/Paylaş\'tan sonra geri dön</string>
|
||||
@@ -120,6 +137,30 @@
|
||||
<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="automated_actions">Otomatik eylemler</string>
|
||||
<string name="automated_actions_none">Otomatik eylem yok</string>
|
||||
<string name="automated_actions_empty">Henüz otomatik eylem yok</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d otomatik eylem</item>
|
||||
<item quantity="other">%d otomatik eylemler</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Eylem ekle</string>
|
||||
<string name="automated_action_edit">Eylemi düzenle</string>
|
||||
<string name="automated_action_regex">Düzenli ifade</string>
|
||||
<string name="automated_action_regex_hint">örn. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Düzenli ifade gerekli</string>
|
||||
<string name="automated_action_regex_invalid">Geçersiz düzenli ifade</string>
|
||||
<string name="automated_action_type">Eylem türü</string>
|
||||
<string name="automated_action_type_intent">URL aç</string>
|
||||
<string name="automated_action_url_template">URL şablonu</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL şablonu gerekli</string>
|
||||
<string name="automated_action_invalid_url">Geçersiz URL şablonu</string>
|
||||
<string name="automated_action_remove_confirm">Bu eylem kaldırılsın mı?</string>
|
||||
<string name="automated_action_list_intent">URL aç: %s</string>
|
||||
<string name="automated_action_list_intent_empty">URL aç</string>
|
||||
<string name="automated_action_webview_title">Otomatik eylem</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>
|
||||
@@ -143,9 +184,9 @@
|
||||
<string name="bluetooth_connect_fail">Bluetooth aygıtına bağlanılamadı.</string>
|
||||
<string name="bluetooth_send_fail">Bluetooth aygıtına gönderilemedi.</string>
|
||||
<string name="bluetooth_send_success">Bluetooth aygıtına gönderildi.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Nesil</string>
|
||||
<string name="brighten_screen">Ekranı parlaklaştır</string>
|
||||
<string name="brighten_screen_summary">Ekran parlaklığını maksimuma ayarlayarak ekrandan barkod okumayı iyileştirin.</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>
|
||||
@@ -195,7 +236,7 @@
|
||||
<string name="pick_code_to_scan">Taranacak kod seç</string>
|
||||
<string name="shortcut_decode">Barkod tara</string>
|
||||
<string name="shortcut_encode">Barkod oluştur</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Tarih</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>
|
||||
@@ -210,4 +251,18 @@
|
||||
<string name="wifi_phase2">2. aşama yöntemi</string>
|
||||
<string name="network_suggestions">Ağ önerileri</string>
|
||||
<string name="remove_suggestion">Öneriyi kaldır</string>
|
||||
<string name="email_to">Alıcı</string>
|
||||
<string name="email_subject">Konu</string>
|
||||
<string name="email_body">İçerik</string>
|
||||
<string name="scheme">Düzen</string>
|
||||
<string name="host">Ana Bilgisayar</string>
|
||||
<string name="query">Sorgu</string>
|
||||
<string name="automated_action_type_custom_intent">Özel Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI şablonu</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI gerekli</string>
|
||||
<string name="automated_action_intent_uri_invalid">Geçersiz Intent URI</string>
|
||||
<string name="automated_action_list_custom_intent">Özel Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Özel Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Ласкаво просимо!</string>
|
||||
<string name="mode_expert">Розширений</string>
|
||||
<string name="mode_expert_description">Я хочу перевірити прочитаний вміст і відкрити його вручну.</string>
|
||||
<string name="mode_simple">Простий</string>
|
||||
<string name="mode_simple_description">Я просто хочу сканувати штрих-коди і відкривати їх одразу.</string>
|
||||
<string name="camera_error">Неможливо отримати доступ до камери, будь ласка, спробуйте ще раз</string>
|
||||
<string name="scan_code">Сканування коду</string>
|
||||
<string name="compose_barcode">Створити штрих-код</string>
|
||||
@@ -30,23 +35,23 @@
|
||||
<string name="gtin_add_on">Розширення UPC EAN</string>
|
||||
<string name="barcode_version_number">Версія</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d модулі)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Маска даних</string>
|
||||
<string name="toggle_flash">Увімкнути спалах</string>
|
||||
<string name="error_flash">Помилка під час увімкнення спалаху</string>
|
||||
<string name="share">Поділитися</string>
|
||||
<string name="share_file">Поділитися файлом</string>
|
||||
<string name="share_as">Поділитися як?</string>
|
||||
<string name="copy_to_clipboard">Копіювати у буфер обміну</string>
|
||||
<string name="copy_as_deeplink">Копіювати як диплінк</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_width_by_height">Розмір у пікселях: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Без збільшення</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="add_quiet_zone">Додати тиху зону</string>
|
||||
<string name="input_content_here">Введіть вміст сюди</string>
|
||||
<string name="unescape">Розгорнути спеціальні послідовності</string>
|
||||
<string name="encode">КОДУВАТИ</string>
|
||||
@@ -60,10 +65,11 @@
|
||||
<string name="bulk_mode_delay">Затримка між безперервним скануванням</string>
|
||||
<string name="restrict_format">Обмежити формат</string>
|
||||
<string name="remove_restriction">Скасувати обмеження</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Сканувати %s</string>
|
||||
<string name="find_code">Знайти код</string>
|
||||
<string name="find_code_with_content">Що саме вміст?</string>
|
||||
<string name="find_code_hint">Термін або регулярний вираз</string>
|
||||
<string name="does_not_match_search_term">Не відповідає пошуковому терміну</string>
|
||||
<string name="scan_for">Сканувати %s</string>
|
||||
<string name="quarter_second">Чверть секунди</string>
|
||||
<string name="half_second">Півсекунди</string>
|
||||
<string name="a_second">Одна секунда</string>
|
||||
@@ -74,6 +80,17 @@
|
||||
<string name="scan_category">Сканування</string>
|
||||
<string name="content_category">Вміст</string>
|
||||
<string name="locale_category">Мова</string>
|
||||
<string name="profile_category">Профіль</string>
|
||||
<string name="profile">Профіль</string>
|
||||
<string name="profile_default">Типовий</string>
|
||||
<string name="profile_add">Додати новий профіль</string>
|
||||
<string name="profile_enter_name">Введіть назву профілю</string>
|
||||
<string name="profile_enter_name_hint">Назва</string>
|
||||
<string name="profile_invalid_name">Неприпустиме імʼя профілю</string>
|
||||
<string name="profile_empty">Профілів ще немає</string>
|
||||
<string name="profile_current">Поточний профіль</string>
|
||||
<string name="profile_remove_confirm">Видалити цей профіль?</string>
|
||||
<string name="current_profile">Профіль: %s</string>
|
||||
<string name="custom_locale">Вибрати мову</string>
|
||||
<string name="follow_system_settings">Дотримуватись системних налаштувань</string>
|
||||
<string name="show_crop_handle">Обмежити область сканування</string>
|
||||
@@ -121,6 +138,32 @@
|
||||
<string name="default_search_engine">Відкривати невідомі дані в</string>
|
||||
<string name="always_ask">Завжди запитувати</string>
|
||||
<string name="open_with_url">Відкривати невідомі дані за допомогою URL</string>
|
||||
|
||||
<string name="automated_actions">Автоматичні дії</string>
|
||||
<string name="automated_actions_none">Немає автоматичних дій</string>
|
||||
<string name="automated_actions_empty">Ще немає автоматичних дій</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d автоматична дія</item>
|
||||
<item quantity="few">%d автоматичні дії</item>
|
||||
<item quantity="many">%d автоматичних дій</item>
|
||||
<item quantity="other">%d автоматичних дій</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Додати дію</string>
|
||||
<string name="automated_action_edit">Редагувати дію</string>
|
||||
<string name="automated_action_regex">Регулярний вираз</string>
|
||||
<string name="automated_action_regex_hint">напр. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Потрібен регулярний вираз</string>
|
||||
<string name="automated_action_regex_invalid">Невірний регулярний вираз</string>
|
||||
<string name="automated_action_type">Тип дії</string>
|
||||
<string name="automated_action_type_intent">Відкрити URL</string>
|
||||
<string name="automated_action_url_template">Шаблон URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Потрібен шаблон URL</string>
|
||||
<string name="automated_action_invalid_url">Невірний шаблон URL</string>
|
||||
<string name="automated_action_remove_confirm">Видалити цю дію?</string>
|
||||
<string name="automated_action_list_intent">Відкрити URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Відкрити URL</string>
|
||||
<string name="automated_action_webview_title">Автоматична дія</string>
|
||||
<string name="clear_network_suggestions">Очистити мережеві пропозиції</string>
|
||||
<string name="clear_network_suggestions_summary">Видалити усі мережеві пропозиції, які раніше надавала ця програма.</string>
|
||||
<string name="really_remove_all_networks">Ви впевнені, що хочете видалити всі мережі?</string>
|
||||
@@ -211,4 +254,18 @@
|
||||
<string name="wifi_phase2">Phase 2 метод</string>
|
||||
<string name="network_suggestions">Мережеві пропозиції</string>
|
||||
<string name="remove_suggestion">Видалити пропозицію</string>
|
||||
<string name="email_to">Одержувач</string>
|
||||
<string name="email_subject">Тема</string>
|
||||
<string name="email_body">Тіло листа</string>
|
||||
<string name="scheme">Схема</string>
|
||||
<string name="host">Хост</string>
|
||||
<string name="query">Запит</string>
|
||||
<string name="automated_action_type_custom_intent">Користувацький Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Шаблон URI Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">URI Intent обов’язковий</string>
|
||||
<string name="automated_action_intent_uri_invalid">Некоректний URI Intent</string>
|
||||
<string name="automated_action_list_custom_intent">Користувацький Intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Користувацький Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">Chào mừng!</string>
|
||||
<string name="mode_expert">Nâng cao</string>
|
||||
<string name="mode_expert_description">Tôi muốn kiểm tra nội dung đã đọc và mở nó theo cách thủ công.</string>
|
||||
<string name="mode_simple">Đơn giản</string>
|
||||
<string name="mode_simple_description">Tôi chỉ muốn quét mã vạch và mở ngay lập tức.</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>
|
||||
@@ -13,40 +18,40 @@
|
||||
<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="label">Label</string>
|
||||
<string name="colors">Fore and background</string>
|
||||
<string name="colors_black_on_white">Black on white</string>
|
||||
<string name="colors_white_on_black">White on black</string>
|
||||
<string name="colors_black_on_transparent">Black on transparent</string>
|
||||
<string name="colors_white_on_transparent">White on transparent</string>
|
||||
<string name="sequence_size">Sequence size</string>
|
||||
<string name="sequence_index">Sequence index</string>
|
||||
<string name="sequence_id">Sequence ID</string>
|
||||
<string name="label">Nhãn</string>
|
||||
<string name="colors">Màu nền và màu chữ</string>
|
||||
<string name="colors_black_on_white">Đen trên trắng</string>
|
||||
<string name="colors_white_on_black">Trắng trên đen</string>
|
||||
<string name="colors_black_on_transparent">Đen trên trong suốt</string>
|
||||
<string name="colors_white_on_transparent">Trắng trên trong suốt</string>
|
||||
<string name="sequence_size">Kích thước chuỗi</string>
|
||||
<string name="sequence_index">Chỉ mục chuỗi</string>
|
||||
<string name="sequence_id">ID chuỗi</string>
|
||||
<string name="gtin_issue_number">Số</string>
|
||||
<string name="gtin_country">Có thể được sản xuất ở nước</string>
|
||||
<string name="gtin_price">Giá được gợi ý</string>
|
||||
<string name="gtin_add_on">Phần mở rộng UPC EAN</string>
|
||||
<string name="barcode_version_number">Version</string>
|
||||
<string name="barcode_version_number">Phiên bản</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">Mặt nạ dữ liệu</string>
|
||||
<string name="toggle_flash">Bật/tắt đèn</string>
|
||||
<string name="error_flash">Error toggling flash</string>
|
||||
<string name="error_flash">Lỗi khi chuyển đổi đèn flash</string>
|
||||
<string name="share">Chia sẻ</string>
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_file">Chia sẻ dưới dạng tập tin</string>
|
||||
<string name="share_as">Chia sẻ dưới định dạng?</string>
|
||||
<string name="copy_to_clipboard">Sao chép</string>
|
||||
<string name="copy_as_deeplink">Sao chép dưới dạng liên kết sâu</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_width_by_height">Kích cỡ theo pixel: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">Không phóng to</string>
|
||||
<string name="add_quiet_zone">Thêm vùng yên tĩnh</string>
|
||||
<string name="input_content_here">Nhập nội dung vào đây</string>
|
||||
<string name="unescape">Expand escape sequences</string>
|
||||
<string name="unescape">Mở rộng chuỗi thoát</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>
|
||||
@@ -56,12 +61,13 @@
|
||||
<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="restrict_format">Restrict format</string>
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="restrict_format">Hạn chế định dạng</string>
|
||||
<string name="remove_restriction">Xóa hạn chế</string>
|
||||
<string name="find_code">Tìm mã</string>
|
||||
<string name="find_code_with_content">Nội dung là gì?</string>
|
||||
<string name="find_code_hint">Thuật ngữ hoặc biểu thức chính quy</string>
|
||||
<string name="does_not_match_search_term">Không khớp với thuật ngữ tìm kiếm</string>
|
||||
<string name="scan_for">Quét %s</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>
|
||||
@@ -72,6 +78,17 @@
|
||||
<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="profile_category">Hồ sơ</string>
|
||||
<string name="profile">Hồ sơ</string>
|
||||
<string name="profile_default">Mặc định</string>
|
||||
<string name="profile_add">Thêm hồ sơ mới</string>
|
||||
<string name="profile_enter_name">Nhập tên hồ sơ</string>
|
||||
<string name="profile_enter_name_hint">Tên</string>
|
||||
<string name="profile_invalid_name">Tên hồ sơ không hợp lệ</string>
|
||||
<string name="profile_empty">Chưa có hồ sơ nào</string>
|
||||
<string name="profile_current">Hồ sơ hiện tại</string>
|
||||
<string name="profile_remove_confirm">Xóa hồ sơ này?</string>
|
||||
<string name="current_profile">Hồ sơ: %s</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>
|
||||
@@ -87,21 +104,21 @@
|
||||
<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="beep">Beep on detection</string>
|
||||
<string name="beep_summary">Enable this if you want your device to beep when a code is recognized.</string>
|
||||
<string name="beep_tone">Beep tone</string>
|
||||
<string name="tone_cdma_confirm">CDMA confirm</string>
|
||||
<string name="tone_sup_confirm">Call supervisory confirm</string>
|
||||
<string name="tone_sup_radio_ack">Call supervisory radio path acknowledgment</string>
|
||||
<string name="tone_prop_ack">Positive acknowledgment</string>
|
||||
<string name="tone_prop_beep">General beep</string>
|
||||
<string name="tone_prop_beep2">General double beep</string>
|
||||
<string name="beep">Âm thanh khi phát hiện</string>
|
||||
<string name="beep_summary">Bật tính năng này nếu bạn muốn thiết bị phát ra tiếng beep khi một mã được nhận diện.</string>
|
||||
<string name="beep_tone">Âm thanh bíp</string>
|
||||
<string name="tone_cdma_confirm">Xác nhận CDMA</string>
|
||||
<string name="tone_sup_confirm">Xác nhận giám sát cuộc gọi</string>
|
||||
<string name="tone_sup_radio_ack">Xác nhận đường truyền radio giám sát cuộc gọi</string>
|
||||
<string name="tone_prop_ack">Phản hồi tích cực</string>
|
||||
<string name="tone_prop_beep">Âm thanh chung</string>
|
||||
<string name="tone_prop_beep2">Âm thanh chung kép beep</string>
|
||||
<string name="use_history">Lưu lịch sử quét</string>
|
||||
<string name="use_history_summary">Lưu mã đã nhận dạng được trên máy của bạn.</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">Bỏ qua bản sao</string>
|
||||
<string name="ignore_consecutive_duplicates">Bỏ qua trùng lặp</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="accept_duplicates">Chấp nhận bản sao</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>
|
||||
@@ -110,22 +127,46 @@
|
||||
<string name="show_meta_data_summary">Hiện thêm thông tin về mã vạch quét được.</string>
|
||||
<string name="show_hex_dump">Hiện mã thập lục phân</string>
|
||||
<string name="show_hex_dump_summary">Hiện mã thập lục phân từ mã quét được.</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="show_checksum">Hiển thị checksum</string>
|
||||
<string name="no_checksum">Không có bản kiểm tra</string>
|
||||
<string name="show_recreation">Hiển thị mã vạch tái tạo</string>
|
||||
<string name="show_recreation_summary">Tạo lại và hiển thị mã vạch từ nội dung đã đọc nếu có thể.</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="automated_actions">Hành động tự động</string>
|
||||
<string name="automated_actions_none">Không có hành động tự động</string>
|
||||
<string name="automated_actions_empty">Chưa có hành động tự động</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d hành động tự động</item>
|
||||
<item quantity="other">%d hành động tự động</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Thêm hành động</string>
|
||||
<string name="automated_action_edit">Chỉnh sửa hành động</string>
|
||||
<string name="automated_action_regex">Biểu thức chính quy</string>
|
||||
<string name="automated_action_regex_hint">ví dụ ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Cần biểu thức chính quy</string>
|
||||
<string name="automated_action_regex_invalid">Biểu thức chính quy không hợp lệ</string>
|
||||
<string name="automated_action_type">Loại hành động</string>
|
||||
<string name="automated_action_type_intent">Mở URL</string>
|
||||
<string name="automated_action_url_template">Mẫu URL</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">Cần mẫu URL</string>
|
||||
<string name="automated_action_invalid_url">Mẫu URL không hợp lệ</string>
|
||||
<string name="automated_action_remove_confirm">Xóa hành động này?</string>
|
||||
<string name="automated_action_list_intent">Mở URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Mở URL</string>
|
||||
<string name="automated_action_webview_title">Hành động tự động</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_active">Forward scans</string>
|
||||
<string name="send_scan_active">Chuyển tiếp quét</string>
|
||||
<string name="send_scan_active_summary">Enable to forward scans to a the given URL</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>
|
||||
@@ -133,18 +174,18 @@
|
||||
<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="send_type_external_browser">Open in external browser</string>
|
||||
<string name="send_type_external_browser">Mở trong trình duyệt bên ngoài</string>
|
||||
<string name="test_url">URL thử</string>
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth">Chuyển tiếp quét với Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forwards scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="send_scan_bluetooth_host">Máy chủ</string>
|
||||
<string name="no_bluetooth_hosts_paired">Không có Host nào được kết nối</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful bluetooth send.</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">Thế hệ</string>
|
||||
<string name="brighten_screen">Tăng độ sáng màn hình</string>
|
||||
<string name="brighten_screen_summary">Đặt độ sáng tối đa để tăng cường quét mã vạch từ màn hình.</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>
|
||||
@@ -178,8 +219,8 @@
|
||||
<string name="otpauth_add">Thêm xác thực hai bước</string>
|
||||
<string name="search_web">Tìm kiếm web</string>
|
||||
<string name="search_scan">Tìm kiếm lần quét</string>
|
||||
<string name="add_to_history">Add to history</string>
|
||||
<string name="added_to_history">Added to history</string>
|
||||
<string name="add_to_history">Thêm vào lịch sử</string>
|
||||
<string name="added_to_history">Đã thêm vào lịch sử</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>
|
||||
@@ -188,25 +229,39 @@
|
||||
<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="toggle_free_rotation">Toggle free rotation</string>
|
||||
<string name="pick_file">Pick a file</string>
|
||||
<string name="toggle_free_rotation">Chuyển đổi quay tự do</string>
|
||||
<string name="pick_file">Chọn một tập tin</string>
|
||||
<string name="pick_image_file">Chọn tệp ảnh</string>
|
||||
<string name="pick_code_to_scan">Chọn mã để quét</string>
|
||||
<string name="shortcut_decode">Quét mã vạch</string>
|
||||
<string name="shortcut_encode">Tạo mã vạch</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">Lịch sử</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>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="entry_type">Loại</string>
|
||||
<string name="wifi_network">Mạng Wi-Fi</string>
|
||||
<string name="wifi_ssid">Tên</string>
|
||||
<string name="wifi_type">Loại xác thực</string>
|
||||
<string name="wifi_password">Mật khẩu</string>
|
||||
<string name="wifi_hidden">Mạng ẩn</string>
|
||||
<string name="wifi_eap">Phương pháp EAP</string>
|
||||
<string name="wifi_anonymous_identity">Danh tính ẩn danh</string>
|
||||
<string name="wifi_identity">Nhận diện</string>
|
||||
<string name="wifi_phase2">Phương pháp giai đoạn 2</string>
|
||||
<string name="network_suggestions">Đề xuất mạng</string>
|
||||
<string name="remove_suggestion">Xóa gợi ý</string>
|
||||
<string name="email_to">Người nhận</string>
|
||||
<string name="email_subject">Chủ đề</string>
|
||||
<string name="email_body">Nội dung</string>
|
||||
<string name="scheme">Kế hoạch</string>
|
||||
<string name="host">Chủ nhà</string>
|
||||
<string name="query">Truy vấn</string>
|
||||
<string name="automated_action_type_custom_intent">Intent tuỳ chỉnh</string>
|
||||
<string name="automated_action_intent_uri_template">Mẫu URI Intent</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Cần URI Intent</string>
|
||||
<string name="automated_action_intent_uri_invalid">URI Intent không hợp lệ</string>
|
||||
<string name="automated_action_list_custom_intent">Intent tuỳ chỉnh: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Intent tuỳ chỉnh</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">欢迎!</string>
|
||||
<string name="mode_expert">高级</string>
|
||||
<string name="mode_expert_description">我想检查读取的内容并手动打开。</string>
|
||||
<string name="mode_simple">简单</string>
|
||||
<string name="mode_simple_description">我只想扫描条形码并立即打开。</string>
|
||||
<string name="camera_error">无法访问相机,请重试</string>
|
||||
<string name="scan_code">扫码</string>
|
||||
<string name="compose_barcode">生成条码</string>
|
||||
@@ -13,7 +18,7 @@
|
||||
<string name="error_correction_level_m" formatted="false">中 (~15% 准确度)</string>
|
||||
<string name="error_correction_level_q" formatted="false">较高 (~25% 准确度)</string>
|
||||
<string name="error_correction_level_h" formatted="false">高 (~30% 准确度)</string>
|
||||
<string name="label">Label</string>
|
||||
<string name="label">标签</string>
|
||||
<string name="colors">前景和背景</string>
|
||||
<string name="colors_black_on_white">白底黑字</string>
|
||||
<string name="colors_white_on_black">黑底白字</string>
|
||||
@@ -28,23 +33,23 @@
|
||||
<string name="gtin_add_on">UPC EAN 扩展</string>
|
||||
<string name="barcode_version_number">版本</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d modules)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">数据蒙版</string>
|
||||
<string name="toggle_flash">开关闪光灯</string>
|
||||
<string name="error_flash">开关闪光灯出错</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="share_file">以文件形式分享</string>
|
||||
<string name="share_as">以何种方式分享?</string>
|
||||
<string name="copy_to_clipboard">复制到剪贴板</string>
|
||||
<string name="copy_as_deeplink">复制为深层链接</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_width_by_height">图片尺寸: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">无放大</string>
|
||||
<string name="add_quiet_zone">添加安静区</string>
|
||||
<string name="input_content_here">在这里输入内容</string>
|
||||
<string name="unescape">展开转义字符</string>
|
||||
<string name="encode">编码</string>
|
||||
@@ -58,10 +63,11 @@
|
||||
<string name="bulk_mode_delay">连续扫描之间的延迟</string>
|
||||
<string name="restrict_format">严格模式(扫描指定编码格式)</string>
|
||||
<string name="remove_restriction">解除限制</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">扫描 %s</string>
|
||||
<string name="find_code">找码</string>
|
||||
<string name="find_code_with_content">什么内容?</string>
|
||||
<string name="find_code_hint">术语或正则表达式</string>
|
||||
<string name="does_not_match_search_term">与搜索词不匹配</string>
|
||||
<string name="scan_for">扫描 %s</string>
|
||||
<string name="quarter_second">四分之一秒</string>
|
||||
<string name="half_second">半秒</string>
|
||||
<string name="a_second">一秒</string>
|
||||
@@ -72,6 +78,17 @@
|
||||
<string name="scan_category">扫描</string>
|
||||
<string name="content_category">内容</string>
|
||||
<string name="locale_category">语言</string>
|
||||
<string name="profile_category">配置文件</string>
|
||||
<string name="profile">配置文件</string>
|
||||
<string name="profile_default">默认</string>
|
||||
<string name="profile_add">添加新配置文件</string>
|
||||
<string name="profile_enter_name">输入配置文件名称</string>
|
||||
<string name="profile_enter_name_hint">名称</string>
|
||||
<string name="profile_invalid_name">无效的个人资料名称</string>
|
||||
<string name="profile_empty">暂无配置文件</string>
|
||||
<string name="profile_current">当前配置文件</string>
|
||||
<string name="profile_remove_confirm">删除此配置文件?</string>
|
||||
<string name="current_profile">配置文件:%s</string>
|
||||
<string name="custom_locale">设定语言</string>
|
||||
<string name="follow_system_settings">跟随系统设置</string>
|
||||
<string name="show_crop_handle">限制扫描范围</string>
|
||||
@@ -119,6 +136,30 @@
|
||||
<string name="default_search_engine">打开未知数据方式</string>
|
||||
<string name="always_ask">总是询问</string>
|
||||
<string name="open_with_url">使用 URL 打开未知数据</string>
|
||||
|
||||
<string name="automated_actions">自动操作</string>
|
||||
<string name="automated_actions_none">没有自动操作</string>
|
||||
<string name="automated_actions_empty">尚无自动操作</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d 个自动操作</item>
|
||||
<item quantity="other">%d 个自动操作</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">添加操作</string>
|
||||
<string name="automated_action_edit">编辑操作</string>
|
||||
<string name="automated_action_regex">正则表达式</string>
|
||||
<string name="automated_action_regex_hint">例如 ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">需要正则表达式</string>
|
||||
<string name="automated_action_regex_invalid">正则表达式无效</string>
|
||||
<string name="automated_action_type">操作类型</string>
|
||||
<string name="automated_action_type_intent">打开 URL</string>
|
||||
<string name="automated_action_url_template">URL 模板</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">需要 URL 模板</string>
|
||||
<string name="automated_action_invalid_url">URL 模板无效</string>
|
||||
<string name="automated_action_remove_confirm">删除此操作?</string>
|
||||
<string name="automated_action_list_intent">打开 URL:%s</string>
|
||||
<string name="automated_action_list_intent_empty">打开 URL</string>
|
||||
<string name="automated_action_webview_title">自动操作</string>
|
||||
<string name="clear_network_suggestions">清除网络建议</string>
|
||||
<string name="clear_network_suggestions_summary">清除该应用之前提供的所有网络建议。</string>
|
||||
<string name="really_remove_all_networks">确定清除所有网络建议?</string>
|
||||
@@ -209,4 +250,18 @@
|
||||
<string name="wifi_phase2">阶段 2 方法</string>
|
||||
<string name="network_suggestions">网络建议</string>
|
||||
<string name="remove_suggestion">删除建议</string>
|
||||
<string name="email_to">收件人</string>
|
||||
<string name="email_subject">主题</string>
|
||||
<string name="email_body">正文</string>
|
||||
<string name="scheme">方案</string>
|
||||
<string name="host">主机</string>
|
||||
<string name="query">查询</string>
|
||||
<string name="automated_action_type_custom_intent">自定义 Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI 模板</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">需要 Intent URI</string>
|
||||
<string name="automated_action_intent_uri_invalid">Intent URI 无效</string>
|
||||
<string name="automated_action_list_custom_intent">自定义 Intent:%s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">自定义 Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources>
|
||||
<string name="welcome">歡迎!</string>
|
||||
<string name="mode_expert">進階</string>
|
||||
<string name="mode_expert_description">我想檢查讀取的內容並手動開啟。</string>
|
||||
<string name="mode_simple">簡單</string>
|
||||
<string name="mode_simple_description">我只想掃描條碼並立即開啟。</string>
|
||||
<string name="camera_error">無法開啟相機,請再試一次</string>
|
||||
<string name="scan_code">掃描條碼</string>
|
||||
<string name="compose_barcode">製作條碼</string>
|
||||
@@ -28,23 +33,23 @@
|
||||
<string name="gtin_add_on">UPC EAN 擴充</string>
|
||||
<string name="barcode_version_number">版本</string>
|
||||
<string name="qr_version_and_modules">%1$s (%2$d 模組)</string>
|
||||
<string name="qr_data_mask">Data mask</string>
|
||||
<string name="qr_data_mask">資料遮罩</string>
|
||||
<string name="toggle_flash">控制閃光燈</string>
|
||||
<string name="error_flash">控制閃光燈時發生錯誤</string>
|
||||
<string name="share">分享</string>
|
||||
<string name="share_file">分享檔案</string>
|
||||
<string name="share_as">您要以何種方式分享?</string>
|
||||
<string name="copy_to_clipboard">複製到剪貼簿</string>
|
||||
<string name="copy_as_deeplink">複製為深層連結</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_width_by_height">圖片尺寸: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">No magnification</string>
|
||||
<string name="add_quiet_zone">Add quiet zone</string>
|
||||
<string name="size_no_magnification">不擴大</string>
|
||||
<string name="add_quiet_zone">加上空白邊界</string>
|
||||
<string name="input_content_here">請在這裡輸入內容</string>
|
||||
<string name="unescape">展開逸出序列</string>
|
||||
<string name="encode">編碼</string>
|
||||
@@ -57,11 +62,12 @@
|
||||
<string name="bulk_mode_summary">始終開啟連續掃描</string>
|
||||
<string name="bulk_mode_delay">連續掃描間的延遲</string>
|
||||
<string name="restrict_format">限制格式</string>
|
||||
<string name="remove_restriction">刪除限制</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">掃描 %s</string>
|
||||
<string name="remove_restriction">移除限制</string>
|
||||
<string name="find_code">尋找代碼</string>
|
||||
<string name="find_code_with_content">什麼內容?</string>
|
||||
<string name="find_code_hint">術語或正規表達式</string>
|
||||
<string name="does_not_match_search_term">與搜尋詞不符</string>
|
||||
<string name="scan_for">掃描 %s</string>
|
||||
<string name="quarter_second">四分之一秒</string>
|
||||
<string name="half_second">半秒</string>
|
||||
<string name="a_second">1 秒</string>
|
||||
@@ -72,6 +78,17 @@
|
||||
<string name="scan_category">掃描</string>
|
||||
<string name="content_category">內容</string>
|
||||
<string name="locale_category">語言</string>
|
||||
<string name="profile_category">設定檔</string>
|
||||
<string name="profile">設定檔</string>
|
||||
<string name="profile_default">預設</string>
|
||||
<string name="profile_add">新增設定檔</string>
|
||||
<string name="profile_enter_name">輸入設定檔名稱</string>
|
||||
<string name="profile_enter_name_hint">名稱</string>
|
||||
<string name="profile_invalid_name">無效的個人資料名稱</string>
|
||||
<string name="profile_empty">尚無設定檔</string>
|
||||
<string name="profile_current">目前的設定檔</string>
|
||||
<string name="profile_remove_confirm">刪除此設定檔?</string>
|
||||
<string name="current_profile">設定檔:%s</string>
|
||||
<string name="custom_locale">設定語言</string>
|
||||
<string name="follow_system_settings">跟隨系統設定</string>
|
||||
<string name="show_crop_handle">顯示裁切範圍選擇器</string>
|
||||
@@ -98,10 +115,10 @@
|
||||
<string name="tone_prop_beep2">標準連續嗶聲</string>
|
||||
<string name="use_history">儲存掃描記錄</string>
|
||||
<string name="use_history_summary">在本機儲存掃描記錄</string>
|
||||
<string name="ignore_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_duplicates">略過重複項目</string>
|
||||
<string name="ignore_consecutive_duplicates">不儲存重複歷史記錄</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="ignore_any_duplicates">略過任何重複項目</string>
|
||||
<string name="accept_duplicates">接受重複</string>
|
||||
<string name="open_immediately">立即開啟</string>
|
||||
<string name="open_immediately_summary">跳過檢查並立即開啟。可能會開啟有害內容</string>
|
||||
<string name="copy_immediately">自動複製掃描結果到剪貼簿</string>
|
||||
@@ -110,15 +127,39 @@
|
||||
<string name="show_meta_data_summary">顯示已掃描條碼的額外資訊</string>
|
||||
<string name="show_hex_dump">顯示 Hex dump</string>
|
||||
<string name="show_hex_dump_summary">顯示已掃描條碼的十六進位轉儲資訊</string>
|
||||
<string name="show_checksum">Show checksum</string>
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_checksum">顯示校驗和</string>
|
||||
<string name="no_checksum">無檢查碼</string>
|
||||
<string name="show_recreation">顯示重新產生的條碼</string>
|
||||
<string name="show_recreation_summary">如果可以,從讀取內容中重新建立並顯示條碼</string>
|
||||
<string name="show_recreation_summary">盡可能從讀取內容中重新建立並顯示條碼</string>
|
||||
<string name="close_automatically">複製 / 分享後自動返回</string>
|
||||
<string name="close_automatically_summary">複製或分享讀取的內容後自動返回掃描畫面</string>
|
||||
<string name="default_search_engine">開啟未知資料的方式</string>
|
||||
<string name="always_ask">總是詢問</string>
|
||||
<string name="open_with_url">使用 URL 開啟未知資料</string>
|
||||
|
||||
<string name="automated_actions">自動操作</string>
|
||||
<string name="automated_actions_none">沒有自動操作</string>
|
||||
<string name="automated_actions_empty">尚無自動操作</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d 個自動操作</item>
|
||||
<item quantity="other">%d 個自動操作</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">新增操作</string>
|
||||
<string name="automated_action_edit">編輯操作</string>
|
||||
<string name="automated_action_regex">正則表達式</string>
|
||||
<string name="automated_action_regex_hint">例如 ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">需要正則表達式</string>
|
||||
<string name="automated_action_regex_invalid">正則表達式無效</string>
|
||||
<string name="automated_action_type">操作類型</string>
|
||||
<string name="automated_action_type_intent">開啟 URL</string>
|
||||
<string name="automated_action_url_template">URL 範本</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">需要 URL 範本</string>
|
||||
<string name="automated_action_invalid_url">URL 範本無效</string>
|
||||
<string name="automated_action_remove_confirm">刪除此操作?</string>
|
||||
<string name="automated_action_list_intent">開啟 URL:%s</string>
|
||||
<string name="automated_action_list_intent_empty">開啟 URL</string>
|
||||
<string name="automated_action_webview_title">自動操作</string>
|
||||
<string name="clear_network_suggestions">清除網路建議</string>
|
||||
<string name="clear_network_suggestions_summary">移除應用程式先前提供的所有網路建議</string>
|
||||
<string name="really_remove_all_networks">您確定要移除所有網路嗎?</string>
|
||||
@@ -142,9 +183,9 @@
|
||||
<string name="bluetooth_connect_fail">無法連線到藍牙裝置</string>
|
||||
<string name="bluetooth_send_fail">無法傳送到藍牙裝置</string>
|
||||
<string name="bluetooth_send_success">藍牙傳送完成</string>
|
||||
<string name="generation_category">Generation</string>
|
||||
<string name="brighten_screen">Brighten screen</string>
|
||||
<string name="brighten_screen_summary">Set brightness to maximum to enhance scanning a barcode from the screen.</string>
|
||||
<string name="generation_category">產生</string>
|
||||
<string name="brighten_screen">調亮螢幕</string>
|
||||
<string name="brighten_screen_summary">將螢幕亮度調至最亮,方便掃描螢幕上的條碼。</string>
|
||||
<string name="really_remove_scan">確定刪除記錄?</string>
|
||||
<string name="really_remove_all_scans">確定要刪除所有掃描記錄?</string>
|
||||
<string name="really_remove_selected_scans">確定要刪除選擇的掃描記錄?</string>
|
||||
@@ -194,7 +235,7 @@
|
||||
<string name="pick_code_to_scan">選擇要掃描的條碼</string>
|
||||
<string name="shortcut_decode">掃描條碼</string>
|
||||
<string name="shortcut_encode">建立條碼</string>
|
||||
<string name="shortcut_history">History</string>
|
||||
<string name="shortcut_history">歷史</string>
|
||||
<string name="shortcut_preferences">設定</string>
|
||||
<string name="background_request_failed">背景請求失敗</string>
|
||||
<string name="entry_type">類型</string>
|
||||
@@ -209,4 +250,18 @@
|
||||
<string name="wifi_phase2">Phase 2 方式</string>
|
||||
<string name="network_suggestions">網路建議</string>
|
||||
<string name="remove_suggestion">移除建議</string>
|
||||
<string name="email_to">收件者</string>
|
||||
<string name="email_subject">主旨</string>
|
||||
<string name="email_body">內文</string>
|
||||
<string name="scheme">方案</string>
|
||||
<string name="host">主機</string>
|
||||
<string name="query">查詢</string>
|
||||
<string name="automated_action_type_custom_intent">自訂 Intent</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI 範本</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">需要 Intent URI</string>
|
||||
<string name="automated_action_intent_uri_invalid">Intent URI 無效</string>
|
||||
<string name="automated_action_list_custom_intent">自訂 Intent:%s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">自訂 Intent</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -8,4 +8,55 @@
|
||||
<string name="md5" translatable="false">MD5</string>
|
||||
<string name="sha1" translatable="false">SHA1</string>
|
||||
<string name="sha256" translatable="false">SHA256</string>
|
||||
<string name="idl_vehicle_class">Vehicle Class</string>
|
||||
<string name="idl_restriction_codes">Restriction Codes</string>
|
||||
<string name="idl_endorsement_codes">Endorsement Codes</string>
|
||||
<string name="idl_date_of_expiry">Date of Expiry</string>
|
||||
<string name="idl_customer_family_name">Customer Family Name</string>
|
||||
<string name="idl_customer_first_name">Customer First Name</string>
|
||||
<string name="idl_customer_first_name_alt">Customer First Name Alt</string>
|
||||
<string name="idl_customer_middle_name">Customer Middle Name</string>
|
||||
<string name="idl_date_of_issue">Date of Issue</string>
|
||||
<string name="idl_date_of_birth">Date of Birth</string>
|
||||
<string name="idl_sex">Sex</string>
|
||||
<string name="idl_eye_color">Eye Color</string>
|
||||
<string name="idl_body_height">Body Height</string>
|
||||
<string name="idl_address_street">Address Street</string>
|
||||
<string name="idl_address_city">Address City</string>
|
||||
<string name="idl_address_jurisdiction_code">Address Jurisdiction Code</string>
|
||||
<string name="idl_address_postal_code">Address Postal Code</string>
|
||||
<string name="idl_customer_id_number">Customer ID Number</string>
|
||||
<string name="idl_document_discriminator">Document Discriminator</string>
|
||||
<string name="idl_country">Country</string>
|
||||
<string name="idl_family_name_truncation">Family Name Truncation</string>
|
||||
<string name="idl_first_name_truncation">First Name Truncation</string>
|
||||
<string name="idl_middle_name_truncation">Middle Name Truncation</string>
|
||||
<string name="idl_address_street_2">Address Street 2</string>
|
||||
<string name="idl_hair_color">Hair Color</string>
|
||||
<string name="idl_place_of_birth">Place of Birth</string>
|
||||
<string name="idl_audit_information">Audit Information</string>
|
||||
<string name="idl_inventory_control_number">Inventory Control Number</string>
|
||||
<string name="idl_alias_family_name">Alias Family Name</string>
|
||||
<string name="idl_alias_given_name">Alias Given Name</string>
|
||||
<string name="idl_alias_suffix_name">Alias Suffix Name</string>
|
||||
<string name="idl_name_suffix">Name Suffix</string>
|
||||
<string name="idl_weight_range">Weight Range</string>
|
||||
<string name="idl_ethnicity">Ethnicity</string>
|
||||
<string name="idl_standard_vehicle_classification">Standard Vehicle Classification</string>
|
||||
<string name="idl_standard_endorsement_code">Standard Endorsement Code</string>
|
||||
<string name="idl_standard_restriction_code">Standard Restriction Code</string>
|
||||
<string name="idl_vehicle_classification_description">Vehicle Classification Description</string>
|
||||
<string name="idl_endorsement_code_description">Endorsement Code Description</string>
|
||||
<string name="idl_restriction_code_description">Restriction Code Description</string>
|
||||
<string name="idl_compliance_type">Compliance Type</string>
|
||||
<string name="idl_card_revision_date">Card Revision Date</string>
|
||||
<string name="idl_hazmat_endorsement_expiration_date">Hazmat Endorsement Expiration Date</string>
|
||||
<string name="idl_limited_duration_document_indicator">Limited Duration Document Indicator</string>
|
||||
<string name="idl_weight_pounds">Weight (Pounds)</string>
|
||||
<string name="idl_weight_kilograms">Weight (Kilograms)</string>
|
||||
<string name="idl_under_18_until_date">Under 18 Until Date</string>
|
||||
<string name="idl_under_19_until_date">Under 19 Until Date</string>
|
||||
<string name="idl_under_21_until_date">Under 21 Until Date</string>
|
||||
<string name="idl_organ_donor_indicator">Organ Donor Indicator</string>
|
||||
<string name="idl_veteran_indicator">Veteran Indicator</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<string name="welcome">Welcome!</string>
|
||||
<string name="mode_expert">Advanced</string>
|
||||
<string name="mode_expert_description">I would like to check the read content and open it manually.</string>
|
||||
<string name="mode_simple">Simple</string>
|
||||
<string name="mode_simple_description">I just want to read barcodes and have them opened immediately.</string>
|
||||
<string name="camera_error">Can\'t access camera, please try again</string>
|
||||
<string name="scan_code">Scan code</string>
|
||||
<string name="compose_barcode">Compose barcode</string>
|
||||
@@ -36,9 +41,9 @@
|
||||
<string name="share_file">Share as file</string>
|
||||
<string name="share_as">Share as?</string>
|
||||
<string name="copy_to_clipboard">Copy to clipboard</string>
|
||||
<string name="copy_as_deeplink">Copy as deeplink</string>
|
||||
<string name="copied_to_clipboard">Copied to clipboard</string>
|
||||
<string name="copy_password">Copy password into clipboard</string>
|
||||
<string name="copied_password_to_clipboard">Password copied to clipboard</string>
|
||||
<string name="open_url">Open URL</string>
|
||||
<string name="cannot_resolve_action">No application can open that</string>
|
||||
<string name="pick_search_engine">Pick a search engine</string>
|
||||
@@ -61,8 +66,9 @@
|
||||
<string name="remove_restriction">Remove restriction</string>
|
||||
<string name="find_code">Find code</string>
|
||||
<string name="find_code_with_content">What content?</string>
|
||||
<string name="find_code_hint">Enter a term</string>
|
||||
<string name="scan_format">Scan %s</string>
|
||||
<string name="find_code_hint">Term or regular expression</string>
|
||||
<string name="does_not_match_search_term">Does not match search term</string>
|
||||
<string name="scan_for">Scan %s</string>
|
||||
<string name="quarter_second">A quarter second</string>
|
||||
<string name="half_second">Half a second</string>
|
||||
<string name="a_second">One second</string>
|
||||
@@ -73,6 +79,17 @@
|
||||
<string name="scan_category">Scan</string>
|
||||
<string name="content_category">Content</string>
|
||||
<string name="locale_category">Language</string>
|
||||
<string name="profile_category">Profile</string>
|
||||
<string name="profile">Profile</string>
|
||||
<string name="profile_default">Default</string>
|
||||
<string name="profile_add">Add new profile</string>
|
||||
<string name="profile_enter_name">Enter profile name</string>
|
||||
<string name="profile_enter_name_hint">Name</string>
|
||||
<string name="profile_invalid_name">Invalid profile name</string>
|
||||
<string name="profile_empty">No profiles yet</string>
|
||||
<string name="profile_current">Current profile</string>
|
||||
<string name="profile_remove_confirm">Remove this profile?</string>
|
||||
<string name="current_profile">Profile: %s</string>
|
||||
<string name="custom_locale">Custom language</string>
|
||||
<string name="follow_system_settings">Follow system settings</string>
|
||||
<string name="show_crop_handle">Show cropping limiter</string>
|
||||
@@ -115,11 +132,41 @@
|
||||
<string name="no_checksum">No checksum</string>
|
||||
<string name="show_recreation">Show recreated barcode</string>
|
||||
<string name="show_recreation_summary">Recreate and show barcode from read content if possible.</string>
|
||||
<string name="close_automatically">Go back after Copy/Share</string>
|
||||
<string name="close_automatically">Go back after copying or sharing</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">Open unknown data with URL</string>
|
||||
<string name="automated_actions">Automated actions</string>
|
||||
<string name="automated_actions_none">No automated actions</string>
|
||||
<string name="automated_actions_empty">No automated actions yet</string>
|
||||
<plurals name="automated_actions_count">
|
||||
<item quantity="one">%d automated action</item>
|
||||
<item quantity="other">%d automated actions</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Add action</string>
|
||||
<string name="automated_action_edit">Edit action</string>
|
||||
<string name="automated_action_regex">Regex</string>
|
||||
<string name="automated_action_regex_hint">e.g. ^https?://.*</string>
|
||||
<string name="automated_action_regex_required">Regex required</string>
|
||||
<string name="automated_action_regex_invalid">Invalid regex</string>
|
||||
<string name="automated_action_type">Action type</string>
|
||||
<string name="automated_action_type_intent">Open URL</string>
|
||||
<string name="automated_action_type_custom_intent">Custom intent</string>
|
||||
<string name="automated_action_url_template">URL template</string>
|
||||
<string name="automated_action_url_hint">https://example.com/?q={RESULT}</string>
|
||||
<string name="automated_action_url_required">URL template required</string>
|
||||
<string name="automated_action_intent_uri_template">Intent URI template</string>
|
||||
<string name="automated_action_intent_uri_hint">intent:#Intent;action=android.intent.action.SEND;type=text/plain;S.android.intent.extra.TEXT={RESULT};end</string>
|
||||
<string name="automated_action_intent_uri_required">Intent URI required</string>
|
||||
<string name="automated_action_intent_uri_invalid">Invalid Intent URI</string>
|
||||
<string name="automated_action_invalid_url">Invalid URL template</string>
|
||||
<string name="automated_action_remove_confirm">Remove this action?</string>
|
||||
<string name="automated_action_list_intent">Open URL: %s</string>
|
||||
<string name="automated_action_list_intent_empty">Open URL</string>
|
||||
<string name="automated_action_list_custom_intent">Custom intent: %s</string>
|
||||
<string name="automated_action_list_custom_intent_empty">Custom intent</string>
|
||||
<string name="automated_action_webview_title">Automated action</string>
|
||||
<string name="clear_network_suggestions">Remove network suggestions</string>
|
||||
<string name="clear_network_suggestions_summary">Remove network suggestions that were previously added with this app.</string>
|
||||
<string name="really_remove_all_networks">Really remove all networks?</string>
|
||||
@@ -139,7 +186,7 @@
|
||||
<string name="send_scan_bluetooth">Forward scans with Bluetooth</string>
|
||||
<string name="send_scan_bluetooth_summary">Enable to forward scans to a given Bluetooth host.</string>
|
||||
<string name="send_scan_bluetooth_host">Host</string>
|
||||
<string name="no_bluetooth_hosts_paired">No Hosts Paired</string>
|
||||
<string name="no_bluetooth_hosts_paired">No hosts paired</string>
|
||||
<string name="bluetooth_connect_fail">Could not connect to Bluetooth device.</string>
|
||||
<string name="bluetooth_send_fail">Could not send to Bluetooth device.</string>
|
||||
<string name="bluetooth_send_success">Successful Bluetooth send.</string>
|
||||
@@ -210,4 +257,10 @@
|
||||
<string name="wifi_phase2">Phase 2 method</string>
|
||||
<string name="network_suggestions">Network suggestions</string>
|
||||
<string name="remove_suggestion">Remove suggestion</string>
|
||||
<string name="email_to">Recipient</string>
|
||||
<string name="email_subject">Subject</string>
|
||||
<string name="email_body">Body</string>
|
||||
<string name="scheme">Scheme</string>
|
||||
<string name="host">Host</string>
|
||||
<string name="query">Query</string>
|
||||
</resources>
|
||||
|
||||
@@ -26,6 +26,26 @@
|
||||
<item name="android:paddingRight">@dimen/button_padding</item>
|
||||
<item name="android:maxLines">1</item>
|
||||
</style>
|
||||
<style name="WelcomeButton" parent="Button">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:background">@drawable/button_welcome</item>
|
||||
<item name="android:padding">24dp</item>
|
||||
</style>
|
||||
<style name="WelcomeButtonText">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:layout_marginBottom">8dp</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
<item name="android:textAppearance">?android:attr/textAppearanceLarge</item>
|
||||
</style>
|
||||
<style name="WelcomeButtonSubText">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
|
||||
</style>
|
||||
<style name="Spinner">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">wrap_content</item>
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:title="@string/preferences"
|
||||
android:key="preferences">
|
||||
<PreferenceCategory android:title="@string/profile_category">
|
||||
<Preference
|
||||
android:key="profile"
|
||||
android:title="@string/profile"
|
||||
android:summary="@string/profile_default"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/scan_category">
|
||||
<MultiSelectListPreference
|
||||
android:key="formats"
|
||||
@@ -145,6 +151,10 @@
|
||||
<de.markusfisch.android.binaryeye.preference.UrlPreference
|
||||
android:key="open_with_url"
|
||||
android:title="@string/open_with_url"/>
|
||||
<Preference
|
||||
android:key="automated_actions"
|
||||
android:title="@string/automated_actions"
|
||||
android:summary="@string/automated_actions_none"/>
|
||||
<Preference
|
||||
android:key="clear_network_suggestions"
|
||||
android:title="@string/clear_network_suggestions"
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:title="@string/preferences"
|
||||
android:key="preferences">
|
||||
<PreferenceCategory android:title="@string/profile_category">
|
||||
<Preference
|
||||
android:key="profile"
|
||||
android:title="@string/profile"
|
||||
android:summary="@string/profile_default"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/scan_category">
|
||||
<MultiSelectListPreference
|
||||
android:key="formats"
|
||||
@@ -145,6 +151,10 @@
|
||||
<de.markusfisch.android.binaryeye.preference.UrlPreference
|
||||
android:key="open_with_url"
|
||||
android:title="@string/open_with_url"/>
|
||||
<Preference
|
||||
android:key="automated_actions"
|
||||
android:title="@string/automated_actions"
|
||||
android:summary="@string/automated_actions_none"/>
|
||||
<Preference
|
||||
android:key="clear_network_suggestions"
|
||||
android:title="@string/clear_network_suggestions"
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:title="@string/preferences"
|
||||
android:key="preferences">
|
||||
<PreferenceCategory android:title="@string/profile_category">
|
||||
<Preference
|
||||
android:key="profile"
|
||||
android:title="@string/profile"
|
||||
android:summary="@string/profile_default"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/scan_category">
|
||||
<android.support.v7.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
@@ -140,6 +146,10 @@
|
||||
<de.markusfisch.android.binaryeye.preference.UrlPreference
|
||||
android:key="open_with_url"
|
||||
android:title="@string/open_with_url"/>
|
||||
<Preference
|
||||
android:key="automated_actions"
|
||||
android:title="@string/automated_actions"
|
||||
android:summary="@string/automated_actions_none"/>
|
||||
<Preference
|
||||
android:key="clear_network_suggestions"
|
||||
android:title="@string/clear_network_suggestions"
|
||||
|
||||
+11
@@ -97,6 +97,17 @@ class WifiConnectorTest {
|
||||
assertFalse(info.hidden)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun escapingEmojis() {
|
||||
val info = simpleDataAccessor(
|
||||
"""WIFI:S: ⚡ "Quick-Test, 3.141 @_'🥝/🍉:|:🍉\🥝'_@"\; + })]>!<[({ ⚓ ;;"""
|
||||
)
|
||||
assertEquals(
|
||||
" ⚡ \"Quick-Test, 3.141 @_'🥝/🍉:|:🍉\\🥝'_@\"; + })]>!<[({ ⚓ ",
|
||||
info.ssid
|
||||
)
|
||||
}
|
||||
|
||||
private fun simpleDataAccessor(wifiString: String): WifiConnector.SimpleDataAccessor {
|
||||
val map = WifiConnector.parseMap(wifiString)
|
||||
?: simpleFail("parsing map of valid string fails ($wifiString)")
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package de.markusfisch.android.binaryeye.net
|
||||
|
||||
import junit.framework.TestCase.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.robolectric.RobolectricTestRunner
|
||||
|
||||
@RunWith(RobolectricTestRunner::class)
|
||||
class BinaryEyeDeeplinkTest {
|
||||
|
||||
@Test
|
||||
fun isScanDeeplinkTests() {
|
||||
// Test for binaryeye://scan
|
||||
assertEquals(true, isScanDeeplink("binaryeye://scan"))
|
||||
assertEquals(true, isScanDeeplink("binaryeye://scan?param=value"))
|
||||
|
||||
// Test for http://markusfisch.de/BinaryEye
|
||||
assertEquals(true, isScanDeeplink("http://markusfisch.de/BinaryEye"))
|
||||
assertEquals(true, isScanDeeplink("http://markusfisch.de/BinaryEye?param=value"))
|
||||
|
||||
// Test for https://markusfisch.de/BinaryEye
|
||||
assertEquals(true, isScanDeeplink("https://markusfisch.de/BinaryEye"))
|
||||
assertEquals(true, isScanDeeplink("https://markusfisch.de/BinaryEye?param=value"))
|
||||
|
||||
// Negative tests
|
||||
assertEquals(false, isScanDeeplink("binaryeye://encode"))
|
||||
assertEquals(false, isScanDeeplink("http://markusfisch.de/encode"))
|
||||
assertEquals(false, isScanDeeplink("https://markusfisch.de/encode"))
|
||||
assertEquals(false, isScanDeeplink("http://example.com"))
|
||||
assertEquals(false, isScanDeeplink(""))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun isEncodeDeeplinkTests() {
|
||||
// Test for binaryeye://encode
|
||||
assertEquals(true, isEncodeDeeplink("binaryeye://encode"))
|
||||
assertEquals(true, isEncodeDeeplink("binaryeye://encode?param=value"))
|
||||
|
||||
// Test for http://markusfisch.de/encode
|
||||
assertEquals(true, isEncodeDeeplink("http://markusfisch.de/encode"))
|
||||
assertEquals(true, isEncodeDeeplink("http://markusfisch.de/encode?param=value"))
|
||||
|
||||
// Test for https://markusfisch.de/encode
|
||||
assertEquals(true, isEncodeDeeplink("https://markusfisch.de/encode"))
|
||||
assertEquals(true, isEncodeDeeplink("https://markusfisch.de/encode?param=value"))
|
||||
|
||||
// Negative tests
|
||||
assertEquals(false, isEncodeDeeplink("binaryeye://scan"))
|
||||
assertEquals(false, isEncodeDeeplink("http://markusfisch.de/BinaryEye"))
|
||||
assertEquals(false, isEncodeDeeplink("https://markusfisch.de/BinaryEye"))
|
||||
assertEquals(false, isEncodeDeeplink("http://example.com"))
|
||||
assertEquals(false, isEncodeDeeplink(""))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun createEncodeDeeplinkTests() {
|
||||
// Basic test
|
||||
assertEquals(
|
||||
"https://markusfisch.de/encode?format=QR_CODE&content=test",
|
||||
createEncodeDeeplink("QR_CODE", "test")
|
||||
)
|
||||
|
||||
// Test with special characters in content
|
||||
assertEquals(
|
||||
"https://markusfisch.de/encode?format=QR_CODE&content=test%20with%20spaces",
|
||||
createEncodeDeeplink("QR_CODE", "test with spaces")
|
||||
)
|
||||
|
||||
// Test with different barcode format
|
||||
assertEquals(
|
||||
"https://markusfisch.de/encode?format=CODE_128&content=123456",
|
||||
createEncodeDeeplink("CODE_128", "123456")
|
||||
)
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -1,8 +1,8 @@
|
||||
buildscript {
|
||||
ext {
|
||||
kotlin_version = '2.1.0'
|
||||
tools_version = '8.8.1'
|
||||
sdk_version = 35
|
||||
kotlin_version = '2.2.21'
|
||||
tools_version = '9.0.1'
|
||||
sdk_version = 36
|
||||
support_version = '25.3.1'
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
* إصلاح المعالجة المسبقة لنظام أندرويد 7+
|
||||
* إصلاح الأيقونات التكيفية لنظام أندرويد 8+
|
||||
@@ -0,0 +1,2 @@
|
||||
* إصلاح تحليل المنطقة الزمنية في تواريخ التقويم
|
||||
* تحديث الترجمة الفرنسية
|
||||
@@ -0,0 +1,11 @@
|
||||
* الترحيل إلى ZXing-C++ وإضافة دعم لرموز الاستجابة السريعة الصغيرة
|
||||
* عمليات مسح متعددة التحديد في قائمة المحفوظات
|
||||
* إزالة المحتوى المحدد مسبقًا لاختصار التشفير
|
||||
* إظهار إصدار رمز الاستجابة السريعة دائمًا وإزالة الإعدادات
|
||||
* إصلاح ترميز النص PDF-417 UTF-8
|
||||
* إخفاء المحتوى الحساس من الحافظة
|
||||
* إزالة إعداد لغة مخصصة على نظام أندرويد 13+
|
||||
* تكثيف إخراج نص الرموز الشريطية التي تم إنشاؤها
|
||||
* تحديث الترجمة الروسية
|
||||
* تحديث الترجمة الإسبانية
|
||||
* إضافة ترجمة فارسية
|
||||
@@ -0,0 +1 @@
|
||||
* إصلاح تكوين برو جارد
|
||||
@@ -0,0 +1,2 @@
|
||||
* إعادة إنشاء وإظهار الباركود من قراءة المحتويات إن أمكن
|
||||
* إضافة إيباي وأمازون و barcodelookup.com إلى محركات البحث
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user