Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4f36030e38 | ||
|
|
90c2c03d12 | ||
|
|
3f853be51a | ||
|
|
835a348fad | ||
|
|
198a35fc15 | ||
|
|
6be1b25c38 | ||
|
|
ac632e3aac | ||
|
|
ddc5a14558 | ||
|
|
8b1ffe3e5a | ||
|
|
e9ba66848f | ||
|
|
7bdef27a50 | ||
|
|
ccd16a0f95 | ||
|
|
a385678de1 | ||
|
|
43c597f6fb | ||
|
|
ecccf34418 | ||
|
|
4027ce2cc6 | ||
|
|
209e6c5c30 | ||
|
|
5e29f3fbe9 | ||
|
|
ba3d63277a | ||
|
|
fe34b7209d | ||
|
|
0efdca7b4a | ||
|
|
827fbedc1f | ||
|
|
107b5bafd4 | ||
|
|
19a71480fa | ||
|
|
909e97a591 | ||
|
|
bc2be96871 | ||
|
|
d834621d99 | ||
|
|
ad83be1a60 | ||
|
|
d65ea02b49 | ||
|
|
c8d1357ceb | ||
|
|
4c05d046e6 | ||
|
|
4423ee62c8 |
@@ -1,5 +1,24 @@
|
||||
# Change Log
|
||||
|
||||
## 1.69.1
|
||||
* Update translations
|
||||
|
||||
## 1.69.0
|
||||
* Add an option to show crosshairs
|
||||
* Add preference for codes that should not be saved
|
||||
* Add option to restrict searching to a specific format
|
||||
* Pin history items
|
||||
* Improve preference icons
|
||||
* Optimize vector drawables
|
||||
* Fix beeping when phone is set to Vibrate mode
|
||||
|
||||
## 1.68.7
|
||||
* Add icons to preferences screen
|
||||
* Update history listing on resume
|
||||
* Fix quiet zone for recreated barcodes
|
||||
* Fix automatic screen brightening
|
||||
* Migrate to CameraX
|
||||
|
||||
## 1.68.6
|
||||
* Update ZXingCpp
|
||||
* Ask for confirmation before deleting a scan from the result screen
|
||||
|
||||
+9
-3
@@ -8,8 +8,8 @@ android {
|
||||
minSdk 21
|
||||
targetSdk sdk_version
|
||||
|
||||
versionCode 160
|
||||
versionName '1.68.6'
|
||||
versionCode 163
|
||||
versionName '1.69.1'
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
@@ -76,11 +76,17 @@ dependencies {
|
||||
implementation "androidx.preference:preference:1.2.1"
|
||||
|
||||
// External
|
||||
implementation 'com.github.markusfisch:CameraView:1.10.0'
|
||||
implementation 'androidx.camera:camera-core:1.4.2'
|
||||
implementation 'androidx.camera:camera-camera2:1.4.2'
|
||||
implementation 'androidx.camera:camera-lifecycle:1.4.2'
|
||||
implementation 'androidx.camera:camera-view:1.4.2'
|
||||
implementation 'com.github.markusfisch:ScalingImageView:1.4.3'
|
||||
implementation 'com.github.markusfisch:zxing-cpp:v3.0.2.1'
|
||||
|
||||
// Testing
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.16.1'
|
||||
|
||||
// Debugging
|
||||
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14'
|
||||
}
|
||||
|
||||
@@ -148,6 +148,9 @@
|
||||
<activity
|
||||
android:name=".activity.AutomatedActionsActivity"
|
||||
android:exported="false"/>
|
||||
<activity
|
||||
android:name=".activity.IgnoreCodesActivity"
|
||||
android:exported="false"/>
|
||||
<activity
|
||||
android:name=".activity.NetworkSuggestionsActivity"
|
||||
android:exported="false"/>
|
||||
|
||||
+5
-8
@@ -2,12 +2,11 @@ package de.markusfisch.android.binaryeye.activity
|
||||
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Bundle
|
||||
import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import androidx.annotation.LayoutRes
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.isNotEmpty
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.PERMISSION_LOCATION
|
||||
import de.markusfisch.android.binaryeye.app.PERMISSION_WRITE
|
||||
import de.markusfisch.android.binaryeye.app.applyLocale
|
||||
@@ -15,15 +14,14 @@ import de.markusfisch.android.binaryeye.app.permissionGrantedCallback
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.view.initBars
|
||||
|
||||
abstract class ScreenActivity : AppCompatActivity() {
|
||||
abstract class AbstractBaseActivity : AppCompatActivity() {
|
||||
override fun attachBaseContext(base: Context?) {
|
||||
base?.applyLocale(prefs.customLocale)
|
||||
super.attachBaseContext(base)
|
||||
}
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setContentView(R.layout.activity_main)
|
||||
protected fun setScreenContentView(@LayoutRes layoutId: Int) {
|
||||
setContentView(layoutId)
|
||||
initBars()
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
}
|
||||
@@ -63,6 +61,5 @@ abstract class ScreenActivity : AppCompatActivity() {
|
||||
protected open fun onCreateOptionsMenu(
|
||||
menu: Menu,
|
||||
inflater: MenuInflater
|
||||
) {
|
||||
}
|
||||
) = Unit
|
||||
}
|
||||
+45
-12
@@ -10,34 +10,30 @@ import android.widget.ArrayAdapter
|
||||
import android.widget.EditText
|
||||
import android.widget.ListView
|
||||
import android.widget.RadioGroup
|
||||
import android.widget.Spinner
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.automation.AutomatedAction
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
|
||||
|
||||
class AutomatedActionsActivity : ScreenActivity() {
|
||||
class AutomatedActionsActivity : AbstractBaseActivity() {
|
||||
private val actions = ArrayList<AutomatedAction>()
|
||||
|
||||
private lateinit var adapter: ActionsAdapter
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_automated_actions)
|
||||
setTitle(R.string.automated_actions)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(
|
||||
R.layout.fragment_automated_actions,
|
||||
frame,
|
||||
false
|
||||
)
|
||||
frame.addView(view)
|
||||
|
||||
actions.clear()
|
||||
actions.addAll(prefs.automatedActions)
|
||||
|
||||
val listView = view.findViewById<ListView>(R.id.actions)
|
||||
listView.emptyView = view.findViewById(R.id.no_actions)
|
||||
val listView = findViewById<ListView>(R.id.actions)
|
||||
listView.emptyView = findViewById(R.id.no_actions)
|
||||
adapter = ActionsAdapter(this, actions)
|
||||
listView.adapter = adapter
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
@@ -49,11 +45,11 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.add).setOnClickListener {
|
||||
findViewById<View>(R.id.add).setOnClickListener {
|
||||
editAction(null)
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
}
|
||||
|
||||
@@ -64,6 +60,7 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
null
|
||||
)
|
||||
val regexView = view.findViewById<EditText>(R.id.regex)
|
||||
val formatView = view.findViewById<Spinner>(R.id.format)
|
||||
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)
|
||||
@@ -71,9 +68,31 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
val intentUriView = view.findViewById<EditText>(
|
||||
R.id.intent_uri_template
|
||||
)
|
||||
val names = resources.getStringArray(
|
||||
R.array.barcode_formats_names
|
||||
).toMutableList().apply {
|
||||
add(0, getString(R.string.all_formats))
|
||||
}
|
||||
val values = resources.getStringArray(
|
||||
R.array.barcode_formats_values
|
||||
).toMutableList().apply {
|
||||
add(0, "")
|
||||
}
|
||||
formatView.adapter = ArrayAdapter(
|
||||
this,
|
||||
android.R.layout.simple_spinner_item,
|
||||
names
|
||||
).apply {
|
||||
setDropDownViewResource(
|
||||
android.R.layout.simple_spinner_dropdown_item
|
||||
)
|
||||
}
|
||||
|
||||
if (action != null) {
|
||||
regexView.setText(action.pattern)
|
||||
formatView.setSelection(
|
||||
values.indexOf(action.format ?: "").coerceAtLeast(0)
|
||||
)
|
||||
when (action.type) {
|
||||
AutomatedAction.Type.Intent -> {
|
||||
urlView.setText(action.urlTemplate ?: "")
|
||||
@@ -83,6 +102,8 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
intentUriView.setText(action.intentUriTemplate ?: "")
|
||||
}
|
||||
}
|
||||
} else {
|
||||
formatView.setSelection(0)
|
||||
}
|
||||
|
||||
fun updateTypeSections(checkedId: Int) {
|
||||
@@ -122,6 +143,8 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
addOrUpdateAction(
|
||||
position,
|
||||
regexView,
|
||||
formatView,
|
||||
values,
|
||||
urlView,
|
||||
typeGroup,
|
||||
intentUriView,
|
||||
@@ -136,6 +159,8 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
private fun addOrUpdateAction(
|
||||
position: Int?,
|
||||
regexView: EditText,
|
||||
formatView: Spinner,
|
||||
values: List<String>,
|
||||
urlView: EditText,
|
||||
typeGroup: RadioGroup,
|
||||
intentUriView: EditText,
|
||||
@@ -153,6 +178,9 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
return
|
||||
}
|
||||
val isIntent = typeGroup.checkedRadioButtonId == R.id.action_type_intent
|
||||
val format = formatView.selectedItemPosition.let {
|
||||
values[it].ifEmpty { null }
|
||||
}
|
||||
val newAction = if (isIntent) {
|
||||
val urlTemplate = urlView.text.toString().trim()
|
||||
if (urlTemplate.isEmpty()) {
|
||||
@@ -162,6 +190,7 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
AutomatedAction(
|
||||
pattern = pattern,
|
||||
type = AutomatedAction.Type.Intent,
|
||||
format = format,
|
||||
urlTemplate = urlTemplate
|
||||
)
|
||||
} else {
|
||||
@@ -185,6 +214,7 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
AutomatedAction(
|
||||
pattern = pattern,
|
||||
type = AutomatedAction.Type.CustomIntent,
|
||||
format = format,
|
||||
intentUriTemplate = intentUriTemplate
|
||||
)
|
||||
}
|
||||
@@ -250,6 +280,9 @@ class AutomatedActionsActivity : ScreenActivity() {
|
||||
)
|
||||
}
|
||||
}
|
||||
action.format?.let { format ->
|
||||
subtitle.text = "${subtitle.text} (${format.prettifyFormatName()})"
|
||||
}
|
||||
}
|
||||
return view
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.SeekBar
|
||||
@@ -54,7 +53,7 @@ import java.util.Locale
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
|
||||
class BarcodeActivity : ScreenActivity() {
|
||||
class BarcodeActivity : AbstractBaseActivity() {
|
||||
private enum class FileType {
|
||||
PNG, JPG, SVG, TXT
|
||||
}
|
||||
@@ -64,26 +63,20 @@ class BarcodeActivity : ScreenActivity() {
|
||||
|
||||
private lateinit var imageView: ConfinedScalingImageView
|
||||
private lateinit var barcode: Barcode<*>
|
||||
private lateinit var addToHistoryItem: MenuItem
|
||||
private lateinit var brightenScreenItem: MenuItem
|
||||
|
||||
private var contentView: View? = null
|
||||
private var addToHistoryItem: MenuItem? = null
|
||||
private var brightenScreenItem: MenuItem? = null
|
||||
private var currentBrightness = -1f
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_barcode)
|
||||
setTitle(R.string.view_barcode)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(
|
||||
R.layout.fragment_barcode,
|
||||
frame,
|
||||
false
|
||||
)
|
||||
frame.addView(view)
|
||||
contentView = view
|
||||
contentView = findViewById(android.R.id.content)
|
||||
|
||||
// Make `imageView` available for `onPause()`.
|
||||
imageView = view.findViewById(R.id.barcode)
|
||||
imageView = findViewById(R.id.barcode)
|
||||
|
||||
val bitmap: Bitmap
|
||||
try {
|
||||
@@ -97,9 +90,7 @@ class BarcodeActivity : ScreenActivity() {
|
||||
if (message.isNullOrEmpty()) {
|
||||
message = getString(R.string.error_encoding_barcode)
|
||||
}
|
||||
message?.let {
|
||||
toast(message)
|
||||
}
|
||||
toast(message)
|
||||
finish()
|
||||
return
|
||||
}
|
||||
@@ -121,7 +112,7 @@ class BarcodeActivity : ScreenActivity() {
|
||||
)
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.share).setOnClickListener {
|
||||
findViewById<View>(R.id.share).setOnClickListener {
|
||||
it.context?.apply {
|
||||
pickFileType(R.string.share_as) { fileType ->
|
||||
shareAs(fileType)
|
||||
@@ -129,7 +120,7 @@ class BarcodeActivity : ScreenActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
imageView.doOnApplyWindowInsets { _, insets ->
|
||||
imageView.insets.set(insets)
|
||||
}
|
||||
@@ -173,9 +164,9 @@ class BarcodeActivity : ScreenActivity() {
|
||||
super.onResume()
|
||||
if (prefs.brightenScreen) {
|
||||
// Post to make sure brightenScreenItem is initialized.
|
||||
contentView?.post {
|
||||
contentView?.postDelayed({
|
||||
brightenScreen()
|
||||
}
|
||||
}, 500)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,7 +198,7 @@ class BarcodeActivity : ScreenActivity() {
|
||||
barcode.bitmap(),
|
||||
barcode.format
|
||||
)
|
||||
addToHistoryItem.isVisible = false
|
||||
addToHistoryItem?.isVisible = false
|
||||
toast(R.string.added_to_history)
|
||||
true
|
||||
}
|
||||
@@ -435,16 +426,19 @@ class BarcodeActivity : ScreenActivity() {
|
||||
}
|
||||
|
||||
private fun brightenScreen() {
|
||||
if (isFinishing || isDestroyed) {
|
||||
return
|
||||
}
|
||||
currentBrightness = getScreenBrightness()
|
||||
setScreenBrightness(1f)
|
||||
brightenScreenItem.isChecked = true
|
||||
brightenScreenItem?.isChecked = true
|
||||
}
|
||||
|
||||
private fun restoreScreenBrightness() {
|
||||
if (currentBrightness > -1f) {
|
||||
setScreenBrightness(currentBrightness)
|
||||
currentBrightness = -1f
|
||||
brightenScreenItem.isChecked = false
|
||||
brightenScreenItem?.isChecked = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -591,7 +585,10 @@ private fun readAndAddToHistory(
|
||||
formats = setOf(format)
|
||||
)
|
||||
)?.first {
|
||||
db.insertScan(it.toScan())
|
||||
val scan = it.toScan()
|
||||
if (!prefs.shouldIgnoreHistoryContent(scan.text, scan.format.name)) {
|
||||
db.insertScan(scan)
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,22 +8,37 @@ import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.graphics.Matrix
|
||||
import android.graphics.Rect
|
||||
import android.hardware.Camera
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.net.toUri
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewConfiguration
|
||||
import android.widget.EditText
|
||||
import android.widget.SeekBar
|
||||
import android.widget.Spinner
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.camera.core.Camera
|
||||
import androidx.camera.core.CameraSelector
|
||||
import androidx.camera.core.FocusMeteringAction
|
||||
import androidx.camera.core.ImageAnalysis
|
||||
import androidx.camera.core.ImageProxy
|
||||
import androidx.camera.core.Preview
|
||||
import androidx.camera.core.TorchState
|
||||
import androidx.camera.core.resolutionselector.AspectRatioStrategy
|
||||
import androidx.camera.core.resolutionselector.ResolutionSelector
|
||||
import androidx.camera.core.resolutionselector.ResolutionStrategy
|
||||
import androidx.camera.lifecycle.ProcessCameraProvider
|
||||
import androidx.camera.view.PreviewView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.edit
|
||||
import androidx.core.net.toUri
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
|
||||
import de.markusfisch.android.binaryeye.adapter.setupFormatSpinner
|
||||
import de.markusfisch.android.binaryeye.app.PERMISSION_CAMERA
|
||||
import de.markusfisch.android.binaryeye.app.applyLocale
|
||||
import de.markusfisch.android.binaryeye.app.db
|
||||
@@ -52,7 +67,6 @@ import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.widget.DetectorView
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
import de.markusfisch.android.binaryeye.zxingcpp.migrateBarcodeFormatName
|
||||
import de.markusfisch.android.cameraview.widget.CameraView
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Binarizer
|
||||
@@ -61,19 +75,36 @@ import de.markusfisch.android.zxingcpp.ZxingCpp.Result
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.TextMode
|
||||
import java.io.FileInputStream
|
||||
import java.util.Scanner
|
||||
import java.util.concurrent.ExecutorService
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class CameraActivity : AppCompatActivity() {
|
||||
private val frameRoi = Rect()
|
||||
private val previewRect = Rect()
|
||||
private val viewBounds = Rect()
|
||||
private val matrix = Matrix()
|
||||
private val analyzerExecutor: ExecutorService =
|
||||
Executors.newSingleThreadExecutor()
|
||||
private val readerOptions = ReaderOptions(
|
||||
tryHarder = prefs.tryHarder,
|
||||
tryRotate = prefs.autoRotate,
|
||||
tryInvert = true,
|
||||
tryDownscale = true,
|
||||
maxNumberOfSymbols = 1,
|
||||
textMode = TextMode.PLAIN
|
||||
)
|
||||
|
||||
private lateinit var cameraView: CameraView
|
||||
private lateinit var cameraView: PreviewView
|
||||
private lateinit var detectorView: DetectorView
|
||||
private lateinit var zoomBar: SeekBar
|
||||
private lateinit var flashFab: FloatingActionButton
|
||||
|
||||
private var cameraProvider: ProcessCameraProvider? = null
|
||||
private var camera: Camera? = null
|
||||
private var currentProfile = prefs.profile
|
||||
private var shouldStoreSettings = true
|
||||
private var formatsToRead = setOf<BarcodeFormat>()
|
||||
@@ -87,8 +118,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
private var restrictFormat: String? = null
|
||||
private var searchTerm: Regex? = null
|
||||
private var ignoreNext: String? = null
|
||||
private var fallbackBuffer: IntArray? = null
|
||||
private var requestCameraPermission = true
|
||||
private var useLocalAverage = false
|
||||
|
||||
override fun onRequestPermissionsResult(
|
||||
requestCode: Int,
|
||||
@@ -101,10 +132,14 @@ class CameraActivity : AppCompatActivity() {
|
||||
grantResults
|
||||
)
|
||||
when (requestCode) {
|
||||
PERMISSION_CAMERA -> if (grantResults.isNotEmpty() &&
|
||||
grantResults[0] != PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
toast(R.string.camera_error)
|
||||
PERMISSION_CAMERA -> {
|
||||
if (grantResults.isNotEmpty() &&
|
||||
grantResults[0] != PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
toast(R.string.camera_error)
|
||||
} else if (grantResults.isNotEmpty()) {
|
||||
bindCameraUseCases()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -142,12 +177,12 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
initBars()
|
||||
|
||||
cameraView = findViewById(R.id.camera_view) as CameraView
|
||||
detectorView = findViewById(R.id.detector_view) as DetectorView
|
||||
zoomBar = findViewById(R.id.zoom) as SeekBar
|
||||
flashFab = findViewById(R.id.flash) as FloatingActionButton
|
||||
cameraView = findViewById(R.id.camera_view)
|
||||
detectorView = findViewById(R.id.detector_view)
|
||||
zoomBar = findViewById(R.id.zoom)
|
||||
flashFab = findViewById(R.id.flash)
|
||||
|
||||
initCameraView()
|
||||
initPreviewView()
|
||||
initZoomBar()
|
||||
initDetectorView()
|
||||
|
||||
@@ -160,7 +195,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
fallbackBuffer = null
|
||||
analyzerExecutor.shutdown()
|
||||
releaseToneGenerators()
|
||||
}
|
||||
|
||||
@@ -180,7 +215,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
// for this session. Otherwise ActivityCompat.requestPermissions()
|
||||
// will trigger onResume() again and again.
|
||||
if (hasCameraPermission(requestCameraPermission)) {
|
||||
openCamera()
|
||||
bindCameraUseCases()
|
||||
}
|
||||
requestCameraPermission = false
|
||||
}
|
||||
@@ -204,7 +239,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
return false
|
||||
}
|
||||
shouldStoreSettings = false
|
||||
zoomBar.max = 0 // Reset zoom when there are no preferences yet.
|
||||
zoomBar.progress = INITIAL_ZOOM
|
||||
currentProfile = prefs.profile
|
||||
recreate()
|
||||
return true
|
||||
@@ -212,6 +247,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
private fun loadPreferences() {
|
||||
detectorView.updateCropHandlePos()
|
||||
detectorView.invalidate()
|
||||
updateHintsAndTitle()
|
||||
if (prefs.bulkMode && bulkMode != prefs.bulkMode) {
|
||||
bulkMode = prefs.bulkMode
|
||||
@@ -257,30 +293,19 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun openCamera() {
|
||||
cameraView.openAsync(
|
||||
CameraView.findCameraId(
|
||||
@Suppress("DEPRECATION")
|
||||
if (frontFacing) {
|
||||
Camera.CameraInfo.CAMERA_FACING_FRONT
|
||||
} else {
|
||||
Camera.CameraInfo.CAMERA_FACING_BACK
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
closeCamera()
|
||||
unbindCameraUseCases()
|
||||
if (shouldStoreSettings) {
|
||||
storeSettings()
|
||||
}
|
||||
shouldStoreSettings = true
|
||||
}
|
||||
|
||||
private fun closeCamera() {
|
||||
cameraView.close()
|
||||
private fun unbindCameraUseCases() {
|
||||
decoding = false
|
||||
cameraProvider?.unbindAll()
|
||||
camera = null
|
||||
}
|
||||
|
||||
private fun storeSettings() {
|
||||
@@ -290,7 +315,6 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
override fun onRestoreInstanceState(savedState: Bundle) {
|
||||
super.onRestoreInstanceState(savedState)
|
||||
zoomBar.max = savedState.getInt(ZOOM_MAX)
|
||||
zoomBar.progress = savedState.getInt(ZOOM_LEVEL)
|
||||
frontFacing = savedState.getBoolean(FRONT_FACING)
|
||||
bulkMode = savedState.getBoolean(BULK_MODE)
|
||||
@@ -299,7 +323,6 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
outState.putInt(ZOOM_MAX, zoomBar.max)
|
||||
outState.putInt(ZOOM_LEVEL, zoomBar.progress)
|
||||
outState.putBoolean(FRONT_FACING, frontFacing)
|
||||
outState.putBoolean(BULK_MODE, bulkMode)
|
||||
@@ -370,7 +393,7 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
R.id.find_code -> {
|
||||
askForCode()
|
||||
askForSearchTerm()
|
||||
true
|
||||
}
|
||||
|
||||
@@ -389,7 +412,9 @@ class CameraActivity : AppCompatActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
else -> super.onOptionsItemSelected(item)
|
||||
else -> {
|
||||
super.onOptionsItemSelected(item)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -398,9 +423,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
private fun switchCamera() {
|
||||
closeCamera()
|
||||
frontFacing = frontFacing xor true
|
||||
openCamera()
|
||||
bindCameraUseCases()
|
||||
}
|
||||
|
||||
private fun showRestrictionDialog() {
|
||||
@@ -426,23 +450,31 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
// Dialogs do not have a parent view.
|
||||
@SuppressLint("InflateParams")
|
||||
private fun askForCode() {
|
||||
val view = layoutInflater.inflate(R.layout.dialog_find_code, null)
|
||||
private fun askForSearchTerm() {
|
||||
val view = layoutInflater.inflate(R.layout.dialog_search_term, null)
|
||||
val editText = view.findViewById<EditText>(R.id.term)
|
||||
val formatView = view.findViewById<Spinner>(R.id.format)
|
||||
val values = setupFormatSpinner(formatView)
|
||||
searchTerm?.let {
|
||||
editText.setText(it.toString())
|
||||
}
|
||||
formatView.setSelection(
|
||||
values.indexOf(restrictFormat ?: "").coerceAtLeast(0)
|
||||
)
|
||||
AlertDialog.Builder(this)
|
||||
.setView(view)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
val term = editText.text.toString().trim()
|
||||
restrictFormat = values[formatView.selectedItemPosition].ifEmpty {
|
||||
null
|
||||
}
|
||||
if (!term.isEmpty()) {
|
||||
searchTerm = term.toRegex()
|
||||
} else {
|
||||
searchTerm = null
|
||||
}
|
||||
ignoreNext = null
|
||||
updateTitle()
|
||||
updateHintsAndTitle()
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ ->
|
||||
// do not change anything on cancel
|
||||
@@ -466,8 +498,13 @@ class CameraActivity : AppCompatActivity() {
|
||||
.setTitle(R.string.profile)
|
||||
.setItems(profiles) { _, which ->
|
||||
val newProfile = when (which) {
|
||||
0 -> null
|
||||
else -> profiles[which]
|
||||
0 -> {
|
||||
null
|
||||
}
|
||||
|
||||
else -> {
|
||||
profiles[which]
|
||||
}
|
||||
}
|
||||
if (currentProfile != newProfile) {
|
||||
storeSettings()
|
||||
@@ -505,38 +542,44 @@ class CameraActivity : AppCompatActivity() {
|
||||
if (file != null) {
|
||||
val fs = FileInputStream(file.fileDescriptor)
|
||||
val scn = Scanner(fs).useDelimiter("\\A")
|
||||
if (scn.hasNext()) {
|
||||
startActivity(
|
||||
EncodeActivity.newIntent(this, scn.next()).apply {
|
||||
addFlags(
|
||||
Intent.FLAG_ACTIVITY_NO_HISTORY or
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TASK or
|
||||
Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
)
|
||||
}
|
||||
)
|
||||
finish()
|
||||
}
|
||||
if (scn.hasNext()) {
|
||||
startActivity(
|
||||
EncodeActivity.newIntent(this, scn.next()).apply {
|
||||
addFlags(
|
||||
Intent.FLAG_ACTIVITY_NO_HISTORY or
|
||||
Intent.FLAG_ACTIVITY_CLEAR_TASK or
|
||||
Intent.FLAG_ACTIVITY_NEW_TASK
|
||||
)
|
||||
}
|
||||
)
|
||||
finish()
|
||||
}
|
||||
file.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun initCameraView() {
|
||||
cameraView.setUseOrientationListener(true)
|
||||
private fun initPreviewView() {
|
||||
cameraView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
|
||||
updateFrameRoiAndMappingMatrix()
|
||||
}
|
||||
@Suppress("ClickableViewAccessibility")
|
||||
val touchSlop = ViewConfiguration.get(this).scaledTouchSlop
|
||||
cameraView.setOnTouchListener(object : View.OnTouchListener {
|
||||
var focus = true
|
||||
var downY = -1f
|
||||
var offset = -1f
|
||||
var progress = 0
|
||||
var hasSwiped = false
|
||||
|
||||
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
|
||||
event ?: return false
|
||||
val pos = event.y
|
||||
when (event.actionMasked) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
downY = pos
|
||||
offset = pos
|
||||
progress = zoomBar.progress
|
||||
hasSwiped = false
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -551,136 +594,40 @@ class CameraActivity : AppCompatActivity() {
|
||||
maxValue,
|
||||
max(progress + change.roundToInt(), 0)
|
||||
)
|
||||
if (abs(pos - downY) > touchSlop) {
|
||||
hasSwiped = true
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP -> {
|
||||
// Stop calling focusTo() as soon as it returns false
|
||||
// to avoid throwing and catching future exceptions.
|
||||
if (focus) {
|
||||
focus = cameraView.focusTo(v, event.x, event.y)
|
||||
if (focus) {
|
||||
v?.performClick()
|
||||
return true
|
||||
if (!hasSwiped) {
|
||||
camera?.cameraControl?.apply {
|
||||
cancelFocusAndMetering()
|
||||
startFocusAndMetering(
|
||||
FocusMeteringAction.Builder(
|
||||
cameraView.meteringPointFactory.createPoint(
|
||||
event.x,
|
||||
event.y
|
||||
)
|
||||
).build()
|
||||
)
|
||||
}
|
||||
}
|
||||
v?.performClick()
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
})
|
||||
@Suppress("DEPRECATION")
|
||||
cameraView.setOnCameraListener(object : CameraView.OnCameraListener {
|
||||
override fun onConfigureParameters(
|
||||
parameters: Camera.Parameters
|
||||
) {
|
||||
zoomBar.visibility = if (parameters.isZoomSupported) {
|
||||
restoreZoomBarSettings()
|
||||
val max = parameters.maxZoom
|
||||
if (zoomBar.max != max) {
|
||||
zoomBar.max = max
|
||||
zoomBar.progress = max / 10
|
||||
storeZoomBarSettings()
|
||||
}
|
||||
parameters.zoom = zoomBar.progress
|
||||
View.VISIBLE
|
||||
} else {
|
||||
View.GONE
|
||||
}
|
||||
val sceneModes = parameters.supportedSceneModes
|
||||
sceneModes?.let {
|
||||
for (mode in sceneModes) {
|
||||
if (mode == Camera.Parameters.SCENE_MODE_BARCODE) {
|
||||
parameters.sceneMode = mode
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
CameraView.setAutoFocus(parameters)
|
||||
updateFlashFab(parameters.flashMode == null)
|
||||
}
|
||||
|
||||
override fun onCameraError() {
|
||||
this@CameraActivity.toast(R.string.camera_error)
|
||||
}
|
||||
|
||||
override fun onCameraReady(camera: Camera) {
|
||||
frameMetrics = FrameMetrics(
|
||||
cameraView.frameWidth,
|
||||
cameraView.frameHeight,
|
||||
cameraView.frameOrientation
|
||||
)
|
||||
updateFrameRoiAndMappingMatrix()
|
||||
ignoreNext = null
|
||||
decoding = true
|
||||
// These settings can't change while the camera is open.
|
||||
val options = ReaderOptions(
|
||||
tryHarder = prefs.tryHarder,
|
||||
tryRotate = prefs.autoRotate,
|
||||
tryInvert = true,
|
||||
tryDownscale = true,
|
||||
maxNumberOfSymbols = 1,
|
||||
textMode = TextMode.PLAIN
|
||||
)
|
||||
var useLocalAverage = false
|
||||
camera.setPreviewCallback { frameData, _ ->
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPreviewStarted(camera: Camera) {
|
||||
}
|
||||
|
||||
override fun onCameraStopping(camera: Camera) {
|
||||
camera.setPreviewCallback(null)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private fun initZoomBar() {
|
||||
zoomBar.max = 100
|
||||
zoomBar.progress = INITIAL_ZOOM
|
||||
restoreZoomBarSettings()
|
||||
zoomBar.setOnSeekBarChangeListener(object :
|
||||
SeekBar.OnSeekBarChangeListener {
|
||||
override fun onProgressChanged(
|
||||
@@ -688,35 +635,29 @@ class CameraActivity : AppCompatActivity() {
|
||||
progress: Int,
|
||||
fromUser: Boolean
|
||||
) {
|
||||
cameraView.camera?.setZoom(progress)
|
||||
val maxRatio = camera?.cameraInfo?.zoomState?.value
|
||||
?.maxZoomRatio ?: return
|
||||
camera?.cameraControl?.setZoomRatio(
|
||||
1f + progress / 100f * (maxRatio - 1f)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onStartTrackingTouch(seekBar: SeekBar) {}
|
||||
override fun onStartTrackingTouch(seekBar: SeekBar) {
|
||||
}
|
||||
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar) {}
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar) {
|
||||
storeZoomBarSettings()
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
private fun Camera.setZoom(zoom: Int) {
|
||||
try {
|
||||
val params = parameters
|
||||
params.zoom = zoom
|
||||
parameters = params
|
||||
} catch (_: RuntimeException) {
|
||||
// Ignore. There's nothing we can do.
|
||||
}
|
||||
}
|
||||
|
||||
private fun storeZoomBarSettings() {
|
||||
prefs.preferences.edit {
|
||||
putInt(ZOOM_MAX, zoomBar.max)
|
||||
putInt(ZOOM_LEVEL, zoomBar.progress)
|
||||
}
|
||||
}
|
||||
|
||||
private fun restoreZoomBarSettings() {
|
||||
zoomBar.max = prefs.preferences.getInt(ZOOM_MAX, zoomBar.max)
|
||||
zoomBar.progress = prefs.preferences.getInt(
|
||||
ZOOM_LEVEL,
|
||||
zoomBar.progress
|
||||
@@ -735,52 +676,229 @@ class CameraActivity : AppCompatActivity() {
|
||||
detectorView.cropHandleName = "camera_crop_handle"
|
||||
}
|
||||
|
||||
private fun bindCameraUseCases() {
|
||||
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
|
||||
cameraProviderFuture.addListener({
|
||||
if (isDestroyed) {
|
||||
return@addListener
|
||||
}
|
||||
val provider = try {
|
||||
cameraProviderFuture.get()
|
||||
} catch (_: Exception) {
|
||||
toast(R.string.camera_error)
|
||||
return@addListener
|
||||
}
|
||||
cameraProvider = provider
|
||||
val resolutionSelector = ResolutionSelector.Builder()
|
||||
.setResolutionStrategy(
|
||||
ResolutionStrategy.HIGHEST_AVAILABLE_STRATEGY
|
||||
)
|
||||
.setAspectRatioStrategy(
|
||||
AspectRatioStrategy.RATIO_16_9_FALLBACK_AUTO_STRATEGY
|
||||
)
|
||||
.setAllowedResolutionMode(
|
||||
ResolutionSelector.PREFER_HIGHER_RESOLUTION_OVER_CAPTURE_RATE
|
||||
)
|
||||
.build()
|
||||
val preview = Preview.Builder()
|
||||
.setResolutionSelector(resolutionSelector)
|
||||
.build()
|
||||
val imageAnalysis = ImageAnalysis.Builder()
|
||||
.setResolutionSelector(resolutionSelector)
|
||||
.setBackpressureStrategy(
|
||||
ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
|
||||
)
|
||||
.build()
|
||||
|
||||
imageAnalysis.setAnalyzer(analyzerExecutor) { image ->
|
||||
analyzeImage(image)
|
||||
}
|
||||
|
||||
val cameraSelector = CameraSelector.Builder()
|
||||
.requireLensFacing(
|
||||
if (frontFacing) {
|
||||
CameraSelector.LENS_FACING_FRONT
|
||||
} else {
|
||||
CameraSelector.LENS_FACING_BACK
|
||||
}
|
||||
)
|
||||
.build()
|
||||
|
||||
try {
|
||||
provider.unbindAll()
|
||||
camera = provider.bindToLifecycle(
|
||||
this,
|
||||
cameraSelector,
|
||||
preview,
|
||||
imageAnalysis
|
||||
)
|
||||
preview.surfaceProvider = cameraView.surfaceProvider
|
||||
ignoreNext = null
|
||||
decoding = true
|
||||
useLocalAverage = false
|
||||
updateZoomState()
|
||||
updateFlashFab(camera?.cameraInfo?.hasFlashUnit() ?: false)
|
||||
updateFrameRoiAndMappingMatrix()
|
||||
} catch (_: Exception) {
|
||||
camera = null
|
||||
toast(R.string.camera_error)
|
||||
}
|
||||
}, ContextCompat.getMainExecutor(this))
|
||||
}
|
||||
|
||||
private fun analyzeImage(image: ImageProxy) {
|
||||
try {
|
||||
if (!decoding) {
|
||||
return
|
||||
}
|
||||
frameMetrics = FrameMetrics(
|
||||
image.width,
|
||||
image.height,
|
||||
image.imageInfo.rotationDegrees
|
||||
)
|
||||
updateFrameRoiAndMappingMatrix()
|
||||
if (frameRoi.width() < 1 || frameRoi.height() < 1) {
|
||||
return
|
||||
}
|
||||
useLocalAverage = useLocalAverage xor true
|
||||
val yPlane = image.planes[0]
|
||||
ZxingCpp.readYBuffer(
|
||||
yPlane.buffer,
|
||||
yPlane.rowStride,
|
||||
frameRoi,
|
||||
frameMetrics.orientation,
|
||||
readerOptions.apply {
|
||||
binarizer = if (useLocalAverage) {
|
||||
Binarizer.LOCAL_AVERAGE
|
||||
} else {
|
||||
Binarizer.GLOBAL_HISTOGRAM
|
||||
}
|
||||
formats = formatsToRead
|
||||
tryHarder = prefs.tryHarder
|
||||
tryRotate = prefs.autoRotate
|
||||
}
|
||||
)?.firstOrNull()?.let { result ->
|
||||
handleDecodeResult(result)
|
||||
}
|
||||
} finally {
|
||||
image.close()
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleDecodeResult(result: Result) {
|
||||
val text = result.text
|
||||
if (text == ignoreNext) {
|
||||
return
|
||||
}
|
||||
val term = searchTerm
|
||||
if (term != null &&
|
||||
!text.matches(term) &&
|
||||
!text.contains(term)
|
||||
) {
|
||||
ignoreNext = text
|
||||
cameraView.post {
|
||||
errorFeedback()
|
||||
toast(R.string.does_not_match_search_term)
|
||||
}
|
||||
return
|
||||
}
|
||||
decoding = false
|
||||
postResult(result)
|
||||
}
|
||||
|
||||
private fun updateZoomState() {
|
||||
zoomBar.visibility = if (
|
||||
camera?.cameraInfo?.zoomState?.value != null
|
||||
) {
|
||||
View.VISIBLE
|
||||
} else {
|
||||
View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateFrameRoiAndMappingMatrix() {
|
||||
val viewRect = cameraView.previewRect
|
||||
if (viewRect.width() < 1 ||
|
||||
viewRect.height() < 1 ||
|
||||
viewBounds.set(0, 0, cameraView.width, cameraView.height)
|
||||
if (viewBounds.width() < 1 ||
|
||||
viewBounds.height() < 1 ||
|
||||
!frameMetrics.isValid()
|
||||
) {
|
||||
return
|
||||
}
|
||||
previewRect.setCovered(
|
||||
viewBounds.width(),
|
||||
viewBounds.height(),
|
||||
frameMetrics
|
||||
)
|
||||
val viewRoi = if (
|
||||
detectorView.roi.width() < 1 ||
|
||||
detectorView.roi.height() < 1
|
||||
) {
|
||||
viewRect
|
||||
viewBounds
|
||||
} else {
|
||||
detectorView.roi
|
||||
}
|
||||
frameRoi.setFrameRoi(frameMetrics, viewRect, viewRoi)
|
||||
matrix.setFrameToView(frameMetrics, viewRect, viewRoi)
|
||||
frameRoi.setFrameRoi(frameMetrics, previewRect, viewRoi)
|
||||
matrix.setFrameToView(frameMetrics, previewRect, viewRoi)
|
||||
}
|
||||
|
||||
private fun updateFlashFab(unavailable: Boolean) {
|
||||
if (unavailable) {
|
||||
flashFab.setImageResource(R.drawable.ic_action_create)
|
||||
flashFab.setOnClickListener { createBarcode() }
|
||||
} else {
|
||||
private fun updateFlashFab(available: Boolean) {
|
||||
if (available) {
|
||||
flashFab.setImageResource(R.drawable.ic_action_flash)
|
||||
flashFab.setOnClickListener { toggleTorchMode() }
|
||||
} else {
|
||||
flashFab.setImageResource(R.drawable.ic_action_create)
|
||||
flashFab.setOnClickListener { createBarcode() }
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION")
|
||||
private fun toggleTorchMode() {
|
||||
val camera = cameraView.camera ?: return
|
||||
val parameters = camera.parameters ?: return
|
||||
parameters.flashMode = if (
|
||||
parameters.flashMode != Camera.Parameters.FLASH_MODE_OFF
|
||||
val currentState = camera?.cameraInfo?.torchState?.value ?: return
|
||||
camera?.cameraControl?.enableTorch(
|
||||
currentState != TorchState.ON
|
||||
)
|
||||
}
|
||||
|
||||
private fun Rect.setCovered(
|
||||
viewWidth: Int,
|
||||
viewHeight: Int,
|
||||
frameMetrics: FrameMetrics
|
||||
) {
|
||||
val frameWidth: Int
|
||||
val frameHeight: Int
|
||||
when (frameMetrics.orientation) {
|
||||
90, 270 -> {
|
||||
frameWidth = frameMetrics.height
|
||||
frameHeight = frameMetrics.width
|
||||
}
|
||||
|
||||
else -> {
|
||||
frameWidth = frameMetrics.width
|
||||
frameHeight = frameMetrics.height
|
||||
}
|
||||
}
|
||||
if (frameWidth < 1 || frameHeight < 1) {
|
||||
set(0, 0, 0, 0)
|
||||
return
|
||||
}
|
||||
var coveredWidth = frameWidth
|
||||
var coveredHeight = frameHeight
|
||||
if (viewWidth.toLong() * coveredWidth <
|
||||
viewHeight.toLong() * coveredHeight
|
||||
) {
|
||||
Camera.Parameters.FLASH_MODE_OFF
|
||||
coveredWidth = coveredWidth * viewHeight / coveredHeight
|
||||
coveredHeight = viewHeight
|
||||
} else {
|
||||
Camera.Parameters.FLASH_MODE_TORCH
|
||||
}
|
||||
try {
|
||||
camera.parameters = parameters
|
||||
} catch (e: RuntimeException) {
|
||||
toast(e.message ?: getString(R.string.error_flash))
|
||||
coveredHeight = coveredHeight * viewWidth / coveredWidth
|
||||
coveredWidth = viewWidth
|
||||
}
|
||||
val left = (viewWidth - coveredWidth) / 2
|
||||
val top = (viewHeight - coveredHeight) / 2
|
||||
set(
|
||||
left,
|
||||
top,
|
||||
left + coveredWidth,
|
||||
top + coveredHeight
|
||||
)
|
||||
}
|
||||
|
||||
private fun postResult(result: Result) {
|
||||
@@ -808,9 +926,11 @@ class CameraActivity : AppCompatActivity() {
|
||||
finish()
|
||||
}
|
||||
|
||||
returnUri != null -> execShareIntent(
|
||||
Intent(Intent.ACTION_VIEW, returnUri)
|
||||
)
|
||||
returnUri != null -> {
|
||||
execShareIntent(
|
||||
Intent(Intent.ACTION_VIEW, returnUri)
|
||||
)
|
||||
}
|
||||
|
||||
else -> {
|
||||
showResult(result, bulkMode)
|
||||
@@ -825,10 +945,12 @@ class CameraActivity : AppCompatActivity() {
|
||||
if (bulkMode) {
|
||||
when (prefs.ignoreDuplicates()) {
|
||||
Preferences.Companion.IgnoreDuplicates.Consecutive,
|
||||
Preferences.Companion.IgnoreDuplicates.Any ->
|
||||
Preferences.Companion.IgnoreDuplicates.Any -> {
|
||||
ignoreNext = result.text
|
||||
}
|
||||
|
||||
else -> Unit
|
||||
else -> {
|
||||
}
|
||||
}
|
||||
if (prefs.showToastInBulkMode) {
|
||||
toast(result.text)
|
||||
@@ -842,8 +964,8 @@ class CameraActivity : AppCompatActivity() {
|
||||
|
||||
companion object {
|
||||
private const val PICK_FILE_RESULT_CODE = 1
|
||||
private const val ZOOM_MAX = "zoom_max"
|
||||
private const val ZOOM_LEVEL = "zoom_level"
|
||||
private const val INITIAL_ZOOM = 0
|
||||
private const val ZOOM_LEVEL = "zoom"
|
||||
private const val FRONT_FACING = "front_facing"
|
||||
private const val BULK_MODE = "bulk_mode"
|
||||
private const val RESTRICT_FORMAT = "restrict_format"
|
||||
@@ -863,7 +985,9 @@ fun Activity.showResult(
|
||||
copyToClipboard(result.text)
|
||||
}
|
||||
val scan = result.toScan()
|
||||
if (prefs.useHistory) {
|
||||
if (prefs.useHistory &&
|
||||
!prefs.shouldIgnoreHistoryContent(scan.text, scan.format.name)
|
||||
) {
|
||||
scan.id = db.insertScan(scan)
|
||||
}
|
||||
if (prefs.sendScanActive && prefs.sendScanUrl.isNotEmpty()) {
|
||||
@@ -906,7 +1030,9 @@ fun Activity.showResult(
|
||||
R.string.bluetooth_send_fail
|
||||
}
|
||||
|
||||
else -> R.string.bluetooth_send_success
|
||||
else -> {
|
||||
R.string.bluetooth_send_success
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -930,10 +1056,10 @@ private fun getReturnIntent(result: Result) = Intent().apply {
|
||||
}
|
||||
|
||||
private fun completeUrl(urlTemplate: String, result: Result) = (
|
||||
urlTemplate
|
||||
.replace("{RESULT}", result.text.urlEncode())
|
||||
.replace("{RESULT_BYTES}", result.rawBytes.toHexString())
|
||||
.replace("{FORMAT}", result.format.name.urlEncode())
|
||||
// And support {CODE} from the old ZXing app, too.
|
||||
.replace("{CODE}", result.text.urlEncode())
|
||||
).toUri()
|
||||
urlTemplate
|
||||
.replace("{RESULT}", result.text.urlEncode())
|
||||
.replace("{RESULT_BYTES}", result.rawBytes.toHexString())
|
||||
.replace("{FORMAT}", result.format.name.urlEncode())
|
||||
// And support {CODE} from the old ZXing app, too.
|
||||
.replace("{CODE}", result.text.urlEncode())
|
||||
).toUri()
|
||||
|
||||
@@ -9,8 +9,6 @@ import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.provider.DocumentsContract
|
||||
import androidx.core.net.toUri
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import android.text.Editable
|
||||
import android.text.Html
|
||||
import android.text.Spannable
|
||||
@@ -22,12 +20,13 @@ import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.EditText
|
||||
import android.widget.ImageView
|
||||
import android.widget.TableLayout
|
||||
import android.widget.TableRow
|
||||
import android.widget.TextView
|
||||
import androidx.core.net.toUri
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.actions.ActionRegistry
|
||||
import de.markusfisch.android.binaryeye.actions.mail.MatMsg
|
||||
@@ -72,7 +71,7 @@ import java.io.File
|
||||
import java.security.MessageDigest
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
class DecodeActivity : ScreenActivity() {
|
||||
class DecodeActivity : AbstractBaseActivity() {
|
||||
private lateinit var contentView: EditText
|
||||
private lateinit var formatView: TextView
|
||||
private lateinit var dataView: TableLayout
|
||||
@@ -119,14 +118,8 @@ class DecodeActivity : ScreenActivity() {
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_decode)
|
||||
setTitle(R.string.content)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(
|
||||
R.layout.fragment_decode,
|
||||
frame,
|
||||
false
|
||||
)
|
||||
frame.addView(view)
|
||||
|
||||
val justScanned = intent.hasExtra(DECODED) || intent.hasExtra(DECODED_SCAN)
|
||||
closeAutomatically = prefs.closeAutomatically && justScanned
|
||||
@@ -139,15 +132,15 @@ class DecodeActivity : ScreenActivity() {
|
||||
format = scan.format.name
|
||||
recreationSize = (200f * dp).roundToInt()
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
formatView = view.findViewById(R.id.format)
|
||||
dataView = view.findViewById(R.id.data)
|
||||
metaView = view.findViewById(R.id.meta)
|
||||
hexView = view.findViewById(R.id.hex)
|
||||
stampView = view.findViewById(R.id.stamp)
|
||||
recreationView = view.findViewById(R.id.recreation)
|
||||
labelView = view.findViewById(R.id.label)
|
||||
fab = view.findViewById(R.id.open)
|
||||
contentView = findViewById(R.id.content)
|
||||
formatView = findViewById(R.id.format)
|
||||
dataView = findViewById(R.id.data)
|
||||
metaView = findViewById(R.id.meta)
|
||||
hexView = findViewById(R.id.hex)
|
||||
stampView = findViewById(R.id.stamp)
|
||||
recreationView = findViewById(R.id.recreation)
|
||||
labelView = findViewById(R.id.label)
|
||||
fab = findViewById(R.id.open)
|
||||
|
||||
if (prefs.showMetaData) {
|
||||
metaView.fillMetaView(scan)
|
||||
@@ -164,8 +157,8 @@ class DecodeActivity : ScreenActivity() {
|
||||
labelView.visibility = View.GONE
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
view.findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
|
||||
|
||||
initContentAndFab(justScanned)
|
||||
updateViewsAndFab(scan.text, originalBytes)
|
||||
@@ -291,7 +284,8 @@ class DecodeActivity : ScreenActivity() {
|
||||
ContentBarcode(
|
||||
content,
|
||||
scan.format,
|
||||
scan.errorCorrectionLevel.toErrorCorrectionInt()
|
||||
scan.errorCorrectionLevel.toErrorCorrectionInt(),
|
||||
margin = 1
|
||||
)
|
||||
}
|
||||
try {
|
||||
@@ -360,12 +354,12 @@ class DecodeActivity : ScreenActivity() {
|
||||
)
|
||||
}
|
||||
|
||||
is WebAction -> try {
|
||||
items.putAll(
|
||||
text.toUri().run {
|
||||
mapOf(
|
||||
R.string.scheme to scheme,
|
||||
R.string.host to host,
|
||||
is WebAction -> try {
|
||||
items.putAll(
|
||||
text.toUri().run {
|
||||
mapOf(
|
||||
R.string.scheme to scheme,
|
||||
R.string.host to host,
|
||||
R.string.query to query
|
||||
)
|
||||
}
|
||||
|
||||
@@ -3,21 +3,19 @@ package de.markusfisch.android.binaryeye.activity
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.widget.SwitchCompat
|
||||
import androidx.core.net.toUri
|
||||
import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.AdapterView
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.CheckBox
|
||||
import android.widget.EditText
|
||||
import android.widget.Spinner
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.widget.SwitchCompat
|
||||
import androidx.core.net.toUri
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
@@ -31,7 +29,7 @@ import java.io.InputStream
|
||||
import kotlin.math.min
|
||||
|
||||
|
||||
class EncodeActivity : ScreenActivity() {
|
||||
class EncodeActivity : AbstractBaseActivity() {
|
||||
private lateinit var formatView: Spinner
|
||||
private lateinit var ecLabel: TextView
|
||||
private lateinit var ecSpinner: Spinner
|
||||
@@ -97,16 +95,10 @@ class EncodeActivity : ScreenActivity() {
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_encode)
|
||||
setTitle(R.string.compose_barcode)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(
|
||||
R.layout.fragment_encode,
|
||||
frame,
|
||||
false
|
||||
)
|
||||
frame.addView(view)
|
||||
|
||||
formatView = view.findViewById(R.id.format)
|
||||
formatView = findViewById(R.id.format)
|
||||
val formatAdapter = ArrayAdapter(
|
||||
this,
|
||||
android.R.layout.simple_spinner_item,
|
||||
@@ -152,8 +144,8 @@ class EncodeActivity : ScreenActivity() {
|
||||
override fun onNothingSelected(parentView: AdapterView<*>?) {}
|
||||
}
|
||||
|
||||
ecLabel = view.findViewById(R.id.error_correction_label)
|
||||
ecSpinner = view.findViewById(R.id.error_correction_level)
|
||||
ecLabel = findViewById(R.id.error_correction_label)
|
||||
ecSpinner = findViewById(R.id.error_correction_level)
|
||||
ecSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
|
||||
override fun onItemSelected(
|
||||
parentView: AdapterView<*>?,
|
||||
@@ -171,13 +163,13 @@ class EncodeActivity : ScreenActivity() {
|
||||
override fun onNothingSelected(parentView: AdapterView<*>?) {}
|
||||
}
|
||||
|
||||
colorsLabel = view.findViewById(R.id.colors_label)
|
||||
colorsSpinner = view.findViewById(R.id.colors)
|
||||
addQuietZoneSwitch = view.findViewById(R.id.add_quiet_zone)
|
||||
colorsLabel = findViewById(R.id.colors_label)
|
||||
colorsSpinner = findViewById(R.id.colors)
|
||||
addQuietZoneSwitch = findViewById(R.id.add_quiet_zone)
|
||||
addQuietZoneSwitch.isChecked = prefs.addQuietZone
|
||||
|
||||
contentView = view.findViewById(R.id.content)
|
||||
unescapeCheckBox = view.findViewById(R.id.unescape)
|
||||
contentView = findViewById(R.id.content)
|
||||
unescapeCheckBox = findViewById(R.id.unescape)
|
||||
unescapeCheckBox.isChecked = prefs.expandEscapeSequences
|
||||
|
||||
var complete = false
|
||||
@@ -203,18 +195,18 @@ class EncodeActivity : ScreenActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.encode).setOnClickListener {
|
||||
findViewById<View>(R.id.encode).setOnClickListener {
|
||||
it.context.encode()
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
view.findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.scroll_view).setPaddingFromWindowInsets()
|
||||
|
||||
if (complete &&
|
||||
args?.getBoolean(EXECUTE, false) == true
|
||||
) {
|
||||
view.post {
|
||||
val content = view.context.getContent() ?: return@post
|
||||
contentView.post {
|
||||
val content = contentView.context.getContent() ?: return@post
|
||||
startActivity(newBarcodeIntent(content))
|
||||
finish()
|
||||
}
|
||||
@@ -412,6 +404,7 @@ private fun BarcodeFormat.getErrorCorrectionLevel(position: Int) = when (this) {
|
||||
BarcodeFormat.Aztec -> position
|
||||
BarcodeFormat.QRCode,
|
||||
BarcodeFormat.MicroQRCode -> (position + 1) * 2
|
||||
|
||||
BarcodeFormat.RMQRCode -> (position + 1) * 4
|
||||
BarcodeFormat.PDF417 -> position
|
||||
else -> 0
|
||||
|
||||
@@ -13,7 +13,6 @@ import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.EditText
|
||||
import android.widget.ListView
|
||||
import androidx.appcompat.view.ActionMode
|
||||
@@ -48,7 +47,7 @@ import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class HistoryActivity : ScreenActivity() {
|
||||
class HistoryActivity : AbstractBaseActivity() {
|
||||
private lateinit var useHistorySwitch: SwitchCompat
|
||||
private lateinit var listView: ListView
|
||||
private lateinit var fab: View
|
||||
@@ -141,17 +140,15 @@ class HistoryActivity : ScreenActivity() {
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_history)
|
||||
setTitle(R.string.history)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(R.layout.fragment_history, frame, false)
|
||||
frame.addView(view)
|
||||
|
||||
useHistorySwitch = view.findViewById(
|
||||
useHistorySwitch = findViewById(
|
||||
R.id.use_history
|
||||
)
|
||||
initHistorySwitch(useHistorySwitch)
|
||||
|
||||
listView = view.findViewById(R.id.scans)
|
||||
listView = findViewById(R.id.scans)
|
||||
listView.setOnItemClickListener { _, v, position, id ->
|
||||
if (actionMode != null) {
|
||||
scansAdapter?.select(v, id, position)
|
||||
@@ -170,17 +167,15 @@ class HistoryActivity : ScreenActivity() {
|
||||
}
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
|
||||
fab = view.findViewById(R.id.share)
|
||||
fab = findViewById(R.id.share)
|
||||
fab.setOnClickListener { v ->
|
||||
v.context.pickListSeparatorAndShare(false)
|
||||
}
|
||||
|
||||
progressView = view.findViewById(R.id.progress_view)
|
||||
progressView = findViewById(R.id.progress_view)
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
|
||||
update()
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
@@ -190,6 +185,11 @@ class HistoryActivity : ScreenActivity() {
|
||||
wipeLastShareFile()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
update()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
listViewState = listView.onSaveInstanceState()
|
||||
@@ -292,7 +292,16 @@ class HistoryActivity : ScreenActivity() {
|
||||
cursor.let { cursor ->
|
||||
// Close previous cursor.
|
||||
scansAdapter?.also { it.changeCursor(null) }
|
||||
scansAdapter = ScansAdapter(ac, cursor)
|
||||
scansAdapter = ScansAdapter(ac, cursor) { id, pinned ->
|
||||
if (actionMode == null) {
|
||||
scope.launch {
|
||||
db.setPinned(id, pinned)
|
||||
withContext(Dispatchers.Main) {
|
||||
update()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
listView.adapter = scansAdapter
|
||||
listViewState?.also {
|
||||
listView.onRestoreInstanceState(it)
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
package de.markusfisch.android.binaryeye.activity
|
||||
|
||||
import android.app.AlertDialog
|
||||
import android.app.Dialog
|
||||
import android.os.Bundle
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.EditText
|
||||
import android.widget.ListView
|
||||
import android.widget.Spinner
|
||||
import android.widget.TextView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.adapter.prettifyFormatName
|
||||
import de.markusfisch.android.binaryeye.adapter.setupFormatSpinner
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.preference.IgnoreCode
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
class IgnoreCodesActivity : AbstractBaseActivity() {
|
||||
private val patterns = ArrayList<IgnoreCode>()
|
||||
|
||||
private lateinit var adapter: PatternsAdapter
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_ignore_codes)
|
||||
setTitle(R.string.ignore_codes)
|
||||
|
||||
patterns.addAll(prefs.ignoreCodes)
|
||||
|
||||
val listView = findViewById<ListView>(R.id.actions)
|
||||
listView.emptyView = findViewById(R.id.no_actions)
|
||||
findViewById<TextView>(R.id.no_actions).setText(
|
||||
R.string.ignore_codes_empty
|
||||
)
|
||||
adapter = PatternsAdapter(patterns)
|
||||
listView.adapter = adapter
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
listView.setOnItemClickListener { _, _, position, _ ->
|
||||
editPattern(position)
|
||||
}
|
||||
listView.setOnItemLongClickListener { _, _, position, _ ->
|
||||
confirmRemovePattern(position)
|
||||
true
|
||||
}
|
||||
|
||||
findViewById<View>(R.id.add).apply {
|
||||
contentDescription = getString(R.string.ignore_code_add)
|
||||
setOnClickListener {
|
||||
editPattern(null)
|
||||
}
|
||||
}
|
||||
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
}
|
||||
|
||||
private fun editPattern(position: Int?) {
|
||||
val pattern = position?.let { patterns[it] }
|
||||
val view = layoutInflater.inflate(R.layout.dialog_ignore_code, null)
|
||||
val regexView = view.findViewById<EditText>(R.id.regex)
|
||||
val formatView = view.findViewById<Spinner>(R.id.format)
|
||||
val values = setupFormatSpinner(formatView)
|
||||
if (pattern != null) {
|
||||
regexView.setText(pattern.pattern)
|
||||
regexView.setSelection(pattern.pattern.length)
|
||||
formatView.setSelection(
|
||||
values.indexOf(pattern.format ?: "").coerceAtLeast(0)
|
||||
)
|
||||
} else {
|
||||
formatView.setSelection(0)
|
||||
}
|
||||
|
||||
val dialog = AlertDialog.Builder(this)
|
||||
.setTitle(
|
||||
if (pattern == null) {
|
||||
R.string.ignore_code_add
|
||||
} else {
|
||||
R.string.ignore_code_edit
|
||||
}
|
||||
)
|
||||
.setView(view)
|
||||
.setPositiveButton(android.R.string.ok, null)
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.create()
|
||||
|
||||
dialog.setOnShowListener {
|
||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
|
||||
addOrUpdatePattern(position, regexView, formatView, values, dialog)
|
||||
}
|
||||
}
|
||||
|
||||
dialog.show()
|
||||
}
|
||||
|
||||
private fun addOrUpdatePattern(
|
||||
position: Int?,
|
||||
regexView: EditText,
|
||||
formatView: Spinner,
|
||||
values: List<String>,
|
||||
dialog: Dialog,
|
||||
) {
|
||||
val pattern = regexView.text.toString().trim()
|
||||
if (pattern.isEmpty()) {
|
||||
regexView.error = getString(R.string.ignore_code_regex_required)
|
||||
return
|
||||
}
|
||||
try {
|
||||
Regex(pattern)
|
||||
} catch (e: Exception) {
|
||||
val message = e.message ?: getString(
|
||||
R.string.ignore_code_regex_invalid
|
||||
)
|
||||
regexView.error = message
|
||||
toast(message)
|
||||
return
|
||||
}
|
||||
val item = IgnoreCode(
|
||||
pattern = pattern,
|
||||
format = values[formatView.selectedItemPosition].ifEmpty { null }
|
||||
)
|
||||
if (position == null) {
|
||||
patterns.add(item)
|
||||
} else {
|
||||
patterns[position] = item
|
||||
}
|
||||
prefs.setIgnoreCodes(patterns)
|
||||
adapter.notifyDataSetChanged()
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
private fun confirmRemovePattern(position: Int) {
|
||||
AlertDialog.Builder(this)
|
||||
.setMessage(R.string.ignore_code_remove_confirm)
|
||||
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||
patterns.removeAt(position)
|
||||
prefs.setIgnoreCodes(patterns)
|
||||
adapter.notifyDataSetChanged()
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.show()
|
||||
}
|
||||
|
||||
private inner class PatternsAdapter(
|
||||
items: List<IgnoreCode>
|
||||
) : ArrayAdapter<IgnoreCode>(
|
||||
this,
|
||||
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 = patterns[position]
|
||||
val title = view.findViewById<TextView>(android.R.id.text1)
|
||||
val subtitle = view.findViewById<TextView>(android.R.id.text2)
|
||||
title.text = item.pattern
|
||||
subtitle.text = item.format?.prettifyFormatName() ?: getString(
|
||||
R.string.all_formats
|
||||
)
|
||||
return view
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
-15
@@ -5,29 +5,22 @@ import android.net.wifi.WifiManager
|
||||
import android.net.wifi.WifiNetworkSuggestion
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.util.size
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.ListView
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.util.size
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
class NetworkSuggestionsActivity : ScreenActivity() {
|
||||
class NetworkSuggestionsActivity : AbstractBaseActivity() {
|
||||
@RequiresApi(Build.VERSION_CODES.R)
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_network_suggestions)
|
||||
setTitle(R.string.network_suggestions)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(
|
||||
R.layout.fragment_network_suggestions,
|
||||
frame,
|
||||
false
|
||||
)
|
||||
frame.addView(view)
|
||||
|
||||
val wm = applicationContext.getSystemService(
|
||||
Context.WIFI_SERVICE
|
||||
@@ -43,14 +36,14 @@ class NetworkSuggestionsActivity : ScreenActivity() {
|
||||
}
|
||||
)
|
||||
|
||||
val listView = view.findViewById<ListView>(R.id.suggestions)
|
||||
listView.emptyView = view.findViewById(R.id.no_suggestions)
|
||||
val listView = findViewById<ListView>(R.id.suggestions)
|
||||
listView.emptyView = findViewById(R.id.no_suggestions)
|
||||
listView.adapter = suggestionArrayAdapter
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
|
||||
view.findViewById<View>(R.id.remove).setOnClickListener {
|
||||
findViewById<View>(R.id.remove).setOnClickListener {
|
||||
val removeList = ArrayList<WifiNetworkSuggestion>()
|
||||
val removeFromAdapter = ArrayList<Suggestion>()
|
||||
val checked = listView.checkedItemPositions
|
||||
|
||||
@@ -110,9 +110,9 @@ class PickActivity : AppCompatActivity() {
|
||||
cropHandleName = "picker_crop_handle"
|
||||
}
|
||||
|
||||
findViewById<View>(R.id.scan).setOnClickListener {
|
||||
showResult()
|
||||
}
|
||||
findViewById<View>(R.id.scan).setOnClickListener {
|
||||
showResult()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getBitmapFromIntent(): Bitmap? = if (
|
||||
|
||||
@@ -15,26 +15,20 @@ import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets
|
||||
import de.markusfisch.android.binaryeye.view.systemBarListViewScrollListener
|
||||
import de.markusfisch.android.binaryeye.widget.toast
|
||||
|
||||
class ProfilesActivity : ScreenActivity() {
|
||||
class ProfilesActivity : AbstractBaseActivity() {
|
||||
private val profiles = ArrayList<ProfileItem>()
|
||||
|
||||
private lateinit var adapter: ProfilesAdapter
|
||||
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setScreenContentView(R.layout.activity_profiles)
|
||||
setTitle(R.string.profile)
|
||||
val frame = findViewById(R.id.content_frame) as ViewGroup
|
||||
val view = layoutInflater.inflate(
|
||||
R.layout.fragment_profiles,
|
||||
frame,
|
||||
false
|
||||
)
|
||||
frame.addView(view)
|
||||
|
||||
refreshProfiles()
|
||||
|
||||
val listView = view.findViewById<ListView>(R.id.profiles)
|
||||
listView.emptyView = view.findViewById(R.id.no_profiles)
|
||||
val listView = findViewById<ListView>(R.id.profiles)
|
||||
listView.emptyView = findViewById(R.id.no_profiles)
|
||||
adapter = ProfilesAdapter(this, profiles)
|
||||
listView.adapter = adapter
|
||||
listView.setOnScrollListener(systemBarListViewScrollListener)
|
||||
@@ -46,11 +40,11 @@ class ProfilesActivity : ScreenActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.add).setOnClickListener {
|
||||
findViewById<View>(R.id.add).setOnClickListener {
|
||||
addProfile()
|
||||
}
|
||||
|
||||
view.findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
findViewById<View>(R.id.inset_layout).setPaddingFromWindowInsets()
|
||||
listView.setPaddingFromWindowInsets()
|
||||
}
|
||||
|
||||
|
||||
@@ -10,11 +10,11 @@ class WelcomeActivity : AppCompatActivity() {
|
||||
override fun onCreate(state: Bundle?) {
|
||||
super.onCreate(state)
|
||||
setContentView(R.layout.activity_welcome)
|
||||
findViewById<View>(R.id.expert).setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
findViewById<View>(R.id.simple).setOnClickListener {
|
||||
prefs.apply {
|
||||
findViewById<View>(R.id.expert).setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
findViewById<View>(R.id.simple).setOnClickListener {
|
||||
prefs.apply {
|
||||
showCropHandle = false
|
||||
zoomBySwiping = false
|
||||
beep = true
|
||||
|
||||
@@ -2,12 +2,15 @@ package de.markusfisch.android.binaryeye.adapter
|
||||
|
||||
import android.content.Context
|
||||
import android.database.Cursor
|
||||
import androidx.core.content.ContextCompat
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ArrayAdapter
|
||||
import android.widget.CursorAdapter
|
||||
import android.widget.ImageButton
|
||||
import android.widget.Spinner
|
||||
import android.widget.TextView
|
||||
import androidx.core.content.ContextCompat
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.database.Database
|
||||
import java.text.DateFormat
|
||||
@@ -15,9 +18,14 @@ import java.text.ParseException
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
class ScansAdapter(
|
||||
context: Context,
|
||||
cursor: Cursor,
|
||||
private val onPinClick: (Long, Boolean) -> Unit
|
||||
) :
|
||||
CursorAdapter(context, cursor, false) {
|
||||
private val idIndex = cursor.getColumnIndex(Database.SCANS_ID)
|
||||
private val pinnedIndex = cursor.getColumnIndex(Database.SCANS_PINNED)
|
||||
private val timeIndex = cursor.getColumnIndex(Database.SCANS_DATETIME)
|
||||
private val nameIndex = cursor.getColumnIndex(Database.SCANS_NAME)
|
||||
private val textIndex = cursor.getColumnIndex(Database.SCANS_TEXT)
|
||||
@@ -89,8 +97,14 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
context: Context,
|
||||
cursor: Cursor
|
||||
) {
|
||||
val id = cursor.getLong(idIndex)
|
||||
val pinned = cursor.getInt(pinnedIndex) != 0
|
||||
getViewHolder(view).apply {
|
||||
timeView.text = formatDateTime(cursor.getString(timeIndex))
|
||||
metaView.text = context.getString(
|
||||
R.string.scan_meta_data,
|
||||
formatDateTime(cursor.getString(timeIndex)),
|
||||
cursor.getString(formatIndex).prettifyFormatName()
|
||||
)
|
||||
val name = cursor.getString(nameIndex)
|
||||
val text = cursor.getString(textIndex)
|
||||
var icon = 0
|
||||
@@ -109,9 +123,27 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
contentView.setCompoundDrawablesWithIntrinsicBounds(
|
||||
icon, 0, 0, 0
|
||||
)
|
||||
formatView.text = cursor.getString(formatIndex).prettifyFormatName()
|
||||
pinView.apply {
|
||||
setImageResource(
|
||||
if (pinned) {
|
||||
R.drawable.ic_action_pin
|
||||
} else {
|
||||
R.drawable.ic_action_pin_outline
|
||||
}
|
||||
)
|
||||
contentDescription = context.getString(
|
||||
if (pinned) {
|
||||
R.string.unpin_item
|
||||
} else {
|
||||
R.string.pin_item
|
||||
}
|
||||
)
|
||||
setOnClickListener {
|
||||
onPinClick(id, !pinned)
|
||||
}
|
||||
}
|
||||
}
|
||||
val selected = selections[cursor.getLong(idIndex)] != null
|
||||
val selected = selections[id] != null
|
||||
view.post {
|
||||
// Needs to be put on the queue to work.
|
||||
view.select(selected)
|
||||
@@ -125,23 +157,46 @@ class ScansAdapter(context: Context, cursor: Cursor) :
|
||||
private fun getViewHolder(
|
||||
view: View
|
||||
): ViewHolder = view.tag as ViewHolder? ?: ViewHolder(
|
||||
view.findViewById(R.id.time),
|
||||
view.findViewById(R.id.meta),
|
||||
view.findViewById(R.id.content),
|
||||
view.findViewById(R.id.format)
|
||||
view.findViewById(R.id.pin)
|
||||
).also {
|
||||
view.tag = it
|
||||
}
|
||||
|
||||
private data class ViewHolder(
|
||||
val timeView: TextView,
|
||||
val metaView: TextView,
|
||||
val contentView: TextView,
|
||||
val formatView: TextView
|
||||
val pinView: ImageButton
|
||||
)
|
||||
}
|
||||
|
||||
private val formatWordBoundary =
|
||||
"(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[A-Za-z])(?=\\d)|(?<=\\d)(?=[A-Za-z])".toRegex()
|
||||
|
||||
fun Context.setupFormatSpinner(spinner: Spinner): List<String> {
|
||||
val names = resources.getStringArray(
|
||||
R.array.barcode_formats_names
|
||||
).toMutableList().apply {
|
||||
add(0, getString(R.string.all_formats))
|
||||
}
|
||||
val values = resources.getStringArray(
|
||||
R.array.barcode_formats_values
|
||||
).toMutableList().apply {
|
||||
add(0, "")
|
||||
}
|
||||
spinner.adapter = ArrayAdapter(
|
||||
this,
|
||||
android.R.layout.simple_spinner_item,
|
||||
names
|
||||
).apply {
|
||||
setDropDownViewResource(
|
||||
android.R.layout.simple_spinner_dropdown_item
|
||||
)
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
fun String.prettifyFormatName() = replace("_", " ")
|
||||
.replace(formatWordBoundary, " ")
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import java.util.Locale
|
||||
data class AutomatedAction(
|
||||
val pattern: String,
|
||||
val type: Type,
|
||||
val format: String? = null,
|
||||
val urlTemplate: String? = null,
|
||||
val intentUriTemplate: String? = null
|
||||
) {
|
||||
@@ -16,8 +17,9 @@ data class AutomatedAction(
|
||||
Intent, CustomIntent
|
||||
}
|
||||
|
||||
fun matches(content: String): Boolean = try {
|
||||
Regex(pattern).matches(content)
|
||||
fun matches(content: String, format: String): Boolean = try {
|
||||
(this.format == null || this.format == format) &&
|
||||
Regex(pattern).matches(content)
|
||||
} catch (_: Exception) {
|
||||
false
|
||||
}
|
||||
@@ -25,6 +27,7 @@ data class AutomatedAction(
|
||||
fun toJson(): JSONObject = JSONObject().apply {
|
||||
put(KEY_PATTERN, pattern)
|
||||
put(KEY_TYPE, type.name.lowercase(Locale.ROOT))
|
||||
put(KEY_FORMAT, format ?: "")
|
||||
put(KEY_URL_TEMPLATE, urlTemplate ?: "")
|
||||
put(KEY_INTENT_URI_TEMPLATE, intentUriTemplate ?: "")
|
||||
}
|
||||
@@ -32,6 +35,7 @@ data class AutomatedAction(
|
||||
companion object {
|
||||
private const val KEY_PATTERN = "pattern"
|
||||
private const val KEY_TYPE = "type"
|
||||
private const val KEY_FORMAT = "format"
|
||||
private const val KEY_URL_TEMPLATE = "url_template"
|
||||
private const val KEY_INTENT_URI_TEMPLATE = "intent_uri_template"
|
||||
|
||||
@@ -46,6 +50,7 @@ data class AutomatedAction(
|
||||
"html" -> return null
|
||||
else -> Type.Intent
|
||||
}
|
||||
val format = obj.optString(KEY_FORMAT, "").trim()
|
||||
val urlTemplate = obj.optString(KEY_URL_TEMPLATE, "").trim()
|
||||
val intentUriTemplate = obj.optString(
|
||||
KEY_INTENT_URI_TEMPLATE,
|
||||
@@ -54,6 +59,7 @@ data class AutomatedAction(
|
||||
return AutomatedAction(
|
||||
pattern = pattern,
|
||||
type = type,
|
||||
format = format.ifEmpty { null },
|
||||
urlTemplate = urlTemplate.ifEmpty { null },
|
||||
intentUriTemplate = intentUriTemplate.ifEmpty { null }
|
||||
)
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ fun Context.runAutomatedActions(scan: Scan): Boolean {
|
||||
return false
|
||||
}
|
||||
for (action in actions) {
|
||||
if (action.matches(content)) {
|
||||
if (action.matches(content, scan.format.name)) {
|
||||
return when (action.type) {
|
||||
AutomatedAction.Type.Intent -> {
|
||||
val url = action.urlTemplate?.buildUrl(scan)
|
||||
|
||||
@@ -48,7 +48,8 @@ fun Scan.toBarcode(): Barcode<*> {
|
||||
ContentBarcode(
|
||||
content,
|
||||
format,
|
||||
errorCorrectionLevel.toErrorCorrectionInt()
|
||||
errorCorrectionLevel.toErrorCorrectionInt(),
|
||||
margin = 1
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ private fun exportCsv(
|
||||
return
|
||||
}
|
||||
val columns = arrayOf(
|
||||
Database.SCANS_PINNED,
|
||||
Database.SCANS_DATETIME,
|
||||
Database.SCANS_FORMAT,
|
||||
Database.SCANS_NAME,
|
||||
|
||||
@@ -20,19 +20,21 @@ class Database {
|
||||
fun getScans(query: String? = null): Cursor = db.rawQuery(
|
||||
"""SELECT
|
||||
$SCANS_ID,
|
||||
$SCANS_PINNED,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_TEXT,
|
||||
$SCANS_FORMAT
|
||||
FROM $SCANS
|
||||
${getWhereClause(query)}
|
||||
ORDER BY $SCANS_DATETIME DESC
|
||||
ORDER BY $SCANS_PINNED DESC, $SCANS_DATETIME DESC
|
||||
""".trimMargin(), getWhereArguments(query)
|
||||
)
|
||||
|
||||
fun getScansDetailed(query: String? = null): Cursor = db.rawQuery(
|
||||
"""SELECT
|
||||
$SCANS_ID,
|
||||
$SCANS_PINNED,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_TEXT,
|
||||
@@ -49,7 +51,7 @@ class Database {
|
||||
$SCANS_GTIN_ISSUE_NUMBER
|
||||
FROM $SCANS
|
||||
${getWhereClause(query)}
|
||||
ORDER BY $SCANS_DATETIME DESC
|
||||
ORDER BY $SCANS_PINNED DESC, $SCANS_DATETIME DESC
|
||||
""".trimMargin(), getWhereArguments(query)
|
||||
)
|
||||
|
||||
@@ -75,6 +77,7 @@ class Database {
|
||||
fun getScansDetailed(ids: LongArray): Cursor = db.rawQuery(
|
||||
"""SELECT
|
||||
$SCANS_ID,
|
||||
$SCANS_PINNED,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_TEXT,
|
||||
@@ -91,13 +94,14 @@ class Database {
|
||||
$SCANS_GTIN_ISSUE_NUMBER
|
||||
FROM $SCANS
|
||||
WHERE $SCANS_ID IN (${ids.joinToString(",")})
|
||||
ORDER BY $SCANS_DATETIME DESC
|
||||
ORDER BY $SCANS_PINNED DESC, $SCANS_DATETIME DESC
|
||||
""".trimMargin(), null
|
||||
)
|
||||
|
||||
fun getScan(id: Long): Scan? = db.rawQuery(
|
||||
"""SELECT
|
||||
$SCANS_ID,
|
||||
$SCANS_PINNED,
|
||||
$SCANS_DATETIME,
|
||||
$SCANS_NAME,
|
||||
$SCANS_TEXT,
|
||||
@@ -145,6 +149,7 @@ class Database {
|
||||
it.getString(SCANS_DATETIME),
|
||||
it.getLong(SCANS_ID),
|
||||
it.getString(SCANS_NAME),
|
||||
it.getInt(SCANS_PINNED) != 0
|
||||
)
|
||||
} else {
|
||||
null
|
||||
@@ -200,6 +205,7 @@ class Database {
|
||||
scan.addOn?.let { put(SCANS_GTIN_ADD_ON, it) }
|
||||
scan.price?.let { put(SCANS_GTIN_PRICE, it) }
|
||||
scan.issueNumber?.let { put(SCANS_GTIN_ISSUE_NUMBER, it) }
|
||||
put(SCANS_PINNED, if (scan.pinned) 1 else 0)
|
||||
}
|
||||
)
|
||||
}
|
||||
@@ -265,8 +271,14 @@ class Database {
|
||||
db.update(SCANS, cv, "$SCANS_ID = ?", arrayOf("$id"))
|
||||
}
|
||||
|
||||
fun setPinned(id: Long, pinned: Boolean) {
|
||||
val cv = ContentValues()
|
||||
cv.put(SCANS_PINNED, if (pinned) 1 else 0)
|
||||
db.update(SCANS, cv, "$SCANS_ID = ?", arrayOf("$id"))
|
||||
}
|
||||
|
||||
private class OpenHelper(context: Context) :
|
||||
SQLiteOpenHelper(context, FILE_NAME, null, 9) {
|
||||
SQLiteOpenHelper(context, FILE_NAME, null, 10) {
|
||||
override fun onCreate(db: SQLiteDatabase) {
|
||||
db.createScans()
|
||||
}
|
||||
@@ -300,6 +312,9 @@ class Database {
|
||||
if (oldVersion < 9) {
|
||||
db.migrateToNativeFormatNames()
|
||||
}
|
||||
if (oldVersion < 10) {
|
||||
db.addPinnedColumn()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -333,6 +348,7 @@ class Database {
|
||||
const val SCANS_GTIN_ADD_ON = "gtin_add_on"
|
||||
const val SCANS_GTIN_PRICE = "gtin_price"
|
||||
const val SCANS_GTIN_ISSUE_NUMBER = "gtin_issue_number"
|
||||
const val SCANS_PINNED = "pinned"
|
||||
|
||||
private fun SQLiteDatabase.createScans() {
|
||||
execSQL("DROP TABLE IF EXISTS $SCANS".trimMargin())
|
||||
@@ -356,7 +372,8 @@ class Database {
|
||||
$SCANS_GTIN_COUNTRY TEXT,
|
||||
$SCANS_GTIN_ADD_ON TEXT,
|
||||
$SCANS_GTIN_PRICE TEXT,
|
||||
$SCANS_GTIN_ISSUE_NUMBER TEXT
|
||||
$SCANS_GTIN_ISSUE_NUMBER TEXT,
|
||||
$SCANS_PINNED INTEGER NOT NULL DEFAULT 0
|
||||
)""".trimMargin()
|
||||
)
|
||||
}
|
||||
@@ -449,5 +466,11 @@ class Database {
|
||||
execSQL("ALTER TABLE $SCANS ADD $SCANS_SYMBOL_HEIGHT INTEGER")
|
||||
execSQL("ALTER TABLE $SCANS ADD $SCANS_SYMBOL_DATA BLOB")
|
||||
}
|
||||
|
||||
private fun SQLiteDatabase.addPinnedColumn() {
|
||||
execSQL(
|
||||
"ALTER TABLE $SCANS ADD COLUMN $SCANS_PINNED INTEGER NOT NULL DEFAULT 0"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ fun Cursor.exportJson(): String? {
|
||||
return null
|
||||
}
|
||||
val columns = arrayOf(
|
||||
Database.SCANS_PINNED,
|
||||
Database.SCANS_DATETIME,
|
||||
Database.SCANS_FORMAT,
|
||||
Database.SCANS_NAME,
|
||||
|
||||
@@ -2,11 +2,11 @@ package de.markusfisch.android.binaryeye.database
|
||||
|
||||
import android.os.Bundle
|
||||
import android.text.format.DateFormat
|
||||
import de.markusfisch.android.binaryeye.zxingcpp.migrateBarcodeFormatName
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BitMatrix
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.ContentType
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.Result
|
||||
import de.markusfisch.android.binaryeye.zxingcpp.migrateBarcodeFormatName
|
||||
import java.util.Locale
|
||||
|
||||
data class Scan(
|
||||
@@ -26,7 +26,8 @@ data class Scan(
|
||||
val issueNumber: String? = null,
|
||||
val dateTime: String = getDateTime(),
|
||||
var id: Long = 0L,
|
||||
val label: String? = null
|
||||
val label: String? = null,
|
||||
val pinned: Boolean = false
|
||||
) {
|
||||
// Needs to be overwritten manually, as ByteArray is an array and
|
||||
// this isn't handled well by Kotlin.
|
||||
@@ -56,7 +57,9 @@ data class Scan(
|
||||
country == other.country &&
|
||||
addOn == other.addOn &&
|
||||
price == other.price &&
|
||||
issueNumber == other.issueNumber
|
||||
issueNumber == other.issueNumber &&
|
||||
label == other.label &&
|
||||
pinned == other.pinned
|
||||
}
|
||||
|
||||
// Needs to be overwritten manually, as ByteArray is an array and
|
||||
@@ -77,6 +80,8 @@ data class Scan(
|
||||
result = 31 * result + (addOn?.hashCode() ?: 0)
|
||||
result = 31 * result + (price?.hashCode() ?: 0)
|
||||
result = 31 * result + (issueNumber?.hashCode() ?: 0)
|
||||
result = 31 * result + (label?.hashCode() ?: 0)
|
||||
result = 31 * result + pinned.hashCode()
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -127,6 +132,7 @@ fun Scan.toBundle() = Bundle().apply {
|
||||
putString(SCAN_DATE_TIME, dateTime)
|
||||
putLong(SCAN_ID, id)
|
||||
putString(SCAN_LABEL, label)
|
||||
putBoolean(SCAN_PINNED, pinned)
|
||||
}
|
||||
|
||||
fun Bundle.toScan(): Scan? {
|
||||
@@ -152,7 +158,8 @@ fun Bundle.toScan(): Scan? {
|
||||
issueNumber = getString(SCAN_ISSUE_NUMBER),
|
||||
dateTime = getString(SCAN_DATE_TIME) ?: getDateTime(),
|
||||
id = getLong(SCAN_ID, 0L),
|
||||
label = getString(SCAN_LABEL)
|
||||
label = getString(SCAN_LABEL),
|
||||
pinned = getBoolean(SCAN_PINNED, false)
|
||||
)
|
||||
} catch (_: IllegalArgumentException) {
|
||||
null
|
||||
@@ -199,3 +206,4 @@ private const val SCAN_ISSUE_NUMBER = "issue_number"
|
||||
private const val SCAN_DATE_TIME = "date_time"
|
||||
private const val SCAN_ID = "id"
|
||||
private const val SCAN_LABEL = "label"
|
||||
private const val SCAN_PINNED = "pinned"
|
||||
|
||||
+81
-4
@@ -17,6 +17,7 @@ import androidx.preference.PreferenceFragmentCompat
|
||||
import androidx.preference.PreferenceGroup
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.activity.AutomatedActionsActivity
|
||||
import de.markusfisch.android.binaryeye.activity.IgnoreCodesActivity
|
||||
import de.markusfisch.android.binaryeye.activity.NetworkSuggestionsActivity
|
||||
import de.markusfisch.android.binaryeye.activity.ProfilesActivity
|
||||
import de.markusfisch.android.binaryeye.activity.SplashActivity
|
||||
@@ -80,9 +81,11 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
preferenceScreen.sharedPreferences
|
||||
?.registerOnSharedPreferenceChangeListener(changeListener)
|
||||
setSummaries(preferenceScreen)
|
||||
setIcons()
|
||||
|
||||
wireProfiles()
|
||||
wireAutomatedActions()
|
||||
wireIgnoreCodes()
|
||||
setBluetoothResources()
|
||||
wireClearNetworkPreferences()
|
||||
}
|
||||
@@ -109,6 +112,18 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun wireIgnoreCodes() {
|
||||
findPreference<Preference>(IGNORE_CODES)?.apply {
|
||||
updateIgnoreCodesSummary(this)
|
||||
onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
startActivity(
|
||||
Intent(activity, IgnoreCodesActivity::class.java)
|
||||
)
|
||||
true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setBluetoothResources() {
|
||||
if (prefs.sendScanBluetooth &&
|
||||
activity?.hasBluetoothPermission() == true
|
||||
@@ -135,10 +150,10 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
// Note that previous versions of this app allowed
|
||||
// adding network suggestions on Q as well, so we
|
||||
// need to keep this option.
|
||||
setOnPreferenceClickListener {
|
||||
context?.askToClearNetworkSuggestions()
|
||||
true
|
||||
}
|
||||
setOnPreferenceClickListener {
|
||||
context?.askToClearNetworkSuggestions()
|
||||
true
|
||||
}
|
||||
} else {
|
||||
// There are no network suggestions below Q.
|
||||
isVisible = false
|
||||
@@ -179,6 +194,9 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
findPreference<Preference>(AUTOMATED_ACTIONS)?.let {
|
||||
updateAutomatedActionsSummary(it)
|
||||
}
|
||||
findPreference<Preference>(IGNORE_CODES)?.let {
|
||||
updateIgnoreCodesSummary(it)
|
||||
}
|
||||
findPreference<Preference>(PROFILE)?.let {
|
||||
updateProfileSummary(it)
|
||||
}
|
||||
@@ -223,6 +241,10 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
updateAutomatedActionsSummary(preference)
|
||||
return
|
||||
}
|
||||
if (preference.key == IGNORE_CODES) {
|
||||
updateIgnoreCodesSummary(preference)
|
||||
return
|
||||
}
|
||||
when (preference) {
|
||||
is UrlPreference -> {
|
||||
preference.summary = preference.getUrl()
|
||||
@@ -244,6 +266,47 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun setIcons() {
|
||||
setIcon(PROFILE, R.drawable.ic_action_profile)
|
||||
setIcon("formats", R.drawable.ic_action_scan)
|
||||
setIcon("show_crop_handle", R.drawable.ic_action_crop)
|
||||
setIcon("show_crosshairs", R.drawable.ic_action_search)
|
||||
setIcon("zoom_by_swiping", R.drawable.ic_action_search)
|
||||
setIcon("auto_rotate", R.drawable.ic_action_down)
|
||||
setIcon("try_harder", R.drawable.ic_action_search)
|
||||
setIcon("bulk_mode", R.drawable.ic_action_bulk_mode)
|
||||
setIcon("bulk_mode_delay", R.drawable.ic_action_delay)
|
||||
setIcon("show_toast_in_bulk_mode", R.drawable.ic_action_toast)
|
||||
setIcon("vibrate", R.drawable.ic_action_vibrate)
|
||||
setIcon("beep", R.drawable.ic_action_beep)
|
||||
setIcon("beep_tone_name", R.drawable.ic_action_notification_sound)
|
||||
setIcon("use_history", R.drawable.ic_action_history)
|
||||
setIcon("ignore_duplicates_name", R.drawable.ic_action_remove)
|
||||
setIcon(IGNORE_CODES, R.drawable.ic_action_remove)
|
||||
setIcon("copy_immediately", R.drawable.ic_action_copy)
|
||||
setIcon("send_scan_active", R.drawable.ic_action_forward)
|
||||
setIcon("send_scan_url", R.drawable.ic_action_link)
|
||||
setIcon("send_scan_type", R.drawable.ic_action_link)
|
||||
setIcon("send_scan_bluetooth", R.drawable.ic_action_bluetooth)
|
||||
setIcon("send_scan_bluetooth_host", R.drawable.ic_action_bluetooth)
|
||||
setIcon("open_immediately", R.drawable.ic_action_open)
|
||||
setIcon("show_meta_data", R.drawable.ic_action_info)
|
||||
setIcon("show_hex_dump", R.drawable.ic_action_info)
|
||||
setIcon("show_checksum", R.drawable.ic_action_info)
|
||||
setIcon("show_recreation", R.drawable.ic_action_scan)
|
||||
setIcon("close_automatically", R.drawable.ic_action_back)
|
||||
setIcon("default_search_url", R.drawable.ic_action_search)
|
||||
setIcon("open_with_url", R.drawable.ic_action_link)
|
||||
setIcon(AUTOMATED_ACTIONS, R.drawable.ic_action_create)
|
||||
setIcon("clear_network_suggestions", R.drawable.ic_action_wifi)
|
||||
setIcon("brighten_screen", R.drawable.ic_action_bright)
|
||||
setIcon("custom_locale", R.drawable.ic_action_preferences)
|
||||
}
|
||||
|
||||
private fun setIcon(key: String, iconResId: Int) {
|
||||
findPreference<Preference>(key)?.setIcon(iconResId)
|
||||
}
|
||||
|
||||
private fun updateAutomatedActionsSummary(preference: Preference) {
|
||||
val count = prefs.automatedActions.size
|
||||
preference.summary = if (count == 0) {
|
||||
@@ -257,6 +320,19 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateIgnoreCodesSummary(preference: Preference) {
|
||||
val count = prefs.ignoreCodes.size
|
||||
preference.summary = if (count == 0) {
|
||||
getString(R.string.ignore_codes_none)
|
||||
} else {
|
||||
resources.getQuantityString(
|
||||
R.plurals.ignore_codes_count,
|
||||
count,
|
||||
count
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateProfileSummary(preference: Preference) {
|
||||
preference.summary = prefs.profile ?: getString(R.string.profile_default)
|
||||
lastProfile = prefs.profile
|
||||
@@ -265,6 +341,7 @@ class PreferencesFragment : PreferenceFragmentCompat() {
|
||||
companion object {
|
||||
private const val PROFILE = "profile"
|
||||
private const val AUTOMATED_ACTIONS = "automated_actions"
|
||||
private const val IGNORE_CODES = "ignore_codes"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package de.markusfisch.android.binaryeye.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceDialogFragmentCompat
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import androidx.preference.PreferenceDialogFragmentCompat
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.database.Scan
|
||||
|
||||
@@ -6,8 +6,8 @@ import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import android.provider.MediaStore
|
||||
import androidx.annotation.MainThread
|
||||
import android.widget.EditText
|
||||
import androidx.annotation.MainThread
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.alertDialog
|
||||
import java.io.File
|
||||
|
||||
@@ -9,7 +9,7 @@ private var errorToneGenerator: ToneGenerator? = null
|
||||
|
||||
fun beepConfirm() {
|
||||
val tg = confirmToneGenerator ?: ToneGenerator(
|
||||
AudioManager.STREAM_NOTIFICATION,
|
||||
AudioManager.STREAM_MUSIC,
|
||||
ToneGenerator.MAX_VOLUME
|
||||
)
|
||||
confirmToneGenerator = tg
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
package de.markusfisch.android.binaryeye.preference
|
||||
|
||||
import org.json.JSONArray
|
||||
import org.json.JSONObject
|
||||
|
||||
data class IgnoreCode(
|
||||
val pattern: String,
|
||||
val format: String? = null
|
||||
) {
|
||||
private val compiledRegex: Regex? by lazy {
|
||||
try {
|
||||
Regex(pattern)
|
||||
} catch (_: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
fun matches(content: String, format: String): Boolean =
|
||||
(this.format == null || this.format == format) &&
|
||||
compiledRegex?.containsMatchIn(content) == true
|
||||
|
||||
fun toJson(): JSONObject = JSONObject().apply {
|
||||
put(KEY_PATTERN, pattern)
|
||||
put(KEY_FORMAT, format ?: "")
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val KEY_PATTERN = "pattern"
|
||||
private const val KEY_FORMAT = "format"
|
||||
|
||||
fun fromJson(obj: JSONObject): IgnoreCode? {
|
||||
val pattern = obj.optString(KEY_PATTERN, "").trim()
|
||||
if (pattern.isEmpty()) {
|
||||
return null
|
||||
}
|
||||
val format = obj.optString(KEY_FORMAT, "").trim()
|
||||
return IgnoreCode(
|
||||
pattern = pattern,
|
||||
format = format.ifEmpty { null }
|
||||
)
|
||||
}
|
||||
|
||||
fun fromJsonArray(json: String): MutableList<IgnoreCode> {
|
||||
val items = ArrayList<IgnoreCode>()
|
||||
val array = try {
|
||||
JSONArray(json)
|
||||
} catch (_: Exception) {
|
||||
JSONArray()
|
||||
}
|
||||
for (i in 0 until array.length()) {
|
||||
when (val item = array.opt(i)) {
|
||||
is String -> {
|
||||
val pattern = item.trim()
|
||||
if (pattern.isNotEmpty()) {
|
||||
items.add(IgnoreCode(pattern))
|
||||
}
|
||||
}
|
||||
|
||||
is JSONObject -> {
|
||||
fromJson(item)?.let { items.add(it) }
|
||||
}
|
||||
}
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
fun toJsonArray(items: List<IgnoreCode>): String {
|
||||
val array = JSONArray()
|
||||
items.forEach { item ->
|
||||
array.put(item.toJson())
|
||||
}
|
||||
return array.toString()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,8 @@ import de.markusfisch.android.binaryeye.automation.AutomatedAction.Companion.fro
|
||||
import de.markusfisch.android.binaryeye.automation.AutomatedAction.Companion.toJsonArray
|
||||
import de.markusfisch.android.binaryeye.zxingcpp.migrateBarcodeFormatName
|
||||
import de.markusfisch.android.zxingcpp.ZxingCpp.BarcodeFormat
|
||||
import org.json.JSONArray
|
||||
import de.markusfisch.android.binaryeye.preference.IgnoreCode.Companion.fromJsonArray as ignoreCodesFromJsonArray
|
||||
import de.markusfisch.android.binaryeye.preference.IgnoreCode.Companion.toJsonArray as ignoreCodesToJsonArray
|
||||
|
||||
class Preferences {
|
||||
lateinit var defaultPreferences: SharedPreferences
|
||||
@@ -64,6 +65,11 @@ class Preferences {
|
||||
apply(SHOW_CROP_HANDLE, value)
|
||||
field = value
|
||||
}
|
||||
var showCrosshairs = false
|
||||
set(value) {
|
||||
apply(SHOW_CROSSHAIRS, value)
|
||||
field = value
|
||||
}
|
||||
var zoomBySwiping = true
|
||||
set(value) {
|
||||
apply(ZOOM_BY_SWIPING, value)
|
||||
@@ -119,6 +125,8 @@ class Preferences {
|
||||
apply(IGNORE_DUPLICATES_NAME, value)
|
||||
field = value
|
||||
}
|
||||
var ignoreCodes = mutableListOf(IgnoreCode(DEFAULT_IGNORE_CODE_PATTERN))
|
||||
private set
|
||||
var copyImmediately = false
|
||||
set(value) {
|
||||
apply(COPY_IMMEDIATELY, value)
|
||||
@@ -279,13 +287,13 @@ class Preferences {
|
||||
|
||||
fun saveProfiles() {
|
||||
defaultPreferences.edit {
|
||||
putString(PROFILES, JSONArray(profiles).toString())
|
||||
putString(PROFILES, org.json.JSONArray(profiles).toString())
|
||||
}
|
||||
}
|
||||
|
||||
fun loadProfiles() {
|
||||
profiles.clear()
|
||||
JSONArray(
|
||||
org.json.JSONArray(
|
||||
defaultPreferences.getString(PROFILES, "[]")
|
||||
).let {
|
||||
profiles.addAll(Array(it.length()) { i -> it.getString(i) })
|
||||
@@ -317,6 +325,10 @@ class Preferences {
|
||||
SHOW_CROP_HANDLE,
|
||||
showCropHandle
|
||||
)
|
||||
showCrosshairs = preferences.getBoolean(
|
||||
SHOW_CROSSHAIRS,
|
||||
showCrosshairs
|
||||
)
|
||||
zoomBySwiping = preferences.getBoolean(ZOOM_BY_SWIPING, zoomBySwiping)
|
||||
autoRotate = preferences.getBoolean(AUTO_ROTATE, autoRotate)
|
||||
tryHarder = preferences.getBoolean(TRY_HARDER, tryHarder)
|
||||
@@ -351,6 +363,14 @@ class Preferences {
|
||||
)?.also {
|
||||
ignoreDuplicatesName = it
|
||||
}
|
||||
ignoreCodes = ignoreCodesFromJsonArray(
|
||||
preferences.getString(
|
||||
IGNORE_CODES,
|
||||
ignoreCodesToJsonArray(
|
||||
listOf(IgnoreCode(DEFAULT_IGNORE_CODE_PATTERN))
|
||||
)
|
||||
) ?: "[]"
|
||||
)
|
||||
copyImmediately = preferences.getBoolean(
|
||||
COPY_IMMEDIATELY,
|
||||
copyImmediately
|
||||
@@ -430,6 +450,14 @@ class Preferences {
|
||||
apply(AUTOMATED_ACTIONS, toJsonArray(actions))
|
||||
}
|
||||
|
||||
fun setIgnoreCodes(patterns: List<IgnoreCode>) {
|
||||
ignoreCodes = patterns.toMutableList()
|
||||
apply(IGNORE_CODES, ignoreCodesToJsonArray(patterns))
|
||||
}
|
||||
|
||||
fun shouldIgnoreHistoryContent(content: String, format: String): Boolean =
|
||||
ignoreCodes.any { it.matches(content, format) }
|
||||
|
||||
private fun addFormatsOnUpdate(
|
||||
restored: Set<String>,
|
||||
vararg formats: BarcodeFormat
|
||||
@@ -525,6 +553,7 @@ class Preferences {
|
||||
private const val PROFILE = "profile"
|
||||
private const val BARCODE_FORMATS = "formats"
|
||||
private const val SHOW_CROP_HANDLE = "show_crop_handle"
|
||||
private const val SHOW_CROSSHAIRS = "show_crosshairs"
|
||||
private const val ZOOM_BY_SWIPING = "zoom_by_swiping"
|
||||
private const val AUTO_ROTATE = "auto_rotate"
|
||||
private const val TRY_HARDER = "try_harder"
|
||||
@@ -536,6 +565,7 @@ class Preferences {
|
||||
private const val BEEP_TONE_NAME = "beep_tone_name"
|
||||
private const val USE_HISTORY = "use_history"
|
||||
private const val IGNORE_DUPLICATES_NAME = "ignore_duplicates_name"
|
||||
private const val IGNORE_CODES = "ignore_codes"
|
||||
private const val OPEN_IMMEDIATELY = "open_immediately"
|
||||
private const val COPY_IMMEDIATELY = "copy_immediately"
|
||||
private const val SHOW_META_DATA = "show_meta_data"
|
||||
@@ -559,5 +589,6 @@ class Preferences {
|
||||
private const val BRIGHTEN_SCREEN = "brighten_screen"
|
||||
private const val PREVIEW_SCALE = "preview_scale"
|
||||
private const val AUTOMATED_ACTIONS = "automated_actions"
|
||||
private const val DEFAULT_IGNORE_CODE_PATTERN = "^FIDO://.*"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,15 +3,15 @@ package de.markusfisch.android.binaryeye.view
|
||||
import android.content.Context
|
||||
import android.content.ContextWrapper
|
||||
import android.os.Build
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.widget.AbsListView
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.appcompat.widget.Toolbar
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.drawable.toDrawable
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import android.widget.AbsListView
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
|
||||
val systemBarListViewScrollListener = object : AbsListView.OnScrollListener {
|
||||
@@ -71,15 +71,15 @@ fun AppCompatActivity.initBars() {
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
|
||||
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
colorSystemAndToolBars(this)
|
||||
setPaddingFromWindowInsets(
|
||||
findViewById(R.id.main),
|
||||
(findViewById(R.id.toolbar) as Toolbar).apply {
|
||||
setSupportActionBar(this)
|
||||
},
|
||||
findViewById<View>(R.id.navbar)?.apply {
|
||||
setBackgroundColor(translucentPrimaryColor)
|
||||
}
|
||||
)
|
||||
setPaddingFromWindowInsets(
|
||||
findViewById(R.id.main),
|
||||
(findViewById(R.id.toolbar) as Toolbar).apply {
|
||||
setSupportActionBar(this)
|
||||
},
|
||||
findViewById<View>(R.id.navbar)?.apply {
|
||||
setBackgroundColor(translucentPrimaryColor)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private var statusBarColorLocked = false
|
||||
@@ -119,10 +119,10 @@ fun colorSystemAndToolBars(
|
||||
0
|
||||
}
|
||||
} else {
|
||||
activity.findViewById<View>(R.id.navbar)?.apply {
|
||||
visibility = if (scrolled || scrollable) {
|
||||
View.VISIBLE
|
||||
} else {
|
||||
activity.findViewById<View>(R.id.navbar)?.apply {
|
||||
visibility = if (scrolled || scrollable) {
|
||||
View.VISIBLE
|
||||
} else {
|
||||
View.GONE
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,12 +8,12 @@ import android.graphics.Path
|
||||
import android.graphics.Point
|
||||
import android.graphics.Rect
|
||||
import android.graphics.Region
|
||||
import androidx.core.graphics.withSave
|
||||
import android.os.Build
|
||||
import androidx.core.content.ContextCompat
|
||||
import android.util.AttributeSet
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.graphics.withSave
|
||||
import de.markusfisch.android.binaryeye.R
|
||||
import de.markusfisch.android.binaryeye.app.prefs
|
||||
import de.markusfisch.android.binaryeye.graphics.getBitmapFromDrawable
|
||||
@@ -38,6 +38,11 @@ class DetectorView : View {
|
||||
color = ContextCompat.getColor(context, R.color.dot)
|
||||
style = Paint.Style.FILL
|
||||
}
|
||||
private val crosshairPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
|
||||
color = ContextCompat.getColor(context, R.color.dot)
|
||||
style = Paint.Style.STROKE
|
||||
strokeWidth = context.resources.displayMetrics.density
|
||||
}
|
||||
private val dotRadius: Float
|
||||
private val handleBitmap = resources.getBitmapFromDrawable(
|
||||
R.drawable.button_crop
|
||||
@@ -247,6 +252,9 @@ class DetectorView : View {
|
||||
if (handleActive) {
|
||||
canvas.drawClip()
|
||||
}
|
||||
if (prefs.showCrosshairs) {
|
||||
canvas.drawCrosshairs()
|
||||
}
|
||||
canvas.drawDots()
|
||||
if (prefs.showCropHandle) {
|
||||
canvas.drawHandle()
|
||||
@@ -294,6 +302,28 @@ class DetectorView : View {
|
||||
)
|
||||
}
|
||||
|
||||
private fun Canvas.drawCrosshairs() {
|
||||
val left: Float
|
||||
val top: Float
|
||||
val right: Float
|
||||
val bottom: Float
|
||||
if (handleActive) {
|
||||
left = roi.left.toFloat()
|
||||
top = roi.top.toFloat()
|
||||
right = roi.right.toFloat()
|
||||
bottom = roi.bottom.toFloat()
|
||||
} else {
|
||||
left = 0f
|
||||
top = 0f
|
||||
right = viewWidth.toFloat()
|
||||
bottom = viewHeight.toFloat()
|
||||
}
|
||||
val cx = (left + right) * .5f
|
||||
val cy = (top + bottom) * .5f
|
||||
drawLine(cx, top, cx, bottom, crosshairPaint)
|
||||
drawLine(left, cy, right, cy, crosshairPaint)
|
||||
}
|
||||
|
||||
private fun updateClipRect() {
|
||||
clampHandlePos()
|
||||
val dx = abs(handlePos.x - center.x)
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M313 520l224 224-57 56-320-320 320-320 57 56-224 224h487v80H313z"/>
|
||||
</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="@android:color/white" android:pathData="M480 340q13 0 21.5-9t8.5-21q0-13-8.5-21.5T480 280q-12 0-21 8.5t-9 21.5q0 12 9 21t21 9zM172 595q-15-26-23.5-54.5T140 480q0-32 8.5-60.5T172 365l64 50q-8 15-12 31t-4 34q0 18 4 34t12 31l-64 50zM62 681q-29-44-45.5-94.5T0 480q0-56 16.5-106.5T62 279l63 50q-21 33-33 71t-12 80q0 42 12 80.5t33 71.5l-63 49zm298 119q-33 0-56.5-23.5T280 720V240q0-33 23.5-56.5T360 160h240q33 0 56.5 23.5T680 240v480q0 33-23.5 56.5T600 800H360zm0-80h240V240H360v480zm427-125l-64-50q8-15 12.5-31t4.5-34q0-18-4.5-34T723 415l64-50q15 26 24 54.5t9 60.5q0 32-9 60.5T787 595zm111 85l-63-49q21-33 33-71t12-80q0-42-12-80.5T835 328l63-49q29 43 45.5 93.5T960 479q0 56-16.5 106.5T898 680zm-538 40V240v480z"/>
|
||||
</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="@android:color/white" android:pathData="M440 880V576L256 760l-56-56 224-224-224-224 56-56 184 184V80h40l228 228-172 172 172 172-228 228h-40zm80-496l76-76-76-74v150zm0 342l76-74-76-76v150z"/>
|
||||
</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="@android:color/white" android:pathData="M680 920V760H280q-33 0-56.5-23.5T200 680V280H40v-80h160V40h80v640h640v80H760v160h-80zm0-320V280H360v-80h320q33 0 56.5 23.5T760 280v320h-80z"/>
|
||||
</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="@android:color/white" android:pathData="M340.5 811.5Q275 783 226 734t-77.5-114.5Q120 554 120 480q0-44 10-85.5t29-78q19-36.5 45.5-68T264 192l272 272-56 56-216-216q-30 36-47 80.5T200 480q0 116 82 198t198 82q116 0 198-82t82-198q0-107-68.5-184.5T520 204v76h-80V120h40q74 0 139.5 28.5T734 226q49 49 77.5 114.5T840 480q0 74-28.5 139.5T734 734q-49 49-114.5 77.5T480 840q-74 0-139.5-28.5zm-89-303Q240 497 240 480t11.5-28.5Q263 440 280 440t28.5 11.5Q320 463 320 480t-11.5 28.5Q297 520 280 520t-28.5-11.5zm200 200Q440 697 440 680t11.5-28.5Q463 640 480 640t28.5 11.5Q520 663 520 680t-11.5 28.5Q497 720 480 720t-28.5-11.5zm200-200Q640 497 640 480t11.5-28.5Q663 440 680 440t28.5 11.5Q720 463 720 480t-11.5 28.5Q697 520 680 520t-28.5-11.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="@android:color/white" android:pathData="M440 160v487L216 423l-56 57 320 320 320-320-56-57-224 224V160h-80z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M640 680l-57-56 184-184-184-184 57-56 240 240-240 240zM80 760V600q0-83 58.5-141.5T280 400h247L383 256l57-56 240 240-240 240-57-56 144-144H280q-50 0-85 35t-35 85v160H80z"/>
|
||||
</vector>
|
||||
@@ -1,3 +1,3 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24.0" android:viewportWidth="24.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="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"/>
|
||||
<path android:fillColor="#FF000000" android:pathData="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.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="@android:color/white" android:pathData="M501 460zm-21 420q-33 0-56.5-23.5T400 800h160q0 33-23.5 56.5T480 880zM160 760v-80h80V400q0-83 50-147.5T420 168v-28q0-25 17.5-42.5T480 80q25 0 42.5 17.5T540 140v28q29 7 53.5 20.5T639 220l-57 57q-21-17-47-27t-55-10q-66 0-113 47t-47 113v280h480v80H160zm496-219l-56-57q10-10 15-24t5-32q0-18-5-32.5T600 371l56-56q21 21 32.5 50t11.5 63q0 34-11.5 63T656 541zm43 43q29-29 45-70t16-86q0-45-16-86t-45-70l57-56q41 41 62.5 95.5T840 428q0 62-21.5 116.5T756 640l-57-56z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#ffffffff" android:pathData="M10 4h4c1.1 0 2 0.9 2 2v3l3 3v3h-6v7l-1 1-1-1v-7H5v-3l3-3V6c0-1.1 0.9-2 2-2z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:fillColor="#ffffffff" android:pathData="M10 6h4v3.83l3 3.34V13H7v0.17l3-3.34V6zm0-2C8.9 4 8 4.9 8 6v3l-3 3v3h6v7l1 1 1-1v-7h6v-3l-3-3V6c0-1.1-0.9-2-2-2h-4z"/>
|
||||
</vector>
|
||||
@@ -1,3 +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"/>
|
||||
<path android:fillColor="#fff" android:pathData="M480 480q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 66-47 113t-113 47zM160 800V688q0-34 17.5-62.5T224 582q62-31 126-46.5T480 520q66 0 130 15.5T736 582q29 15 46.5 43.5T800 688v112H160zm80-80h480v-32q0-11-5.5-20T700 654q-54-27-109-40.5T480 600q-56 0-111 13.5T260 654q-9 5-14.5 14t-5.5 20v32zm240-320q33 0 56.5-23.5T560 320q0-33-23.5-56.5T480 240q-33 0-56.5 23.5T400 320q0 33 23.5 56.5T480 400zm0-80zm0 400z"/>
|
||||
</vector>
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="#FF000000" android:pathData="M3 11h8V3H3v8zm2-6h4v4H5V5zM3 21h8v-8H3v8zm2-6h4v4H5v-4zm8-12v8h8V3h-8zm6 6h-4V5h4v4zm0 10h2v2h-2zm-6-6h2v2h-2zm2 2h2v2h-2zm-2 2h2v2h-2zm2 2h2v2h-2zm2-2h2v2h-2zm0-4h2v2h-2zm2 2h2v2h-2z"/>
|
||||
</vector>
|
||||
@@ -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="@android:color/white" android:pathData="M80 880V160q0-33 23.5-56.5T160 80h640q33 0 56.5 23.5T880 160v480q0 33-23.5 56.5T800 720H240L80 880zm126-240h594V160H160v525l46-45zm-46 0V160v480z"/>
|
||||
</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="@android:color/white" android:pathData="M320 840q-33 0-56.5-23.5T240 760V200q0-33 23.5-56.5T320 120h320q33 0 56.5 23.5T720 200v560q0 33-23.5 56.5T640 840H320zm320-80V200H320v560h320zM508.5 308.5Q520 297 520 280t-11.5-28.5Q497 240 480 240t-28.5 11.5Q440 263 440 280t11.5 28.5Q463 320 480 320t28.5-11.5zM0 600V360h80v240H0zm120 80V280h80v400h-80zm760-80V360h80v240h-80zm-120 80V280h80v400h-80zm-440 80V200v560z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,36 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.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"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/automated_action_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -0,0 +1,25 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<de.markusfisch.android.binaryeye.widget.ConfinedScalingImageView
|
||||
android:id="@+id/barcode"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:contentDescription="@string/view_barcode"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/share"
|
||||
android:contentDescription="@string/share"
|
||||
android:src="@drawable/ic_action_share"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -1,8 +1,11 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<de.markusfisch.android.cameraview.widget.CameraView
|
||||
<merge
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<androidx.camera.view.PreviewView
|
||||
android:id="@+id/camera_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
||||
android:layout_height="match_parent"
|
||||
app:scaleType="fillCenter"/>
|
||||
<de.markusfisch.android.binaryeye.widget.DetectorView
|
||||
android:id="@+id/detector_view"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
+20
-14
@@ -1,8 +1,6 @@
|
||||
<FrameLayout
|
||||
<merge
|
||||
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">
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<de.markusfisch.android.binaryeye.widget.ConfinedScrollView
|
||||
android:id="@+id/scroll_view"
|
||||
android:clipToPadding="false"
|
||||
@@ -57,8 +55,8 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:typeface="monospace"
|
||||
android:textSize="12sp"
|
||||
android:typeface="monospace"
|
||||
tools:text="54 65 73 74 20 51 52 20 Test QR\n43 6F 64 65 Code"/>
|
||||
<TextView
|
||||
android:id="@+id/stamp"
|
||||
@@ -71,20 +69,28 @@
|
||||
android:id="@+id/recreation"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:adjustViewBounds="true"
|
||||
android:contentDescription="@string/view_barcode"/>
|
||||
</LinearLayout>
|
||||
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/open"
|
||||
android:contentDescription="@string/open_url"
|
||||
android:src="@drawable/ic_action_open"/>
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/open"
|
||||
android:contentDescription="@string/open_url"
|
||||
android:src="@drawable/ic_action_open"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
+22
-16
@@ -1,8 +1,6 @@
|
||||
<FrameLayout
|
||||
<merge
|
||||
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">
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<de.markusfisch.android.binaryeye.widget.ConfinedScrollView
|
||||
android:id="@+id/scroll_view"
|
||||
android:clipToPadding="false"
|
||||
@@ -24,11 +22,11 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="start|top"
|
||||
android:typeface="monospace"
|
||||
android:imeOptions="flagNoExtractUi"
|
||||
android:inputType="textMultiLine"
|
||||
android:hint="@string/input_content_here"
|
||||
android:importantForAutofill="no"/>
|
||||
android:imeOptions="flagNoExtractUi"
|
||||
android:importantForAutofill="no"
|
||||
android:inputType="textMultiLine"
|
||||
android:typeface="monospace"/>
|
||||
<CheckBox
|
||||
android:id="@+id/unescape"
|
||||
android:layout_width="match_parent"
|
||||
@@ -73,13 +71,21 @@
|
||||
</LinearLayout>
|
||||
</de.markusfisch.android.binaryeye.widget.ConfinedScrollView>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/encode"
|
||||
android:contentDescription="@string/encode"
|
||||
android:src="@drawable/ic_action_next"/>
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/encode"
|
||||
android:contentDescription="@string/encode"
|
||||
android:src="@drawable/ic_action_next"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -0,0 +1,38 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<ListView
|
||||
android:id="@+id/scans"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:choiceMode="multipleChoice"
|
||||
android:clipToPadding="false"
|
||||
android:divider="@color/separator"
|
||||
android:dividerHeight="1px"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:visibility="gone"
|
||||
android:id="@+id/use_history"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:padding="16dp"
|
||||
android:text="@string/use_history"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:visibility="gone"
|
||||
android:id="@+id/share"
|
||||
android:contentDescription="@string/share"
|
||||
android:src="@drawable/ic_action_share"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/progress_view"/>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -0,0 +1,36 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.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"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/automated_action_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -0,0 +1,37 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<ListView
|
||||
android:id="@+id/suggestions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:choiceMode="multipleChoice"
|
||||
android:clipToPadding="false"
|
||||
android:divider="@color/separator"
|
||||
android:dividerHeight="1px"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.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_suggestions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:padding="32dp"
|
||||
android:text="@string/clear_network_suggestions_nothing_to_remove"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/remove"
|
||||
android:contentDescription="@string/remove_suggestion"
|
||||
android:src="@drawable/ic_action_remove"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -0,0 +1,36 @@
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<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"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/main"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="@bool/fitsSystemWindows">
|
||||
<include layout="@layout/toolbar"/>
|
||||
<androidx.coordinatorlayout.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"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/profile_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/navbar"/>
|
||||
</merge>
|
||||
@@ -17,6 +17,15 @@
|
||||
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/format"/>
|
||||
<Spinner
|
||||
android:id="@+id/format"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<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/ignore_code_regex_hint"
|
||||
android:inputType="text"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="12dp"
|
||||
android:text="@string/format"/>
|
||||
<Spinner
|
||||
android:id="@+id/format"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
+10
-1
@@ -8,7 +8,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:text="@string/find_code_with_content"/>
|
||||
android:text="@string/find_barcode_with_content"/>
|
||||
<EditText
|
||||
android:id="@+id/term"
|
||||
android:layout_width="match_parent"
|
||||
@@ -19,4 +19,13 @@
|
||||
android:maxLines="1"
|
||||
android:maxLength="1024"
|
||||
android:importantForAutofill="no"/>
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:text="@string/format"/>
|
||||
<Spinner
|
||||
android:id="@+id/format"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
</LinearLayout>
|
||||
@@ -1,31 +0,0 @@
|
||||
<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"/>
|
||||
<androidx.coordinatorlayout.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"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/automated_action_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
@@ -1,20 +0,0 @@
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<de.markusfisch.android.binaryeye.widget.ConfinedScalingImageView
|
||||
android:id="@+id/barcode"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:contentDescription="@string/view_barcode"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/share"
|
||||
android:contentDescription="@string/share"
|
||||
android:src="@drawable/ic_action_share"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
@@ -1,33 +0,0 @@
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ListView
|
||||
android:id="@+id/scans"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:choiceMode="multipleChoice"
|
||||
android:clipToPadding="false"
|
||||
android:divider="@color/separator"
|
||||
android:dividerHeight="1px"/>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:id="@+id/inset_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<androidx.appcompat.widget.SwitchCompat
|
||||
android:visibility="gone"
|
||||
android:id="@+id/use_history"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:padding="16dp"
|
||||
android:text="@string/use_history"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:visibility="gone"
|
||||
android:id="@+id/share"
|
||||
android:contentDescription="@string/share"
|
||||
android:src="@drawable/ic_action_share"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
<include layout="@layout/progress_view"/>
|
||||
</FrameLayout>
|
||||
@@ -1,32 +0,0 @@
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<ListView
|
||||
android:id="@+id/suggestions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:choiceMode="multipleChoice"
|
||||
android:clipToPadding="false"
|
||||
android:divider="@color/separator"
|
||||
android:dividerHeight="1px"/>
|
||||
<androidx.coordinatorlayout.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_suggestions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:padding="32dp"
|
||||
android:text="@string/clear_network_suggestions_nothing_to_remove"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/remove"
|
||||
android:contentDescription="@string/remove_suggestion"
|
||||
android:src="@drawable/ic_action_remove"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
@@ -1,31 +0,0 @@
|
||||
<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"/>
|
||||
<androidx.coordinatorlayout.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"/>
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
style="@style/FAB"
|
||||
android:id="@+id/add"
|
||||
android:contentDescription="@string/profile_add"
|
||||
android:src="@drawable/ic_action_create"/>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</FrameLayout>
|
||||
@@ -1,31 +1,41 @@
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:background="@drawable/list_selector"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:descendantFocusability="blocksDescendants"
|
||||
android:padding="16dp">
|
||||
<TextView
|
||||
style="@style/SecondaryText"
|
||||
android:id="@+id/time"
|
||||
android:id="@+id/meta"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentTop="true"/>
|
||||
<TextView
|
||||
style="@style/SecondaryText"
|
||||
android:id="@+id/format"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="end"
|
||||
android:layout_toEndOf="@+id/time"
|
||||
<ImageButton
|
||||
android:id="@+id/pin"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentTop="true"/>
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginStart="8dp"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:focusable="false"
|
||||
android:focusableInTouchMode="false"
|
||||
android:contentDescription="@string/pin_item"
|
||||
android:padding="8dp"
|
||||
android:scaleType="centerInside"
|
||||
android:src="@drawable/ic_action_pin_outline"
|
||||
app:tint="@color/accent"/>
|
||||
<TextView
|
||||
android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@+id/time"
|
||||
android:layout_below="@+id/meta"
|
||||
android:layout_toStartOf="@+id/pin"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:drawablePadding="16dp"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
<item
|
||||
android:id="@+id/restrict_format"
|
||||
android:title="@string/restrict_format"
|
||||
android:icon="@drawable/ic_action_restrict_format"
|
||||
android:icon="@drawable/ic_action_scan"
|
||||
material:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/find_code"
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
<string name="cannot_resolve_action">لم يتم العثور على تطبيق يمكنه فتح ذلك</string>
|
||||
<string name="pick_search_engine">اختر محرك البحث</string>
|
||||
<string name="format">التنسيق</string>
|
||||
<string name="all_formats">كل التنسيقات</string>
|
||||
<string name="size_width_by_height">الحجم بالبكسل: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">بدون تكبير</string>
|
||||
<string name="add_quiet_zone">إضافة منطقة هادئة</string>
|
||||
@@ -70,7 +71,7 @@
|
||||
<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_barcode_with_content">ما المحتوى؟</string>
|
||||
<string name="find_code_hint">مصطلح أو تعبير عادي</string>
|
||||
<string name="does_not_match_search_term">لا يطابق مصطلح البحث</string>
|
||||
<string name="scan_for">مسح %s</string>
|
||||
@@ -99,6 +100,8 @@
|
||||
<string name="follow_system_settings">اتبع إعدادات النظام</string>
|
||||
<string name="show_crop_handle">عرض محدد الاقتصاص</string>
|
||||
<string name="show_crop_handle_summary">حصر المسح في منطقة قابلة للتخصيص.</string>
|
||||
<string name="show_crosshairs">إظهار خطوط التصويب</string>
|
||||
<string name="show_crosshairs_summary">إظهار خطوط التصويب فوق منطقة الاقتصاص أو على كامل الشاشة.</string>
|
||||
<string name="barcode_formats">تنسيقات Barcode</string>
|
||||
<string name="zoom_by_swiping">مرر لأعلى أو لأسفل للتكبير/التصغير</string>
|
||||
<string name="zoom_by_swiping_summary">مرر لأعلى أو لأسفل على واجهة الكاميرا للتحكم في التكبير/التصغير لها.</string>
|
||||
@@ -125,6 +128,23 @@
|
||||
<string name="ignore_consecutive_duplicates">النسخ المكررة المتتالية</string>
|
||||
<string name="ignore_any_duplicates">أي نسخ مكررة</string>
|
||||
<string name="accept_duplicates">قبول النسخ المكررة</string>
|
||||
<string name="ignore_codes">رموز لاستبعادها من السجل</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="zero">%d رمز مستبعد من السجل</item>
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="two">%d رمزان مستبعدان من السجل</item>
|
||||
<item quantity="few">%d رموز مستبعدة من السجل</item>
|
||||
<item quantity="many">%d رمزًا مستبعدًا من السجل</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">فتح مباشرةً</string>
|
||||
<string name="open_immediately_summary">تخطي الفحص وفتح المحتويات على الفور. قد يتم فتح محتويات ضارة إذا تم تمكينه.</string>
|
||||
<string name="copy_immediately">نسخ تلقائي إلى الحافظة</string>
|
||||
@@ -142,7 +162,6 @@
|
||||
<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>
|
||||
@@ -231,6 +250,8 @@
|
||||
<string name="search_scan">البحث عن عملية مسح</string>
|
||||
<string name="add_to_history">إضافة إلى التاريخ</string>
|
||||
<string name="added_to_history">تمت الإضافة إلى التاريخ</string>
|
||||
<string name="pin_item">تثبيت</string>
|
||||
<string name="unpin_item">إلغاء التثبيت</string>
|
||||
<string name="export_to_file">تصدير إلى ملف</string>
|
||||
<string name="export_as">تصدير كـ؟</string>
|
||||
<string name="export_csv_comma">ملف CSV مع فواصل</string>
|
||||
@@ -273,5 +294,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Добре дошли!</string>
|
||||
<string name="mode_expert">Разширен</string>
|
||||
@@ -15,10 +16,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>
|
||||
@@ -48,6 +49,7 @@
|
||||
<string name="cannot_resolve_action">Няма приложение което може да отвори това</string>
|
||||
<string name="pick_search_engine">Изберете търсачка</string>
|
||||
<string name="format">Формат</string>
|
||||
<string name="all_formats">Всички формати</string>
|
||||
<string name="size_width_by_height">Размер в пиксели: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Без увеличение</string>
|
||||
<string name="add_quiet_zone">Добавяне на тиха зона</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<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_barcode_with_content">Какво съдържание?</string>
|
||||
<string name="find_code_hint">Термин или регулярен израз</string>
|
||||
<string name="does_not_match_search_term">Не съответства на търсения термин</string>
|
||||
<string name="scan_for">Сканиране %s</string>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">Следване на системните настройки</string>
|
||||
<string name="show_crop_handle">Показване на ограничителя за изрязване</string>
|
||||
<string name="show_crop_handle_summary">Ограничете сканирането до персонализирана област.</string>
|
||||
<string name="show_crosshairs">Показване на мерник</string>
|
||||
<string name="show_crosshairs_summary">Показване на мерник върху областта за изрязване или върху целия екран.</string>
|
||||
<string name="barcode_formats">Баркодови формати</string>
|
||||
<string name="zoom_by_swiping">Плъзване нагоре/надолу, за да увеличите</string>
|
||||
<string name="zoom_by_swiping_summary">Плъзнете нагоре или надолу в екрана на камерата, за да контролирате приближаването на камерата.</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Игнориране на дубликатите</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Приемане на дубликати</string>
|
||||
<string name="ignore_codes">Кодове за изключване от историята</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Отваряй внезапно</string>
|
||||
<string name="open_immediately_summary">Пропуска проверката и внезапно отваря съдържанието. Може да отвори вредно съдържание, ако е активирано.</string>
|
||||
<string name="copy_immediately">Поставяй в клипборда</string>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">Търсещо сканиране</string>
|
||||
<string name="add_to_history">Добави към историята</string>
|
||||
<string name="added_to_history">Добавено към историята</string>
|
||||
<string name="pin_item">Закрепи</string>
|
||||
<string name="unpin_item">Премахни закрепването</string>
|
||||
<string name="export_to_file">Извеждане в файл</string>
|
||||
<string name="export_as">Извеждане като?</string>
|
||||
<string name="export_csv_comma">CSV файл със запетаи</string>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">স্বাগতম!</string>
|
||||
<string name="mode_expert">উন্নত</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$dটি অক্ষর, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">ত্রুটি ঠিককরণ পরিমাণ</string>
|
||||
<string name="error_correction_level_l" formatted="false">কম (~৭% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_m" formatted="false">মধ্যম (~১৫% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_q" formatted="false">বেশি (~২৫% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_h" formatted="false">অনেক বেশি (~৩০% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_l" formatted="false">কম (~৭% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_m" formatted="false">মধ্যম (~১৫% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_q" formatted="false">বেশি (~২৫% ঠিককরণ)</string>
|
||||
<string name="error_correction_level_h" formatted="false">অনেক বেশি (~৩০% ঠিককরণ)</string>
|
||||
<string name="label">লেবেল</string>
|
||||
<string name="colors">পূর্ববর্তী এবং সৃজনাধীন</string>
|
||||
<string name="colors_black_on_white">সাদা উপরে কালো</string>
|
||||
@@ -48,6 +49,7 @@
|
||||
<string name="cannot_resolve_action">খোলার মতো অ্যাপ নেই</string>
|
||||
<string name="pick_search_engine">একটা সার্চ ইঞ্জিন নাও</string>
|
||||
<string name="format">ধরণ</string>
|
||||
<string name="all_formats">সব ফরম্যাট</string>
|
||||
<string name="size_width_by_height">পিক্সেলে আকা:%1$d×%2$d</string>
|
||||
<string name="size_no_magnification">কোনো বৃদ্ধি নেই</string>
|
||||
<string name="add_quiet_zone">শান্তি জোন যোগ করুন</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<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_barcode_with_content"> কী বিষয়টি? </string>
|
||||
<string name="find_code_hint">শব্দ বা রেগুলার এক্সপ্রেশন</string>
|
||||
<string name="does_not_match_search_term">অনুসন্ধান শর্তের সাথে মিলে না</string>
|
||||
<string name="scan_for">স্ক্যান %s</string>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">ব্যবস্থার পছন্দসমূহ অনুসরণ করো</string>
|
||||
<string name="show_crop_handle">ছাটার সীমা দেখাও</string>
|
||||
<string name="show_crop_handle_summary">পরিবর্তনযোগ্য জায়গায়ই শুধু খুঁজো।</string>
|
||||
<string name="show_crosshairs">ক্রসহেয়ার দেখাও</string>
|
||||
<string name="show_crosshairs_summary">ক্রসহেয়ারকে কাটার অংশ বা পুরো পর্দাজুড়ে দেখাও।</string>
|
||||
<string name="barcode_formats">বারকোড বিন্যাস</string>
|
||||
<string name="zoom_by_swiping">ওপরে/নিচে টানো বড়ো করার জন্য</string>
|
||||
<string name="zoom_by_swiping_summary">ক্যামেরার ছোটো-বড় নিয়ন্ত্রণের জন্য উপরে-নিচে টানো।</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">দ্বিত্ব উপেক্ষা করো</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">ডুপ্লিকেট গ্রহণ করুন</string>
|
||||
<string name="ignore_codes">ইতিহাস থেকে বাদ দেওয়ার কোড</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">সাথে সাথে খুলো</string>
|
||||
<string name="open_immediately_summary">না দেখে সাথে সাথে খুলো। সক্রিয় থাকলে ক্ষতিকারক তথ্য খুলতে পারে।</string>
|
||||
<string name="copy_immediately">ক্লিপবোর্ডে রাখো</string>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">আগেরগুলোতে খুঁজো</string>
|
||||
<string name="add_to_history">ইতিহাসে যোগ করুন</string>
|
||||
<string name="added_to_history">ইতিহাসে যোগ করা হয়েছে</string>
|
||||
<string name="pin_item">পিন করুন</string>
|
||||
<string name="unpin_item">আনপিন করুন</string>
|
||||
<string name="export_to_file">নথিতে রপ্তানি করো</string>
|
||||
<string name="export_as">রপ্তানির ধরণ?</string>
|
||||
<string name="export_csv_comma">কমাসহ সিএসভি(.csv) নথি</string>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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>
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
<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="all_formats">Všechny formáty</string>
|
||||
<string name="size_width_by_height">Velikost v pixelech: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Žádné zvětšení</string>
|
||||
<string name="add_quiet_zone">Přidat tichou zónu</string>
|
||||
@@ -68,9 +69,9 @@
|
||||
<string name="restrict_format">Omezit na formát</string>
|
||||
<string name="remove_restriction">Zrušit omezení formátu</string>
|
||||
<string name="find_code">Najít kód</string>
|
||||
<string name="find_code_with_content">Co obsah?</string>
|
||||
<string name="find_barcode_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="does_not_match_search_term">Neodpovídá hledanému dotazu</string>
|
||||
<string name="scan_for">Naskenovat %s</string>
|
||||
<string name="quarter_second">Čtvrt sekundy</string>
|
||||
<string name="half_second">Půl sekundy</string>
|
||||
@@ -97,6 +98,8 @@
|
||||
<string name="follow_system_settings">Podle systému</string>
|
||||
<string name="show_crop_handle">Zobrazovat hrany výřezu</string>
|
||||
<string name="show_crop_handle_summary">Omezí skenování na zvolenou oblast.</string>
|
||||
<string name="show_crosshairs">Zobrazovat zaměřovací kříž</string>
|
||||
<string name="show_crosshairs_summary">Zobrazit zaměřovací kříž přes oblast výřezu nebo přes celou obrazovku.</string>
|
||||
<string name="barcode_formats">Formáty čárových kódů</string>
|
||||
<string name="zoom_by_swiping">Potáhnutím nahoru/dolů přiblížit</string>
|
||||
<string name="zoom_by_swiping_summary">Přetáhnutím nahoru nebo dolů se zvětší / zmenší úroveň přiblížení.</string>
|
||||
@@ -123,6 +126,21 @@
|
||||
<string name="ignore_consecutive_duplicates">Ignorovat duplikáty</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Přijmout duplicity</string>
|
||||
<string name="ignore_codes">Kódy vyloučené z historie</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="few">%d vyloučené kódy</item>
|
||||
<item quantity="many">%d vyloučeného kódu</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -135,12 +153,11 @@
|
||||
<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>
|
||||
<string name="close_automatically">Vrátit se zpět po zkopírování/sdílení</string>
|
||||
<string name="close_automatically_summary">Po zkopírovaní či sdílení se automaticky vrátí na skenovací obrazovku.</string>
|
||||
<string name="default_search_engine">Nerozpoznaná data otevřít v</string>
|
||||
<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>
|
||||
@@ -148,7 +165,7 @@
|
||||
<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>
|
||||
<item quantity="other">%d automatizovaných akcí</item>
|
||||
</plurals>
|
||||
<string name="automated_action_add">Přidat akci</string>
|
||||
<string name="automated_action_edit">Upravit akci</string>
|
||||
@@ -227,6 +244,8 @@
|
||||
<string name="search_scan">Vyhledat sken</string>
|
||||
<string name="add_to_history">Přidat do historie</string>
|
||||
<string name="added_to_history">Přidáno do historie</string>
|
||||
<string name="pin_item">Připnout položku</string>
|
||||
<string name="unpin_item">Odepnout položku</string>
|
||||
<string name="export_to_file">Exportovat do souboru</string>
|
||||
<string name="export_as">Exportovat jako?</string>
|
||||
<string name="export_csv_comma">CSV oddělené čárkami</string>
|
||||
@@ -269,5 +288,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Velkommen!</string>
|
||||
<string name="mode_expert">Avanceret</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$d karakterer, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Fejlkorrektionsniveau</string>
|
||||
<string name="error_correction_level_l" formatted="false">Lav (~7% korrigering)</string>
|
||||
<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="error_correction_level_l" formatted="false">Lav (~7% korrigering)</string>
|
||||
<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">Mærke</string>
|
||||
<string name="colors">For- og baggrund</string>
|
||||
<string name="colors_black_on_white">Sort på hvidt</string>
|
||||
@@ -48,6 +49,7 @@
|
||||
<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="all_formats">Alle formater</string>
|
||||
<string name="size_width_by_height">Størrelse i pixels: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Ingen forstørrelse</string>
|
||||
<string name="add_quiet_zone">Tilføj stille zone</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<string name="restrict_format">Begræns format</string>
|
||||
<string name="remove_restriction">Fjern begrænsningen</string>
|
||||
<string name="find_code">Find kode</string>
|
||||
<string name="find_code_with_content">Hvad indhold?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">Følg systemindstillingerne</string>
|
||||
<string name="show_crop_handle">Vis beskæringsbegrænser</string>
|
||||
<string name="show_crop_handle_summary">Begræns scanning til et område, der kan tilpasses.</string>
|
||||
<string name="show_crosshairs">Vis trådkors</string>
|
||||
<string name="show_crosshairs_summary">Vis et trådkors over beskæringsområdet eller hele skærmen.</string>
|
||||
<string name="barcode_formats">Stregkode formater</string>
|
||||
<string name="zoom_by_swiping">Stryg op/ned for at zoome</string>
|
||||
<string name="zoom_by_swiping_summary">Stryg op eller ned på kameraskærmen for at styre kameraets zoom.</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Ignorer dubletter</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="ignore_codes">Koder der udelades fra historikken</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Åbn straks</string>
|
||||
<string name="open_immediately_summary">Spring inspektion over og åbn indholdet med det samme. Kan åbne skadeligt indhold, hvis det er aktiveret.</string>
|
||||
<string name="copy_immediately">Læg i udklipsholderen</string>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">Søg scanning</string>
|
||||
<string name="add_to_history">Tilføj til historik</string>
|
||||
<string name="added_to_history">Tilføjet til historik</string>
|
||||
<string name="pin_item">Fastgør</string>
|
||||
<string name="unpin_item">Frigør</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>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Willkommen!</string>
|
||||
<string name="mode_expert">Erweitert</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$d Zeichen, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Fehlerkorrektur-Level</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% wiederherstellbar)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% wiederherstellbar)</string>
|
||||
<string name="label">Bezeichnung</string>
|
||||
<string name="colors">Vor und Hintergrund</string>
|
||||
<string name="colors_black_on_white">Schwarz auf Weiß</string>
|
||||
@@ -48,6 +49,7 @@
|
||||
<string name="cannot_resolve_action">Keine App kann das öffnen</string>
|
||||
<string name="pick_search_engine">Suchmaschine auswählen</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="all_formats">Alle Formate</string>
|
||||
<string name="size_width_by_height">Größe in Pixel: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Keine Vergrößerung</string>
|
||||
<string name="add_quiet_zone">Ruhezone hinzufügen</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<string name="restrict_format">Format eingrenzen</string>
|
||||
<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_barcode_with_content">Mit welchem Inhalt?</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>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">Systemeinstellung übernehmen</string>
|
||||
<string name="show_crop_handle">Ausschnitt verkleinern anzeigen</string>
|
||||
<string name="show_crop_handle_summary">Scannen auf einen anpassbaren Bereich einschränken.</string>
|
||||
<string name="show_crosshairs">Fadenkreuz anzeigen</string>
|
||||
<string name="show_crosshairs_summary">Fadenkreuz über dem Scanbereich oder Vollbild anzeigen.</string>
|
||||
<string name="barcode_formats">Barcode Formate</string>
|
||||
<string name="zoom_by_swiping">Geste für Kamerazoom</string>
|
||||
<string name="zoom_by_swiping_summary">Im Kamerabildschirm nach oben oder unten streichen, um den Kamerazoom zu steuern.</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Aufeinanderfolgende Duplikate</string>
|
||||
<string name="ignore_any_duplicates">Jedes Duplicat</string>
|
||||
<string name="accept_duplicates">Akzeptiere Duplikate</string>
|
||||
<string name="ignore_codes">Codes vom Verlauf ausschließen</string>
|
||||
<string name="ignore_codes_none">Keine ignorierten Codes</string>
|
||||
<string name="ignore_codes_empty">Noch keine ignorierten Codes</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignorierter Code</item>
|
||||
<item quantity="other">%d ignorierte Codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Code hinzufügen</string>
|
||||
<string name="ignore_code_edit">Code bearbeiten</string>
|
||||
<string name="ignore_code_regex_hint">z.B. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex erforderlich</string>
|
||||
<string name="ignore_code_regex_invalid">Ungültiger Regex</string>
|
||||
<string name="ignore_code_remove_confirm">Diesen ignorierten Code entfernen?</string>
|
||||
<string name="open_immediately">Inhalte sofort öffnen</string>
|
||||
<string name="open_immediately_summary">Inspektion überspringen und Inhalt sofort öffnen. Kann schädliche Inhalte öffnen, wenn aktiviert.</string>
|
||||
<string name="copy_immediately">Automatisch in Zwischenablage</string>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">Code suchen</string>
|
||||
<string name="add_to_history">Zu gespeicherten Codes hinzufügen</string>
|
||||
<string name="added_to_history">Zu den gespeicherten Codes hinzugefügt</string>
|
||||
<string name="pin_item">Anheften</string>
|
||||
<string name="unpin_item">Lösen</string>
|
||||
<string name="export_to_file">In Datei exportieren</string>
|
||||
<string name="export_as">Exportieren als?</string>
|
||||
<string name="export_csv_comma">CSV Datei mit Kommas</string>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">¡Bienvenido!</string>
|
||||
<string name="mode_expert">Avanzado</string>
|
||||
@@ -12,13 +13,14 @@
|
||||
<string name="binary_data">(datos binarios)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d carácter, %1$s</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other">%2$d caracteres, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Nivel de corrección de errores</string>
|
||||
<string name="error_correction_level_l" formatted="false">Bajo (~7% de correción)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medio (~15% de correción)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Cuartil (~25% de correción)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (~30% de correción)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Bajo (~7% de correción)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medio (~15% de correción)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Cuartil (~25% de correción)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (~30% de correción)</string>
|
||||
<string name="label">Etiqueta</string>
|
||||
<string name="colors">Color frontal y fondo</string>
|
||||
<string name="colors_black_on_white">Negro sobre blanco</string>
|
||||
@@ -48,6 +50,7 @@
|
||||
<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="all_formats">Todos los formatos</string>
|
||||
<string name="size_width_by_height">Tamaño en píxeles: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Sin aumento</string>
|
||||
<string name="add_quiet_zone">Agregar zona tranquila</string>
|
||||
@@ -65,7 +68,7 @@
|
||||
<string name="restrict_format">Restringir formato</string>
|
||||
<string name="remove_restriction">Eliminar restricción</string>
|
||||
<string name="find_code">Encontrar código</string>
|
||||
<string name="find_code_with_content">¿Qué contenido?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -94,6 +97,8 @@
|
||||
<string name="follow_system_settings">Seguir los ajustes del sistema</string>
|
||||
<string name="show_crop_handle">Mostrar delimitador de recorte</string>
|
||||
<string name="show_crop_handle_summary">Permite personalizar la región a escanear.</string>
|
||||
<string name="show_crosshairs">Mostrar mira</string>
|
||||
<string name="show_crosshairs_summary">Mostrar una mira sobre el área de recorte o toda la pantalla.</string>
|
||||
<string name="barcode_formats">Formatos de códigos de barras</string>
|
||||
<string name="zoom_by_swiping">Ampliar deslizando arriba/abajo</string>
|
||||
<string name="zoom_by_swiping_summary">Deslice el dedo hacia arriba o abajo sobre la pantalla para controlar el zoom de la cámara.</string>
|
||||
@@ -102,7 +107,7 @@
|
||||
<string name="try_harder">Optimizar la precisión del lector</string>
|
||||
<string name="try_harder_summary">Active esta opción para códigos muy difíciles de leer. Esto afectará al rendimiento.</string>
|
||||
<string name="show_toast_in_bulk_mode">Mostrar datos en el modo constante</string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente los datos escaneados al escanear constantemente. </string>
|
||||
<string name="show_toast_in_bulk_mode_summary">Mostrar brevemente los datos escaneados al escanear constantemente.</string>
|
||||
<string name="vibrate">Vibración al detectar</string>
|
||||
<string name="vibrate_summary">El dispositivo vibra cuando se reconoce un código.</string>
|
||||
<string name="beep">Sonido al detectar</string>
|
||||
@@ -120,6 +125,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Ignorar duplicados</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Aceptar duplicados</string>
|
||||
<string name="ignore_codes">Códigos que excluir del historial</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -137,7 +155,6 @@
|
||||
<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>
|
||||
@@ -222,6 +239,8 @@
|
||||
<string name="search_scan">Buscar escaneo</string>
|
||||
<string name="add_to_history">Añadir al historial</string>
|
||||
<string name="added_to_history">Añadido al historial</string>
|
||||
<string name="pin_item">Fijar</string>
|
||||
<string name="unpin_item">Desfijar</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>
|
||||
@@ -264,5 +283,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">خوش آمدید!</string>
|
||||
<string name="mode_expert">پیشرفته</string>
|
||||
@@ -48,6 +49,7 @@
|
||||
<string name="cannot_resolve_action">هیچ برنامهای نمیتواند آن را بگشاید</string>
|
||||
<string name="pick_search_engine">یک موتور جستوجو برگزینید</string>
|
||||
<string name="format">قالب</string>
|
||||
<string name="all_formats">همه قالبها</string>
|
||||
<string name="size_width_by_height">اندازه به پیکسل: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">بدون بزرگنمایی</string>
|
||||
<string name="add_quiet_zone">اضافه کردن حوزه ساکت</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<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_barcode_with_content">چه محتوا؟</string>
|
||||
<string name="find_code_hint">عبارت یا عبارت منظم</string>
|
||||
<string name="does_not_match_search_term">با عبارت جستجو مطابقت ندارد</string>
|
||||
<string name="scan_for">پویش %s</string>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">پیروی از زبان سامانه</string>
|
||||
<string name="show_crop_handle">نمایش محدود کننده برش</string>
|
||||
<string name="show_crop_handle_summary">پویش را به یک منطقه قابل تنظیم محدود میکند.</string>
|
||||
<string name="show_crosshairs">نمایش نشانهٔ هدف</string>
|
||||
<string name="show_crosshairs_summary">نشانهٔ هدف را روی ناحیهٔ برش یا تمام صفحه نمایش بده.</string>
|
||||
<string name="barcode_formats">قالبهای بارکد</string>
|
||||
<string name="zoom_by_swiping">برای بزرگنمایی به بالا یا پایین بکشید</string>
|
||||
<string name="zoom_by_swiping_summary">برای کنترل بزرگنمایی دوربین، در صفحهٔ دوربین به بالا یا پایین بکشید.</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">نادیده گرفتن موارد تکراری</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">تکراریها را پذیرا باش</string>
|
||||
<string name="ignore_codes">کدهایی برای حذف از تاریخچه</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">گشودن بلافاصله</string>
|
||||
<string name="open_immediately_summary">بازرسی را رها کنید و محتویات را فورا باز کنید. در صورت فعال بودن ممکن است محتوای مضر را باز کند.</string>
|
||||
<string name="copy_immediately">قرار دادن در تختهگیره</string>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">جستوجوی پویش</string>
|
||||
<string name="add_to_history">اضافه به تاریخچه</string>
|
||||
<string name="added_to_history">اضافه شد به تاریخچه</string>
|
||||
<string name="pin_item">سنجاق کردن</string>
|
||||
<string name="unpin_item">برداشتن سنجاق</string>
|
||||
<string name="export_to_file">برونریزی به پرونده</string>
|
||||
<string name="export_as">برونریزی به عنوان؟</string>
|
||||
<string name="export_csv_comma">پروندهٔ سیاسوی با ویرگول</string>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Bienvenue !</string>
|
||||
<string name="mode_expert">Avancé</string>
|
||||
@@ -12,6 +13,7 @@
|
||||
<string name="binary_data">(données binaires)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d caractère, %1$s</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other">%2$d caractères, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Niveau de correction d\'erreur</string>
|
||||
@@ -48,6 +50,7 @@
|
||||
<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="all_formats">Tous les formats</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">Ajouter une zone blanche</string>
|
||||
@@ -65,7 +68,7 @@
|
||||
<string name="restrict_format">Restreindre le format</string>
|
||||
<string name="remove_restriction">Supprimer la restriction</string>
|
||||
<string name="find_code">Trouver un code</string>
|
||||
<string name="find_code_with_content">Quel contenu ?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -94,6 +97,8 @@
|
||||
<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>
|
||||
<string name="show_crop_handle_summary">Restreindre le scan à une zone personnalisée.</string>
|
||||
<string name="show_crosshairs">Afficher le réticule</string>
|
||||
<string name="show_crosshairs_summary">Afficher le réticule sur la zone de cadrage ou sur tout l\'écran.</string>
|
||||
<string name="barcode_formats">Formats de codes-barres</string>
|
||||
<string name="zoom_by_swiping">Balayage haut/bas pour zoomer</string>
|
||||
<string name="zoom_by_swiping_summary">Balayer vers le haut ou vers le bas de l\'écran pour contrôler le niveau de zoom de la caméra.</string>
|
||||
@@ -120,6 +125,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Ignorer les doublons consécutifs</string>
|
||||
<string name="ignore_any_duplicates">Ignorer tous les doublons</string>
|
||||
<string name="accept_duplicates">Autoriser les doublons</string>
|
||||
<string name="ignore_codes">Codes a exclure de l\'historique</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Ouvrir immédiatement</string>
|
||||
<string name="open_immediately_summary">Ignorer l\'inspection et ouvrir le contenu immédiatement. Si cette option est activée, cela peut ouvrir un contenu nocif.</string>
|
||||
<string name="copy_immediately">Copier dans le presse-papiers</string>
|
||||
@@ -137,7 +155,6 @@
|
||||
<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>
|
||||
@@ -222,6 +239,8 @@
|
||||
<string name="search_scan">Rechercher un scan</string>
|
||||
<string name="add_to_history">Ajouter à l\'historique</string>
|
||||
<string name="added_to_history">Ajouté à l\'historique</string>
|
||||
<string name="pin_item">Épingler</string>
|
||||
<string name="unpin_item">Désépingler</string>
|
||||
<string name="export_to_file">Exporter en tant que fichier</string>
|
||||
<string name="export_as">Exporter en tant que ?</string>
|
||||
<string name="export_csv_comma">CSV avec virgules</string>
|
||||
@@ -264,5 +283,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Üdvözöljük!</string>
|
||||
<string name="mode_expert">Haladó</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$d karakter, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Hibajavítási szint</string>
|
||||
<string name="error_correction_level_l" formatted="false">Alacsony (~7% javítás)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Közepes (~15% javítás)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kvartilis (~25% javítás)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Magas (~30% javítás)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Alacsony (~7% javítás)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Közepes (~15% javítás)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kvartilis (~25% javítás)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Magas (~30% javítás)</string>
|
||||
<string name="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>
|
||||
@@ -48,6 +49,7 @@
|
||||
<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="all_formats">Minden formátum</string>
|
||||
<string name="size_width_by_height">Méret képpontban: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Nincs nagyítás</string>
|
||||
<string name="add_quiet_zone">Nyugodt övezet hozzáadása</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<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">Kód keresése</string>
|
||||
<string name="find_code_with_content">Mi a tartalom?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">Rendszerbeállítások követése</string>
|
||||
<string name="show_crop_handle">Levágási korlátozó megjelenítése</string>
|
||||
<string name="show_crop_handle_summary">Beolvasás korlátozása egy személyre szabható területre.</string>
|
||||
<string name="show_crosshairs">Célkereszt megjelenítése</string>
|
||||
<string name="show_crosshairs_summary">Célkereszt megjelenítése a kivágási területen vagy a teljes képernyőn.</string>
|
||||
<string name="barcode_formats">Vonalkód formátumok</string>
|
||||
<string name="zoom_by_swiping">Kamera nagyítása fel/le pöccintéssel</string>
|
||||
<string name="zoom_by_swiping_summary">Pöccintsen fel vagy le a kamera képernyőjén a kamera nagyításának vezérléséhez.</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<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">Ismétlődések elfogadása</string>
|
||||
<string name="ignore_codes">Az előzményekből kizárt kódok</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">Beolvasás keresése</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="pin_item">Rögzítés</string>
|
||||
<string name="unpin_item">Rögzítés feloldása</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>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Selamat datang!</string>
|
||||
<string name="mode_expert">Lanjutan</string>
|
||||
@@ -14,10 +15,10 @@
|
||||
<item quantity="other">%1$s, %2$d karakter</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Level koreksi kesalahan</string>
|
||||
<string name="error_correction_level_l" formatted="false">Rendah (~7% koreksi)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% koreksi)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kuartil (~25% koreksi)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Tinggi (~30% koreksi)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Rendah (~7% koreksi)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% koreksi)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Kuartil (~25% koreksi)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Tinggi (~30% koreksi)</string>
|
||||
<string name="label">Etiqueta</string>
|
||||
<string name="colors">Muka dan latar belakang</string>
|
||||
<string name="colors_black_on_white">Hitam di atas putih</string>
|
||||
@@ -47,6 +48,7 @@
|
||||
<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="all_formats">Semua format</string>
|
||||
<string name="size_width_by_height">Ukuran dalam piksel: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">無放大</string>
|
||||
<string name="add_quiet_zone">Dodaj cichą strefę</string>
|
||||
@@ -64,7 +66,7 @@
|
||||
<string name="restrict_format">Batasi format</string>
|
||||
<string name="remove_restriction">Hapus pembatasan</string>
|
||||
<string name="find_code">Trouver le code</string>
|
||||
<string name="find_code_with_content">Quel contenu?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -93,6 +95,8 @@
|
||||
<string name="follow_system_settings">Ikuti pengaturan sistem</string>
|
||||
<string name="show_crop_handle">Tampilkan pembatas pemotongan</string>
|
||||
<string name="show_crop_handle_summary">Batasi pemindaian ke batas area tertentu.</string>
|
||||
<string name="show_crosshairs">Tampilkan garis bidik</string>
|
||||
<string name="show_crosshairs_summary">Tampilkan garis bidik pada area potong atau seluruh layar.</string>
|
||||
<string name="barcode_formats">Format barcode</string>
|
||||
<string name="zoom_by_swiping">Geser ke atas/bawah untuk memperbesar</string>
|
||||
<string name="zoom_by_swiping_summary">Geser layar kamera ke atas atau ke bawah untuk mengontrol perbesaran gambar.</string>
|
||||
@@ -119,6 +123,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Abaikan duplikat</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="ignore_codes">Kode yang dikecualikan dari riwayat</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Buka segera</string>
|
||||
<string name="open_immediately_summary">Lewati inspeksi dan segera buka konten. Mungkin membuka konten berbahaya jika diaktifkan.</string>
|
||||
<string name="copy_immediately">Simpan ke dalam clipboard</string>
|
||||
@@ -136,7 +153,6 @@
|
||||
<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>
|
||||
@@ -220,6 +236,8 @@
|
||||
<string name="search_scan">Cari pindaian</string>
|
||||
<string name="add_to_history">Aggiungi alla cronologia</string>
|
||||
<string name="added_to_history">Dodano do historii</string>
|
||||
<string name="pin_item">Sematkan</string>
|
||||
<string name="unpin_item">Lepas sematan</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>
|
||||
@@ -262,5 +280,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Benvenuto!</string>
|
||||
<string name="mode_expert">Avanzato</string>
|
||||
@@ -12,13 +13,14 @@
|
||||
<string name="binary_data">(dati binari)</string>
|
||||
<plurals name="barcode_info">
|
||||
<item quantity="one">%2$d carattere, %1$s</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other">%2$d caratteri, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Livello correzione errori</string>
|
||||
<string name="error_correction_level_l" formatted="false">Basso (correzione ~7%)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medio (correzione ~15%)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (correzione ~25%)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (correzione ~30%)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Basso (correzione ~7%)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medio (correzione ~15%)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (correzione ~25%)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Alto (correzione ~30%)</string>
|
||||
<string name="label">Etichetta</string>
|
||||
<string name="colors">Colore primo piano/sfondo</string>
|
||||
<string name="colors_black_on_white">Nero su bianco</string>
|
||||
@@ -48,6 +50,7 @@
|
||||
<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="all_formats">Tutti i formati</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">Aggiungi zona tranquilla</string>
|
||||
@@ -65,7 +68,7 @@
|
||||
<string name="restrict_format">Limita formato</string>
|
||||
<string name="remove_restriction">Rimuovi limitazione</string>
|
||||
<string name="find_code">Trova codice</string>
|
||||
<string name="find_code_with_content">Quale contenuto?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -94,6 +97,8 @@
|
||||
<string name="follow_system_settings">Usa impostazioni di sistema</string>
|
||||
<string name="show_crop_handle">Visualizza riquadro limite</string>
|
||||
<string name="show_crop_handle_summary">Limita scansione ad una regione personalizzata.</string>
|
||||
<string name="show_crosshairs">Mostra mirino</string>
|
||||
<string name="show_crosshairs_summary">Mostra un mirino sulla finestra di ritaglio o su tutto lo schermo.</string>
|
||||
<string name="barcode_formats">Formati codici a barre</string>
|
||||
<string name="zoom_by_swiping">Zoom fotocamera scorrendo su/giù</string>
|
||||
<string name="zoom_by_swiping_summary">Scorri su o giù per controllare lo zoom della fotocamera.</string>
|
||||
@@ -120,6 +125,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Duplicati consecutivi</string>
|
||||
<string name="ignore_any_duplicates">Qualsiasi duplicato</string>
|
||||
<string name="accept_duplicates">Accetta duplicati</string>
|
||||
<string name="ignore_codes">Codici da escludere dalla cronologia</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Apri subito</string>
|
||||
<string name="open_immediately_summary">Salta l\'ispezione e apri i contenuti immediatamente. Se abilitato può aprire contenuti dannosi.</string>
|
||||
<string name="copy_immediately">Copia negli Appunti</string>
|
||||
@@ -189,7 +207,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 completato.</string>
|
||||
<string name="bluetooth_send_success">Invio via Bluetooth riuscito.</string>
|
||||
<string name="generation_category">Generazione</string>
|
||||
<string name="brighten_screen">Schiarisci schermo</string>
|
||||
<string name="brighten_screen_summary">Imposta luminosità al massimo per migliorare la scansione di un codice a barre dallo schermo.</string>
|
||||
@@ -228,6 +246,8 @@
|
||||
<string name="search_scan">Cerca scansione</string>
|
||||
<string name="add_to_history">Aggiungi alla cronologia</string>
|
||||
<string name="added_to_history">Aggiunto alla cronologia</string>
|
||||
<string name="pin_item">Fissa in alto</string>
|
||||
<string name="unpin_item">Rimuovi dall\'alto</string>
|
||||
<string name="export_to_file">Esporta in un file</string>
|
||||
<string name="export_as">Esportare come?</string>
|
||||
<string name="export_csv_comma">CSV con virgole</string>
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">ようこそ!</string>
|
||||
<string name="mode_expert">上級</string>
|
||||
@@ -14,10 +15,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>
|
||||
@@ -47,6 +48,7 @@
|
||||
<string name="cannot_resolve_action">開くためのアプリがありません!</string>
|
||||
<string name="pick_search_engine">検索エンジンを選択</string>
|
||||
<string name="format">フォーマット</string>
|
||||
<string name="all_formats">すべての形式</string>
|
||||
<string name="size_width_by_height">大きさ(ピクセル): %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">拡大なし</string>
|
||||
<string name="add_quiet_zone">外側に余白(クワイエットゾーン)を追加する</string>
|
||||
@@ -64,7 +66,7 @@
|
||||
<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_barcode_with_content">何の内容ですか?</string>
|
||||
<string name="find_code_hint">検索ワードまたは正規表現</string>
|
||||
<string name="does_not_match_search_term">検索ワードと一致しません</string>
|
||||
<string name="scan_for">%sをスキャン</string>
|
||||
@@ -93,6 +95,8 @@
|
||||
<string name="follow_system_settings">システム設定に従う</string>
|
||||
<string name="show_crop_handle">トリミングツールを表示</string>
|
||||
<string name="show_crop_handle_summary">スキャンする範囲を制限するトリミングツールを表示します。</string>
|
||||
<string name="show_crosshairs">十字線を表示</string>
|
||||
<string name="show_crosshairs_summary">トリミング領域または画面全体に十字線を表示します。</string>
|
||||
<string name="barcode_formats">バーコード形式</string>
|
||||
<string name="zoom_by_swiping">スワイプでズーム調節</string>
|
||||
<string name="zoom_by_swiping_summary">上下にスワイプすることで、カメラのズームを調節できるようにします。</string>
|
||||
@@ -119,6 +123,19 @@
|
||||
<string name="ignore_consecutive_duplicates">重複を破棄する</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">重複を許可</string>
|
||||
<string name="ignore_codes">履歴から除外するコード</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">すぐにコンテンツを開く</string>
|
||||
<string name="open_immediately_summary">確認画面なしでコンテンツをすぐに開くようにします。有害なコンテンツを開いてしまうリスクがあります。</string>
|
||||
<string name="copy_immediately">自動的にクリップボードにコピー</string>
|
||||
@@ -136,7 +153,6 @@
|
||||
<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>
|
||||
@@ -220,6 +236,8 @@
|
||||
<string name="search_scan">スキャン結果を検索</string>
|
||||
<string name="add_to_history">履歴に追加</string>
|
||||
<string name="added_to_history">履歴に追加されました</string>
|
||||
<string name="pin_item">固定する</string>
|
||||
<string name="unpin_item">固定を解除</string>
|
||||
<string name="export_to_file">ファイルにエクスポート</string>
|
||||
<string name="export_as">ファイル形式を選択</string>
|
||||
<string name="export_csv_comma">コンマ区切りのCSVファイル</string>
|
||||
@@ -262,5 +280,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">მოგესალმებით!</string>
|
||||
<string name="mode_expert">გაფართოებული</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$d სიმბოლო, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">შეცდომების კორექციის დონე</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="label">წარწერა</string>
|
||||
<string name="colors">წინა და ფონი</string>
|
||||
<string name="colors_black_on_white">შავი თეთრზე</string>
|
||||
@@ -48,12 +49,13 @@
|
||||
<string name="cannot_resolve_action">ამ მოქმედებისთვის აპლიკაცია ნაპოვნი არაა</string>
|
||||
<string name="pick_search_engine">აირჩიეთ საძიებო სისტემა</string>
|
||||
<string name="format">ფორმატი</string>
|
||||
<string name="all_formats">ყველა ფორმატი</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="encode">შექმნა</string>
|
||||
<string name="error_no_content">მონაცემები არაა</string>
|
||||
<string name="error_encoding_barcode">შტრიხ-კოდის შექმნა შეუძლებელია</string>
|
||||
<string name="view_barcode">შტრიხ-კოდის ნახვა</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<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_barcode_with_content">რა შინაა?</string>
|
||||
<string name="find_code_hint">ტერმინი ან რეგულარული გამოთქმა</string>
|
||||
<string name="does_not_match_search_term">არ შეესაბამება ძიების ტერმინს</string>
|
||||
<string name="scan_for">სკანირე %s</string>
|
||||
@@ -94,11 +96,13 @@
|
||||
<string name="follow_system_settings">სისტემის პარამეტრების მინიჭება</string>
|
||||
<string name="show_crop_handle">სკანირების არეალის ჩვენება</string>
|
||||
<string name="show_crop_handle_summary">სკანირების შეზღუდვა შერჩეული არეალით.</string>
|
||||
<string name="show_crosshairs">სამიზნის ჯვრის ჩვენება</string>
|
||||
<string name="show_crosshairs_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="auto_rotate_summary">კამერის ავტომატური შეტრიალება ვერტიკალური 1D შტრიხ-კოდების ამოსაცნობად. მოწყობილობიდან გამომდინარე, შესაძლოა იმოქმედოს წარმადობაზე.</string>
|
||||
<string name="try_harder">წაკითხვის ოპტიმიზირება სიზუსტეზე და არა სისწრაფეზე</string>
|
||||
<string name="try_harder_summary">ეს პარამეტრი ჩართეთ იმ შტრიხ-კოდებისთვის, რომელთა ამოცნობაც ძალიან ძნელია. მოქმედებს წარმადობაზე.</string>
|
||||
<string name="show_toast_in_bulk_mode">მონაცემების ჩვენება მუდმივ რეჟიმში</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">არ შევინახოთ შემდგომი ასლები</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">დუპლიკატების მიღება</string>
|
||||
<string name="ignore_codes">ისტორიიდან გამოსარიცხი კოდები</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">შემოწმების გამოტოვება და მყისიერი გახსნა</string>
|
||||
<string name="open_immediately_summary">შემოწმების გამოტოვება და მყისიერი გახსნა. შესაძლოა გამოიწვიოს არასასარგებლო კონტენტის ჩვენება.</string>
|
||||
<string name="copy_immediately">გაცვლის ბუფერში ავტომატური კოპირება</string>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">სკანირების ძიება</string>
|
||||
<string name="add_to_history">დაამატე ისტორიაში</string>
|
||||
<string name="added_to_history">დაემატა ისტორიაში</string>
|
||||
<string name="pin_item">მიმაგრება</string>
|
||||
<string name="unpin_item">მიმაგრების მოხსნა</string>
|
||||
<string name="export_to_file">ექსპორტი ფაილში</string>
|
||||
<string name="export_as">შესანახი ფაილის ფორმატი</string>
|
||||
<string name="export_csv_comma">CSV (გამყოფი - მძიმე)</string>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">환영합니다!</string>
|
||||
<string name="mode_expert">고급</string>
|
||||
@@ -14,10 +15,10 @@
|
||||
<item quantity="other">%2$d characters, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Error correction level</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Low (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Medium (~15% correction)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Quartile (~25% correction)</string>
|
||||
<string name="error_correction_level_h" formatted="false">High (~30% correction)</string>
|
||||
<string name="label">라벨</string>
|
||||
<string name="colors">전경과 배경</string>
|
||||
<string name="colors_black_on_white">흰색에 검정색</string>
|
||||
@@ -47,6 +48,7 @@
|
||||
<string name="cannot_resolve_action">어떤 앱도 열 수 없습니다</string>
|
||||
<string name="pick_search_engine">검색 엔진을 선택하세요</string>
|
||||
<string name="format">형식</string>
|
||||
<string name="all_formats">모든 형식</string>
|
||||
<string name="size_width_by_height">크기(픽셀): %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">확대하지 않음</string>
|
||||
<string name="add_quiet_zone">조용한 지역 추가</string>
|
||||
@@ -64,7 +66,7 @@
|
||||
<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_barcode_with_content">무슨 내용?</string>
|
||||
<string name="find_code_hint">용어 또는 정규 표현식</string>
|
||||
<string name="does_not_match_search_term">검색어와 일치하지 않음</string>
|
||||
<string name="scan_for">스캔 %s</string>
|
||||
@@ -93,6 +95,8 @@
|
||||
<string name="follow_system_settings">시스템 설정 따르기</string>
|
||||
<string name="show_crop_handle">크롭 제한기 표시</string>
|
||||
<string name="show_crop_handle_summary">사용자 지정 가능한 영역으로 스캔을 제한합니다.</string>
|
||||
<string name="show_crosshairs">십자선 표시</string>
|
||||
<string name="show_crosshairs_summary">자르기 영역 또는 전체 화면에 십자선을 표시합니다.</string>
|
||||
<string name="barcode_formats">바코드 형식</string>
|
||||
<string name="zoom_by_swiping">위아래로 스와이프하여 확대/축소</string>
|
||||
<string name="zoom_by_swiping_summary">카메라 화면에서 위 또는 아래로 스와이프하여 카메라 줌을 제어합니다.</string>
|
||||
@@ -119,6 +123,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Ignore duplicates</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">중복 허용</string>
|
||||
<string name="ignore_codes">기록에서 제외할 코드</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">즉시 열기</string>
|
||||
<string name="open_immediately_summary">검사를 건너뛰고 즉시 내용물을 엽니다. 활성화된 경우 유해한 내용물을 열 수 있습니다.</string>
|
||||
<string name="copy_immediately">클립보드에 복사하기</string>
|
||||
@@ -136,7 +153,6 @@
|
||||
<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>
|
||||
@@ -220,6 +236,8 @@
|
||||
<string name="search_scan">검색 스캔</string>
|
||||
<string name="add_to_history">히스토리에 추가</string>
|
||||
<string name="added_to_history">역사에 추가되었습니다</string>
|
||||
<string name="pin_item">상단에 고정</string>
|
||||
<string name="unpin_item">고정 해제</string>
|
||||
<string name="export_to_file">파일로 내보내기</string>
|
||||
<string name="export_as">내보내기?</string>
|
||||
<string name="export_csv_comma">쉼표가 있는 CSV 파일</string>
|
||||
@@ -262,5 +280,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Welkom!</string>
|
||||
<string name="mode_expert">Geavanceerd</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$d tekens, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Foutcorrectie niveau</string>
|
||||
<string name="error_correction_level_l" formatted="false">Laag (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Middelhoog (~15% correction)</string>
|
||||
<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="error_correction_level_l" formatted="false">Laag (~7% correction)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Middelhoog (~15% correction)</string>
|
||||
<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">Voor- en achtergrond</string>
|
||||
<string name="colors_black_on_white">Zwart op wit</string>
|
||||
@@ -48,6 +49,7 @@
|
||||
<string name="cannot_resolve_action">Geen enkele toepassing kan dat openen</string>
|
||||
<string name="pick_search_engine">Zoekmachine kiezen</string>
|
||||
<string name="format">Formaat</string>
|
||||
<string name="all_formats">Alle formaten</string>
|
||||
<string name="size_width_by_height">Afmeting in pixels: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Geen vergroting</string>
|
||||
<string name="add_quiet_zone">Voeg stille zone toe</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<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_barcode_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>
|
||||
@@ -94,6 +96,8 @@
|
||||
<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="show_crosshairs">Dradenkruis tonen</string>
|
||||
<string name="show_crosshairs_summary">Toon een dradenkruis over het uitsnedevenster of het hele scherm.</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>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Duplicaten negeren</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Accepteer duplicaten</string>
|
||||
<string name="ignore_codes">Codes uitsluiten van geschiedenis</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">Scan op internet zoeken</string>
|
||||
<string name="add_to_history">Toevoegen aan geschiedenis</string>
|
||||
<string name="added_to_history">Toegevoegd aan geschiedenis</string>
|
||||
<string name="pin_item">Vastzetten</string>
|
||||
<string name="unpin_item">Losmaken</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>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Witamy!</string>
|
||||
<string name="mode_expert">Zaawansowany</string>
|
||||
@@ -22,8 +23,11 @@
|
||||
<string name="compose_barcode">Utwórz kod kreskowy</string>
|
||||
<string name="history">Historia</string>
|
||||
<string name="format">Format</string>
|
||||
<string name="all_formats">Wszystkie formaty</string>
|
||||
<string name="add_to_history">Dodaj do historii</string>
|
||||
<string name="added_to_history">Dodano do historii</string>
|
||||
<string name="pin_item">Przypnij</string>
|
||||
<string name="unpin_item">Odepnij</string>
|
||||
<string name="export_to_file">Eksportuj do pliku</string>
|
||||
<string name="file_name">Nazwa pliku</string>
|
||||
<string name="export_json">Eksportuj jako JSON</string>
|
||||
@@ -97,7 +101,7 @@
|
||||
<string name="restrict_format">Ogranicz format</string>
|
||||
<string name="remove_restriction">Usuń ograniczenie</string>
|
||||
<string name="find_code">Znajdź kod</string>
|
||||
<string name="find_code_with_content">Jaki treść?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -136,6 +140,8 @@
|
||||
<string name="copy_immediately_summary">Automatycznie skopiuj zeskanowaną zawartość do schowka. Pamiętaj, że inne aplikacje mogą szpiegować Twój schowek w tle.</string>
|
||||
<string name="show_crop_handle">Pokazuj ogranicznik przycinania</string>
|
||||
<string name="show_crop_handle_summary">Ogranicz skanowanie do konfigurowalnego regionu.</string>
|
||||
<string name="show_crosshairs">Pokazuj krzyż celowniczy</string>
|
||||
<string name="show_crosshairs_summary">Pokazuj krzyż celowniczy w obszarze przycinania lub na całym ekranie.</string>
|
||||
<string name="barcode_formats">Formaty kodów</string>
|
||||
<string name="search_web">Szukaj w sieci</string>
|
||||
<string name="search_scan">Szukaj skanu</string>
|
||||
@@ -144,10 +150,24 @@
|
||||
<string name="ignore_consecutive_duplicates">Nie zapisuj kolejnych duplikatów</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Akceptuj duplikaty</string>
|
||||
<string name="ignore_codes">Kody wykluczane z historii</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="few">%d wykluczane kody</item>
|
||||
<item quantity="many">%d wykluczanych kodów</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="default_search_engine">Otwórz nieznane dane w</string>
|
||||
<string name="always_ask">Zawsze pytaj</string>
|
||||
<string name="open_with_url">Otwieraj nieznane dane za pomocą adresu URL</string>
|
||||
|
||||
<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>
|
||||
@@ -268,5 +288,4 @@
|
||||
<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>
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
<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="all_formats">Todos os formatos</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">Adicionar zona tranquila</string>
|
||||
@@ -66,7 +67,7 @@
|
||||
<string name="restrict_format">Restringir formato</string>
|
||||
<string name="remove_restriction">Remover restrição</string>
|
||||
<string name="find_code">Encontrar código</string>
|
||||
<string name="find_code_with_content">Qual conteúdo?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -95,6 +96,8 @@
|
||||
<string name="follow_system_settings">Seguir configurações do sistema</string>
|
||||
<string name="show_crop_handle">Mostrar limitador customizável</string>
|
||||
<string name="show_crop_handle_summary">Permite limitar a digitalização à uma área específica.</string>
|
||||
<string name="show_crosshairs">Mostrar mira</string>
|
||||
<string name="show_crosshairs_summary">Mostrar uma mira sobre a área de recorte ou na tela inteira.</string>
|
||||
<string name="barcode_formats">Formatos de código de barras</string>
|
||||
<string name="zoom_by_swiping">Deslize para ajustar o zoom</string>
|
||||
<string name="zoom_by_swiping_summary">Deslize para baixo/cima na tela para ajustar zoom da câmera.</string>
|
||||
@@ -121,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Duplicatas consecutivas</string>
|
||||
<string name="ignore_any_duplicates">Quaisquer duplicatas</string>
|
||||
<string name="accept_duplicates">Aceitar duplicatas</string>
|
||||
<string name="ignore_codes">Códigos para excluir do histórico</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Abrir imediatamente</string>
|
||||
<string name="open_immediately_summary">Pular a inspeção e abrir um conteúdo instantaneamente. Pode abrir conteúdo malicioso se ativado.</string>
|
||||
<string name="copy_immediately">Botar na área de transferência</string>
|
||||
@@ -138,7 +154,6 @@
|
||||
<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>
|
||||
@@ -223,6 +238,8 @@
|
||||
<string name="search_scan">Buscar digitalização</string>
|
||||
<string name="add_to_history">Adicionar ao histórico</string>
|
||||
<string name="added_to_history">Adicionado ao histórico</string>
|
||||
<string name="pin_item">Fixar</string>
|
||||
<string name="unpin_item">Desafixar</string>
|
||||
<string name="export_to_file">Exportar para arquivo</string>
|
||||
<string name="export_as">Exportar como?</string>
|
||||
<string name="export_csv_comma">Arquivo CSV com vírgulas</string>
|
||||
@@ -265,5 +282,4 @@
|
||||
<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>
|
||||
|
||||
@@ -43,14 +43,15 @@
|
||||
<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="copy_to_clipboard">Скопировать в буфер обмена</string>
|
||||
<string name="copy_as_deeplink">Копировать как диплинк ссылку</string>
|
||||
<string name="copied_to_clipboard">Скопировано в буфер обмена</string>
|
||||
<string name="copy_password">Копировать пароль в буфер обмена</string>
|
||||
<string name="copy_password">Скопировать пароль в буфер обмена</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="all_formats">Все форматы</string>
|
||||
<string name="size_width_by_height">Размер в пикселях: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Без увеличения</string>
|
||||
<string name="add_quiet_zone">Добавить отступы</string>
|
||||
@@ -68,7 +69,7 @@
|
||||
<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_barcode_with_content">Что искать?</string>
|
||||
<string name="find_code_hint">Термин или регулярное выражение</string>
|
||||
<string name="does_not_match_search_term">Не соответствует поисковому запросу</string>
|
||||
<string name="scan_for">Сканировать %s</string>
|
||||
@@ -86,8 +87,8 @@
|
||||
<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_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>
|
||||
@@ -97,6 +98,8 @@
|
||||
<string name="follow_system_settings">Как в системе</string>
|
||||
<string name="show_crop_handle">Показывать область сканирования</string>
|
||||
<string name="show_crop_handle_summary">Ограничить сканирование изменяемой областью.</string>
|
||||
<string name="show_crosshairs">Показывать перекрестие</string>
|
||||
<string name="show_crosshairs_summary">Показывать перекрестие в области сканирования или на весь экран.</string>
|
||||
<string name="barcode_formats">Форматы штрих-кодов</string>
|
||||
<string name="zoom_by_swiping">Масштабировать жестом вверх/вниз</string>
|
||||
<string name="zoom_by_swiping_summary">Жест пальцем вверх или вниз для управления масштабированием камеры.</string>
|
||||
@@ -123,6 +126,21 @@
|
||||
<string name="ignore_consecutive_duplicates">Не сохранять последовательные дубликаты</string>
|
||||
<string name="ignore_any_duplicates">Не сохранять никакие дубликаты</string>
|
||||
<string name="accept_duplicates">Сохранять дубликаты</string>
|
||||
<string name="ignore_codes">Коды, исключаемые из истории</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="few">%d кода, исключаемые из истории</item>
|
||||
<item quantity="many">%d кодов, исключаемых из истории</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Сразу открывать содержимое</string>
|
||||
<string name="open_immediately_summary">Пропускать проверку и сразу открыть содержимое. Может привести к открытию небезопасного содержимого.</string>
|
||||
<string name="copy_immediately">Автокопирование в буфер обмена</string>
|
||||
@@ -135,12 +153,11 @@
|
||||
<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">Возврат после копирования или отправки</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>
|
||||
@@ -202,10 +219,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">Сохранить в папке скачиваний Downloads?</string>
|
||||
<string name="file_name">Имя файла</string>
|
||||
<string name="error_saving_file">Невозможно сохранить файл</string>
|
||||
<string name="error_file_exists">Файл уже существует</string>
|
||||
@@ -227,13 +244,15 @@
|
||||
<string name="search_scan">Поиск сканирования</string>
|
||||
<string name="add_to_history">Добавить в историю</string>
|
||||
<string name="added_to_history">Добавлено в историю</string>
|
||||
<string name="pin_item">Закрепить</string>
|
||||
<string name="unpin_item">Открепить</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">Сохранено в папке 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>
|
||||
@@ -260,7 +279,7 @@
|
||||
<string name="email_subject">Тема</string>
|
||||
<string name="email_body">Текст</string>
|
||||
<string name="scheme">Схема</string>
|
||||
<string name="host">Узел</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>
|
||||
@@ -269,5 +288,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Hoş geldiniz!</string>
|
||||
<string name="mode_expert">Gelişmiş</string>
|
||||
@@ -15,10 +16,10 @@
|
||||
<item quantity="other">%2$d karakter, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Hata düzeltme düzeyi</string>
|
||||
<string name="error_correction_level_l" formatted="false">Düşük (~%7 düzeltim)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Orta (~%15 düzeltim)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Dörtte Bir (~%25 düzeltim)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Yüksek (~%30 düzeltim)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Düşük (~%7 düzeltim)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Orta (~%15 düzeltim)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Dörtte Bir (~%25 düzeltim)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Yüksek (~%30 düzeltim)</string>
|
||||
<string name="label">Etiket</string>
|
||||
<string name="colors">Ön ve arka plan</string>
|
||||
<string name="colors_black_on_white">Beyaz üzerine siyah</string>
|
||||
@@ -48,6 +49,7 @@
|
||||
<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="all_formats">Tüm biçimler</string>
|
||||
<string name="size_width_by_height">Piksel türünde boyut: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Büyütme Yok</string>
|
||||
<string name="add_quiet_zone">Sessiz bölge ekle</string>
|
||||
@@ -65,7 +67,7 @@
|
||||
<string name="restrict_format">Biçimi kısıtla</string>
|
||||
<string name="remove_restriction">Kısıtlamayı kaldır</string>
|
||||
<string name="find_code">Kod bul</string>
|
||||
<string name="find_code_with_content">Ne içerik?</string>
|
||||
<string name="find_barcode_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>
|
||||
@@ -94,6 +96,8 @@
|
||||
<string name="follow_system_settings">Sistem ayarlarını izle</string>
|
||||
<string name="show_crop_handle">Kırpım kısıtlayıcıyı göster</string>
|
||||
<string name="show_crop_handle_summary">Taramayı özelleştirilebilir bölgeyle sınırla.</string>
|
||||
<string name="show_crosshairs">Nişangahı göster</string>
|
||||
<string name="show_crosshairs_summary">Nişangahı kırpma penceresi veya tam ekran üzerinde göster.</string>
|
||||
<string name="barcode_formats">Barkod biçimleri</string>
|
||||
<string name="zoom_by_swiping">Aşağı/yukarı kaydırarak yakınlaştır</string>
|
||||
<string name="zoom_by_swiping_summary">Kamera yakınlığını denetlemek için kamera ekranında aşağı veya yukarı kaydır.</string>
|
||||
@@ -120,6 +124,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Yinelemeleri göz ardı et</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">Yinelenenleri kabul et</string>
|
||||
<string name="ignore_codes">Geçmişten hariç tutulacak kodlar</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -137,7 +154,6 @@
|
||||
<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>
|
||||
@@ -222,6 +238,8 @@
|
||||
<string name="search_scan">Taramayı ara</string>
|
||||
<string name="add_to_history">Geçmişe ekle</string>
|
||||
<string name="added_to_history">Geçmişe eklendi</string>
|
||||
<string name="pin_item">Sabitle</string>
|
||||
<string name="unpin_item">Sabitlemeyi kaldır</string>
|
||||
<string name="export_to_file">Dosyaya dışa aktar</string>
|
||||
<string name="export_as">Ne olarak dışa aktarılsın?</string>
|
||||
<string name="export_csv_comma">Virgüller ile CSV</string>
|
||||
@@ -264,5 +282,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Ласкаво просимо!</string>
|
||||
<string name="mode_expert">Розширений</string>
|
||||
@@ -14,12 +15,13 @@
|
||||
<item quantity="one">%2$d символ, %1$s</item>
|
||||
<item quantity="few">%2$d символи, %1$s</item>
|
||||
<item quantity="many">%2$d символів, %1$s</item>
|
||||
<item quantity="other">%2$d символів, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Рівень виправлення помилок</string>
|
||||
<string name="error_correction_level_l" formatted="false">Низький (~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>
|
||||
@@ -49,6 +51,7 @@
|
||||
<string name="cannot_resolve_action">Жодey додаток не може цього відкрити</string>
|
||||
<string name="pick_search_engine">Вибрати пошукову систему</string>
|
||||
<string name="format">Формат</string>
|
||||
<string name="all_formats">Усі формати</string>
|
||||
<string name="size_width_by_height">Розмір у пікселях: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">Без збільшення</string>
|
||||
<string name="add_quiet_zone">Додати тиху зону</string>
|
||||
@@ -66,7 +69,7 @@
|
||||
<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_barcode_with_content">Що саме вміст?</string>
|
||||
<string name="find_code_hint">Термін або регулярний вираз</string>
|
||||
<string name="does_not_match_search_term">Не відповідає пошуковому терміну</string>
|
||||
<string name="scan_for">Сканувати %s</string>
|
||||
@@ -95,6 +98,8 @@
|
||||
<string name="follow_system_settings">Дотримуватись системних налаштувань</string>
|
||||
<string name="show_crop_handle">Обмежити область сканування</string>
|
||||
<string name="show_crop_handle_summary">Обмежити сканування до налаштованої області.</string>
|
||||
<string name="show_crosshairs">Показувати перехрестя</string>
|
||||
<string name="show_crosshairs_summary">Показувати перехрестя в межах області сканування або на весь екран.</string>
|
||||
<string name="barcode_formats">Формати штрих-коду</string>
|
||||
<string name="zoom_by_swiping">Проведіть пальцем вгору/вниз, для масштабування</string>
|
||||
<string name="zoom_by_swiping_summary">Проведіть пальцем вгору або вниз по екрану камери, щоб керувати масштабуванням камери.</string>
|
||||
@@ -121,6 +126,21 @@
|
||||
<string name="ignore_consecutive_duplicates">Послідовні дублікати</string>
|
||||
<string name="ignore_any_duplicates">Будь-які дублікати</string>
|
||||
<string name="accept_duplicates">Приймати дублікати</string>
|
||||
<string name="ignore_codes">Коди, виключені з історії</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="few">%d виключені з історії коди</item>
|
||||
<item quantity="many">%d виключених з історії кодів</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">Відкривати негайно</string>
|
||||
<string name="open_immediately_summary">Пропустити перегляд та негайно відкрити вміст. Якщо увімкнено, може відкрити шкідливий вміст.</string>
|
||||
<string name="copy_immediately">Помістити в буфер обміну</string>
|
||||
@@ -138,7 +158,6 @@
|
||||
<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>
|
||||
@@ -225,6 +244,8 @@
|
||||
<string name="search_scan">Шукати сканування</string>
|
||||
<string name="add_to_history">Додати до історії</string>
|
||||
<string name="added_to_history">Додано до історії</string>
|
||||
<string name="pin_item">Закріпити</string>
|
||||
<string name="unpin_item">Відкріпити</string>
|
||||
<string name="export_to_file">Експортувати в файл</string>
|
||||
<string name="export_as">Експортувати як?</string>
|
||||
<string name="export_csv_comma">CSV із комами</string>
|
||||
@@ -267,5 +288,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">Chào mừng!</string>
|
||||
<string name="mode_expert">Nâng cao</string>
|
||||
@@ -14,10 +15,10 @@
|
||||
<item quantity="other">%2$d ký tự, %1$s</item>
|
||||
</plurals>
|
||||
<string name="error_correction_level">Mức độ tự sửa mã</string>
|
||||
<string name="error_correction_level_l" formatted="false">Thấp (sửa ~7%)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Trung bình (sửa ~15%)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Một phần tư (sửa ~25%)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Cao (sửa ~30%)</string>
|
||||
<string name="error_correction_level_l" formatted="false">Thấp (sửa ~7%)</string>
|
||||
<string name="error_correction_level_m" formatted="false">Trung bình (sửa ~15%)</string>
|
||||
<string name="error_correction_level_q" formatted="false">Một phần tư (sửa ~25%)</string>
|
||||
<string name="error_correction_level_h" formatted="false">Cao (sửa ~30%)</string>
|
||||
<string name="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>
|
||||
@@ -47,6 +48,7 @@
|
||||
<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="all_formats">Tất cả đị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">Không phóng to</string>
|
||||
<string name="add_quiet_zone">Thêm vùng yên tĩnh</string>
|
||||
@@ -64,7 +66,7 @@
|
||||
<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_barcode_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>
|
||||
@@ -93,6 +95,8 @@
|
||||
<string name="follow_system_settings">Theo cài đặt của máy</string>
|
||||
<string name="show_crop_handle">Hiện giới hạn cắt hình</string>
|
||||
<string name="show_crop_handle_summary">Giới hạn vùng quét.</string>
|
||||
<string name="show_crosshairs">Hiện tâm ngắm</string>
|
||||
<string name="show_crosshairs_summary">Hiển thị tâm ngắm trên vùng cắt hoặc toàn màn hình.</string>
|
||||
<string name="barcode_formats">Các định dạng mã vạch</string>
|
||||
<string name="zoom_by_swiping">Vuốt lên/xuống để phóng to/thu nhỏ</string>
|
||||
<string name="zoom_by_swiping_summary">Vuốt lên/xuống ở màn hình camera để điều chỉnh độ phóng.</string>
|
||||
@@ -119,6 +123,19 @@
|
||||
<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">Chấp nhận bản sao</string>
|
||||
<string name="ignore_codes">Mã loại trừ khỏi lịch sử</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -136,7 +153,6 @@
|
||||
<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>
|
||||
@@ -220,6 +236,8 @@
|
||||
<string name="search_scan">Tìm kiếm lần quét</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="pin_item">Ghim</string>
|
||||
<string name="unpin_item">Bỏ ghim</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>
|
||||
@@ -262,5 +280,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">欢迎!</string>
|
||||
<string name="mode_expert">高级</string>
|
||||
@@ -47,6 +48,7 @@
|
||||
<string name="cannot_resolve_action">没有应用可以打开它</string>
|
||||
<string name="pick_search_engine">选择一个搜索引擎</string>
|
||||
<string name="format">编码格式</string>
|
||||
<string name="all_formats">所有格式</string>
|
||||
<string name="size_width_by_height">图片尺寸: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">无放大</string>
|
||||
<string name="add_quiet_zone">添加安静区</string>
|
||||
@@ -64,7 +66,7 @@
|
||||
<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_barcode_with_content">什么内容?</string>
|
||||
<string name="find_code_hint">术语或正则表达式</string>
|
||||
<string name="does_not_match_search_term">与搜索词不匹配</string>
|
||||
<string name="scan_for">扫描 %s</string>
|
||||
@@ -93,6 +95,8 @@
|
||||
<string name="follow_system_settings">跟随系统设置</string>
|
||||
<string name="show_crop_handle">限制扫描范围</string>
|
||||
<string name="show_crop_handle_summary">把扫描区域限制在选定范围内。</string>
|
||||
<string name="show_crosshairs">显示十字线</string>
|
||||
<string name="show_crosshairs_summary">在裁切区域或整个屏幕上显示十字线。</string>
|
||||
<string name="barcode_formats">条码格式</string>
|
||||
<string name="zoom_by_swiping">上下滑动缩放</string>
|
||||
<string name="zoom_by_swiping_summary">在扫描界面上下滑动以控制相机缩放。</string>
|
||||
@@ -119,6 +123,19 @@
|
||||
<string name="ignore_consecutive_duplicates">不保存重复历史</string>
|
||||
<string name="ignore_any_duplicates">Ignore any duplicates</string>
|
||||
<string name="accept_duplicates">接受重复项</string>
|
||||
<string name="ignore_codes">从历史记录中排除的代码</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">不检查内容立即打开链接</string>
|
||||
<string name="open_immediately_summary">跳过检查并立即打开内容。如果启用,可能会打开有害内容。</string>
|
||||
<string name="copy_immediately">自动复制扫描结果到剪贴板</string>
|
||||
@@ -136,7 +153,6 @@
|
||||
<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>
|
||||
@@ -220,6 +236,8 @@
|
||||
<string name="search_scan">搜索扫描记录</string>
|
||||
<string name="add_to_history">添加到历史记录</string>
|
||||
<string name="added_to_history">已添加到历史记录</string>
|
||||
<string name="pin_item">置顶</string>
|
||||
<string name="unpin_item">取消置顶</string>
|
||||
<string name="export_to_file">导出为文件</string>
|
||||
<string name="export_as">另存为?</string>
|
||||
<string name="export_csv_comma">逗号分隔的 CSV</string>
|
||||
@@ -262,5 +280,4 @@
|
||||
<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,3 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="welcome">歡迎!</string>
|
||||
<string name="mode_expert">進階</string>
|
||||
@@ -14,10 +15,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>
|
||||
@@ -47,6 +48,7 @@
|
||||
<string name="cannot_resolve_action">沒有可開啟這個項目的應用程式</string>
|
||||
<string name="pick_search_engine">選擇一個搜尋引擎</string>
|
||||
<string name="format">格式</string>
|
||||
<string name="all_formats">所有格式</string>
|
||||
<string name="size_width_by_height">圖片尺寸: %1$d×%2$d</string>
|
||||
<string name="size_no_magnification">不擴大</string>
|
||||
<string name="add_quiet_zone">加上空白邊界</string>
|
||||
@@ -64,7 +66,7 @@
|
||||
<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_barcode_with_content">什麼內容?</string>
|
||||
<string name="find_code_hint">術語或正規表達式</string>
|
||||
<string name="does_not_match_search_term">與搜尋詞不符</string>
|
||||
<string name="scan_for">掃描 %s</string>
|
||||
@@ -93,6 +95,8 @@
|
||||
<string name="follow_system_settings">跟隨系統設定</string>
|
||||
<string name="show_crop_handle">顯示裁切範圍選擇器</string>
|
||||
<string name="show_crop_handle_summary">將掃描區域限制在指定範圍內</string>
|
||||
<string name="show_crosshairs">顯示十字線</string>
|
||||
<string name="show_crosshairs_summary">在裁切範圍或整個畫面上顯示十字線。</string>
|
||||
<string name="barcode_formats">條碼格式</string>
|
||||
<string name="zoom_by_swiping">上下滑動縮放</string>
|
||||
<string name="zoom_by_swiping_summary">透過上下滑動在掃描介面控制相機縮放</string>
|
||||
@@ -119,6 +123,19 @@
|
||||
<string name="ignore_consecutive_duplicates">不儲存重複歷史記錄</string>
|
||||
<string name="ignore_any_duplicates">略過任何重複項目</string>
|
||||
<string name="accept_duplicates">接受重複</string>
|
||||
<string name="ignore_codes">從歷史記錄排除的代碼</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
|
||||
<string name="open_immediately">立即開啟</string>
|
||||
<string name="open_immediately_summary">跳過檢查並立即開啟。可能會開啟有害內容</string>
|
||||
<string name="copy_immediately">自動複製掃描結果到剪貼簿</string>
|
||||
@@ -136,7 +153,6 @@
|
||||
<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>
|
||||
@@ -220,6 +236,8 @@
|
||||
<string name="search_scan">搜尋掃描記錄</string>
|
||||
<string name="add_to_history">儲存記錄</string>
|
||||
<string name="added_to_history">已新增至記錄</string>
|
||||
<string name="pin_item">置頂</string>
|
||||
<string name="unpin_item">取消置頂</string>
|
||||
<string name="export_to_file">匯出檔案</string>
|
||||
<string name="export_as">另存為?</string>
|
||||
<string name="export_csv_comma">逗號分隔的 CSV 檔案</string>
|
||||
@@ -262,5 +280,4 @@
|
||||
<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,13 +1,14 @@
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">Binary Eye</string>
|
||||
<string name="url_hint" translatable="false">http://example.com/</string>
|
||||
<string name="url_hint_add_content" translatable="false">http://example.com/?content=</string>
|
||||
<string name="project_url" translatable="false">https://github.com/markusfisch/BinaryEye</string>
|
||||
<string name="no_bluetooth_hosts_paired_value" translatable="false" />
|
||||
<string name="crc4" translatable="false">CRC4</string>
|
||||
<string name="md5" translatable="false">MD5</string>
|
||||
<string name="sha1" translatable="false">SHA1</string>
|
||||
<string name="sha256" translatable="false">SHA256</string>
|
||||
<string name="app_name">Binary Eye</string>
|
||||
<string name="url_hint">http://example.com/</string>
|
||||
<string name="url_hint_add_content">http://example.com/?content=</string>
|
||||
<string name="project_url">https://github.com/markusfisch/BinaryEye</string>
|
||||
<string name="no_bluetooth_hosts_paired_value" />
|
||||
<string name="crc4">CRC4</string>
|
||||
<string name="md5">MD5</string>
|
||||
<string name="sha1">SHA1</string>
|
||||
<string name="sha256">SHA256</string>
|
||||
<string name="scan_meta_data">%1$s • %2$s</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>
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
<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="all_formats">All formats</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>
|
||||
@@ -65,7 +66,7 @@
|
||||
<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_barcode_with_content">What content?</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>
|
||||
@@ -94,6 +95,8 @@
|
||||
<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="show_crosshairs">Show crosshairs</string>
|
||||
<string name="show_crosshairs_summary">Show crosshairs over the crop window or full screen.</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>
|
||||
@@ -120,6 +123,19 @@
|
||||
<string name="ignore_consecutive_duplicates">Consecutive duplicates</string>
|
||||
<string name="ignore_any_duplicates">Any duplicates</string>
|
||||
<string name="accept_duplicates">Accept duplicates</string>
|
||||
<string name="ignore_codes">Codes to exclude from history</string>
|
||||
<string name="ignore_codes_none">No ignored codes</string>
|
||||
<string name="ignore_codes_empty">No ignored codes yet</string>
|
||||
<plurals name="ignore_codes_count">
|
||||
<item quantity="one">%d ignored code</item>
|
||||
<item quantity="other">%d ignored codes</item>
|
||||
</plurals>
|
||||
<string name="ignore_code_add">Add code</string>
|
||||
<string name="ignore_code_edit">Edit code</string>
|
||||
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
|
||||
<string name="ignore_code_regex_required">Regex required</string>
|
||||
<string name="ignore_code_regex_invalid">Invalid regex</string>
|
||||
<string name="ignore_code_remove_confirm">Remove this ignored code?</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>
|
||||
@@ -228,6 +244,8 @@
|
||||
<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="pin_item">Pin item</string>
|
||||
<string name="unpin_item">Unpin item</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>
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
android:key="show_crop_handle"
|
||||
android:title="@string/show_crop_handle"
|
||||
android:summary="@string/show_crop_handle_summary"/>
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="show_crosshairs"
|
||||
android:title="@string/show_crosshairs"
|
||||
android:summary="@string/show_crosshairs_summary"/>
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
android:key="zoom_by_swiping"
|
||||
@@ -77,6 +82,10 @@
|
||||
android:entries="@array/ignore_duplicates_names"
|
||||
android:entryValues="@array/ignore_duplicates_values"
|
||||
android:defaultValue="ignore_consecutive_duplicates"/>
|
||||
<Preference
|
||||
android:key="ignore_codes"
|
||||
android:title="@string/ignore_codes"
|
||||
android:summary="@string/ignore_codes_none"/>
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="copy_immediately"
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
android:key="show_crop_handle"
|
||||
android:title="@string/show_crop_handle"
|
||||
android:summary="@string/show_crop_handle_summary"/>
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="show_crosshairs"
|
||||
android:title="@string/show_crosshairs"
|
||||
android:summary="@string/show_crosshairs_summary"/>
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="true"
|
||||
android:key="zoom_by_swiping"
|
||||
@@ -77,6 +82,10 @@
|
||||
android:entries="@array/ignore_duplicates_names"
|
||||
android:entryValues="@array/ignore_duplicates_values"
|
||||
android:defaultValue="ignore_consecutive_duplicates"/>
|
||||
<Preference
|
||||
android:key="ignore_codes"
|
||||
android:title="@string/ignore_codes"
|
||||
android:summary="@string/ignore_codes_none"/>
|
||||
<androidx.preference.SwitchPreferenceCompat
|
||||
android:defaultValue="false"
|
||||
android:key="copy_immediately"
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
buildscript {
|
||||
ext {
|
||||
kotlin_version = '2.2.21'
|
||||
tools_version = '9.0.1'
|
||||
kotlin_version = '2.3.20'
|
||||
tools_version = '9.1.0'
|
||||
sdk_version = 36
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
* Add icons to preferences screen
|
||||
* Update history listing on resume
|
||||
* Fix quiet zone for recreated barcodes
|
||||
* Fix automatic screen brightening
|
||||
* Migrate to CameraX
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
* Add an option to show crosshairs
|
||||
* Add preference for codes that should not be saved
|
||||
* Add option to restrict searching to a specific format
|
||||
* Pin history items
|
||||
* Improve preference icons
|
||||
* Optimize vector drawables
|
||||
* Fix beeping when phone is set to Vibrate mode
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
* Update translations
|
||||
|
||||
@@ -1 +1 @@
|
||||
Android için diğer bir barkod tarayıcı. Ücretsiz, reklamsız ve açık kaynak.
|
||||
Reklamsız QR kod okuyucusu ve barkod tarayıcısı
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
横竖翻转都能扫的多功能 MD 风格条码扫描器,同时也是条码生成器。
|
||||
支持竖屏和横屏模式,可识别倒置的条形码,
|
||||
符合Material Design设计语言,同时支持生成条形码。
|
||||
|
||||
使用 ZXing-C++ ("Zebra Crossing") 条形码扫描库。
|
||||
支持的条形码格式:AZTEC,CODABAR,CODE 39,CODE 93,CODE 128,
|
||||
DATA MATRIX,EAN 8,EAN 13,ITF,PDF417,QR CODE,RSS 14,RSS EXPANDED,
|
||||
UPC A,UPC E 和 UPC EAN 扩展。
|
||||
采用ZXing-C++(“Zebra Crossing”)条形码扫描库。
|
||||
支持的条形码格式包括:AZTEC、CODABAR、CODE 39、CODE 93、CODE 128、
|
||||
DATA MATRIX、EAN 8、EAN 13、ITF、PDF417、QR CODE、RSS 14、RSS 扩展、
|
||||
UPC A、UPC E 以及 UPC EAN 增强版。
|
||||
|
||||
源代码:https://github.com/markusfisch/BinaryEye
|
||||
该项目为开源项目:
|
||||
https://github.com/markusfisch/BinaryEye
|
||||
|
||||
@@ -1 +1 @@
|
||||
一个 Android 条形码扫描器,开源、免费、无广告。
|
||||
无广告的二维码和条形码扫描器
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user