From 0f31638bdc1e15f68d75e77d0bf54485e36f6d21 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 24 Nov 2025 09:10:59 +1100 Subject: [PATCH 01/10] [CI] Build Fixes (#734) * precache for ios build * build android on push too * try without cache --- .github/workflows/android.yaml | 5 ++++- .github/workflows/ios.yaml | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml index 9f30b481..31479275 100644 --- a/.github/workflows/android.yaml +++ b/.github/workflows/android.yaml @@ -3,6 +3,9 @@ name: Android on: + pull_request: + branches: + - master push: branches: - master @@ -30,7 +33,7 @@ jobs: with: flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }} channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }} - cache: true + cache: false cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" pub-cache-key: "flutter-pub:os:-:channel:-:version:-:arch:-:hash:" diff --git a/.github/workflows/ios.yaml b/.github/workflows/ios.yaml index 724fa570..cdd51ed1 100644 --- a/.github/workflows/ios.yaml +++ b/.github/workflows/ios.yaml @@ -3,6 +3,9 @@ name: iOS on: + pull_request: + branches: + - master push: branches: - master @@ -33,7 +36,7 @@ jobs: with: flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }} channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }} - cache: true + cache: false cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:" cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:" pub-cache-key: "flutter-pub:os:-:channel:-:version:-:arch:-:hash:" @@ -49,6 +52,7 @@ jobs: dart pub global activate fvm fvm install fvm flutter pub get + fvm flutter precache --ios cd ios pod repo update pod install From bb10117f010baf9563d6d30618be2a11851e4905 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 28 Nov 2025 20:01:55 +1100 Subject: [PATCH 02/10] New Crowdin updates (#736) * New translations app_en.arb (Czech) * New translations app_en.arb (Russian) --- lib/l10n/cs_CZ/app_cs_CZ.arb | 6 ++-- lib/l10n/ru_RU/app_ru_RU.arb | 54 ++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lib/l10n/cs_CZ/app_cs_CZ.arb b/lib/l10n/cs_CZ/app_cs_CZ.arb index 51eb3672..ccd9d949 100644 --- a/lib/l10n/cs_CZ/app_cs_CZ.arb +++ b/lib/l10n/cs_CZ/app_cs_CZ.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Skenování čárových kódů pozastaveno", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Kliknutím pozastavíte skenování", "@barcodeScanPause": {}, "barcodeScanAssign": "Skenovat pro přiřazení čárového kódu", "@barcodeScanAssign": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Klíčová slova", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Ovladač pro popisky", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Vyberte ovladač pro tiskárnu štítků", "@labelSelectDriver": {}, "labelPrinting": "Tisk štítku", "@labelPrinting": {}, diff --git a/lib/l10n/ru_RU/app_ru_RU.arb b/lib/l10n/ru_RU/app_ru_RU.arb index fa9f15bc..8eb938f9 100644 --- a/lib/l10n/ru_RU/app_ru_RU.arb +++ b/lib/l10n/ru_RU/app_ru_RU.arb @@ -46,7 +46,7 @@ "@aspectRatioSquare": {}, "allocateStock": "Выделить запас", "@allocateStock": {}, - "allocatedStock": "Allocated Stock", + "allocatedStock": "Зарезервированные остатки", "@allocatedStock": {}, "appReleaseNotes": "Показать заметки о выпуске приложения", "@appReleaseNotes": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Сканирование штрих-кода приостановлено", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Нажмите, чтобы приостановить сканирование", "@barcodeScanPause": {}, "barcodeScanAssign": "Сканировать для присвоения штрих-кода", "@barcodeScanAssign": {}, @@ -240,7 +240,7 @@ "@deletePartDetail": {}, "deleteSuccess": "Удаление успешно завершено", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "Дата доставки", "@deliveryDate": {}, "description": "Описание", "@description": {}, @@ -384,9 +384,9 @@ "@homeShowPo": {}, "homeShowPoDescription": "Показывать кнопку заказа на главном экране", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "Показать отгрузки", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "Показывать ожидающие отгрузки на главном экране", "@homeShowShipmentsDescription": {}, "homeShowSo": "Показать заказы на продажу", "@homeShowSo": {}, @@ -454,9 +454,9 @@ "@invalidSupplierPart": {}, "invalidUsernamePassword": "Неверная комбинация имени пользователя и пароля", "@invalidUsernamePassword": {}, - "invoice": "Invoice", + "invoice": "Счет", "@invoice": {}, - "invoiceNumber": "Invoice Number", + "invoiceNumber": "Номер счета", "@invoiceNumber": {}, "issue": "Оформить", "@issue": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Ключевые слова", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Драйвер принтера этикеток", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Выберите драйвер принтера этикеток", "@labelSelectDriver": {}, "labelPrinting": "Печать этикеток", "@labelPrinting": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "Создать новое расположение склада", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Расположение по умолчанию", "@locationDefault": {}, "locationNotSet": "Не указано месторасположение", "@locationNotSet": {}, @@ -544,9 +544,9 @@ "@missingData": {}, "name": "Название", "@name": {}, - "no": "No", + "no": "Нет", "@no": {}, - "notApplicable": "N/A", + "notApplicable": "Н/Д", "@notApplicable": {}, "notConnected": "Соединение не установлено", "@notConnected": {}, @@ -660,7 +660,7 @@ "@password": {}, "passwordEmpty": "Пароль не может быть пустым", "@passwordEmpty": {}, - "pending": "Pending", + "pending": "В обработке", "@pending": {}, "permissionAccountDenied": "Ваш аккаунт не имеет разрешения на выполнение этого действия", "@permissionAccountDenied": {}, @@ -940,33 +940,33 @@ "@serverNotConnected": {}, "serverNotSelected": "Сервер не выбран", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "Отгрузка", "@shipment": {}, "shipments": "Поставки", "@shipments": {}, - "shipmentsPending": "Pending Shipments", + "shipmentsPending": "Ожидающие отгрузки", "@shipmentsPending": {}, "shipmentAdd": "Новое Отправление", "@shipmentAdd": {}, - "shipmentCheck": "Check Shipment", + "shipmentCheck": "Проверить отгрузку", "@shipmentCheck": {}, - "shipmentCheckDetail": "Mark this shipment as checked", + "shipmentCheckDetail": "Отметить этот груз как проверенный", "@shipmentCheckDetail": {}, - "shipmentChecked": "Shipment Checked", + "shipmentChecked": "Отгрузка проверена", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "Дата отгрузки", "@shipmentDate": {}, - "shipmentEdit": "Edit Shipment", + "shipmentEdit": "Редактировать отгрузку", "@shipmentEdit": {}, - "shipmentReference": "Shipment Reference", + "shipmentReference": "Ссылка на отгрузку", "@shipmentReference": {}, - "shipmentSend": "Send Shipment", + "shipmentSend": "Отправить отгрузку", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Снять отметку с отгрузки", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "Отметить этот груз как непроверенный", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "Отгрузка обновлена", "@shipmentUpdated": {}, "shipped": "Отгружено", "@shipped": {}, @@ -1112,7 +1112,7 @@ "@tokenMissingFromResponse": {}, "totalPrice": "Общая стоимость", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "Номер отслеживания", "@trackingNumber": {}, "transfer": "Перемещение", "@transfer": { @@ -1174,7 +1174,7 @@ "@viewSupplierPart": {}, "website": "Сайт", "@website": {}, - "yes": "Yes", + "yes": "Да", "@yes": {}, "price": "Цена", "@price": {}, From 346b1a150ffc24cddd9131b2d944f6994aa5c472 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 28 Nov 2025 23:53:10 +1100 Subject: [PATCH 03/10] Attachments refactor (#737) * refactor attachment code into its own file * Add getters * Remove custom models for each type of attachment * Refactor existing widgets * Fix double camera open bug * Remove dead code * Remove unused imports * Refactor common code * format * Update release notes --- assets/release_notes.md | 5 + lib/inventree/attachment.dart | 176 ++++++++++++++++++++ lib/inventree/company.dart | 25 --- lib/inventree/model.dart | 170 ------------------- lib/inventree/part.dart | 25 --- lib/inventree/purchase_order.dart | 25 --- lib/inventree/sales_order.dart | 47 +----- lib/inventree/stock.dart | 25 --- lib/widget/attachment_widget.dart | 92 ++++++---- lib/widget/company/company_detail.dart | 49 +++--- lib/widget/order/purchase_order_detail.dart | 58 +++---- lib/widget/order/sales_order_detail.dart | 58 +++---- lib/widget/order/so_shipment_detail.dart | 49 +++--- lib/widget/part/part_detail.dart | 47 +++--- lib/widget/stock/stock_detail.dart | 49 +++--- 15 files changed, 381 insertions(+), 519 deletions(-) create mode 100644 lib/inventree/attachment.dart diff --git a/assets/release_notes.md b/assets/release_notes.md index 17fd96d1..cbde0048 100644 --- a/assets/release_notes.md +++ b/assets/release_notes.md @@ -1,3 +1,8 @@ +### x.xx.x - Month Year +--- + +- Fixes bug which launched camera twice when uploading an attachment + ### 0.21.1 - November 2025 --- diff --git a/lib/inventree/attachment.dart b/lib/inventree/attachment.dart new file mode 100644 index 00000000..3f1b9130 --- /dev/null +++ b/lib/inventree/attachment.dart @@ -0,0 +1,176 @@ +import "dart:io"; + +import "package:flutter/cupertino.dart"; +import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; +import "package:inventree/api.dart"; +import "package:inventree/inventree/model.dart"; +import "package:inventree/inventree/sentry.dart"; +import "package:inventree/l10.dart"; +import "package:inventree/widget/fields.dart"; +import "package:inventree/widget/snacks.dart"; +import "package:path/path.dart" as path; + +class InvenTreeAttachment extends InvenTreeModel { + // Class representing an "attachment" file + InvenTreeAttachment() : super(); + + InvenTreeAttachment.fromJson(Map json) + : super.fromJson(json); + + @override + InvenTreeAttachment createFromJson(Map json) => + InvenTreeAttachment.fromJson(json); + + @override + String get URL => "attachment/"; + + @override + Map> formFields() { + Map> fields = {"link": {}, "comment": {}}; + + if (!hasLink) { + fields.remove("link"); + } + + return fields; + } + + // The model type of the instance this attachment is associated with + String get modelType => getString("model_type"); + + // The ID of the instance this attachment is associated with + int get modelId => getInt("model_id"); + + String get attachment => getString("attachment"); + + bool get hasAttachment => attachment.isNotEmpty; + + // Return the filename of the attachment + String get filename { + return attachment.split("/").last; + } + + IconData get icon { + String fn = filename.toLowerCase(); + + if (fn.endsWith(".pdf")) { + return TablerIcons.file_type_pdf; + } else if (fn.endsWith(".csv")) { + return TablerIcons.file_type_csv; + } else if (fn.endsWith(".doc") || fn.endsWith(".docx")) { + return TablerIcons.file_type_doc; + } else if (fn.endsWith(".xls") || fn.endsWith(".xlsx")) { + return TablerIcons.file_type_xls; + } + + // Image formats + final List img_formats = [".png", ".jpg", ".gif", ".bmp", ".svg"]; + + for (String fmt in img_formats) { + if (fn.endsWith(fmt)) { + return TablerIcons.file_type_jpg; + } + } + + return TablerIcons.file; + } + + String get comment => getString("comment"); + + DateTime? get uploadDate { + if (jsondata.containsKey("upload_date")) { + return DateTime.tryParse((jsondata["upload_date"] ?? "") as String); + } else { + return null; + } + } + + // Return a count of how many attachments exist against the specified model ID + Future countAttachments(String modelType, int modelId) async { + Map filters = {}; + + if (!api.supportsModernAttachments) { + return 0; + } + + filters["model_type"] = modelType; + filters["model_id"] = modelId.toString(); + + return count(filters: filters); + } + + Future uploadAttachment( + File attachment, + String modelType, + int modelId, { + String comment = "", + Map fields = const {}, + }) async { + // Ensure that the correct reference field is set + Map data = Map.from(fields); + + String url = URL; + + if (comment.isNotEmpty) { + data["comment"] = comment; + } + + data["model_type"] = modelType; + data["model_id"] = modelId.toString(); + + final APIResponse response = await InvenTreeAPI().uploadFile( + url, + attachment, + method: "POST", + name: "attachment", + fields: data, + ); + + return response.successful(); + } + + Future uploadImage( + String modelType, + int modelId, { + String prefix = "InvenTree", + }) async { + bool result = false; + + await FilePickerDialog.pickImageFromCamera().then((File? file) { + if (file != null) { + String dir = path.dirname(file.path); + String ext = path.extension(file.path); + String now = DateTime.now().toIso8601String().replaceAll(":", "-"); + + // Rename the file with a unique name + String filename = "${dir}/${prefix}_image_${now}${ext}"; + + try { + return file.rename(filename).then((File renamed) { + return uploadAttachment(renamed, modelType, modelId).then(( + success, + ) { + result = success; + showSnackIcon( + result ? L10().imageUploadSuccess : L10().imageUploadFailure, + success: result, + ); + }); + }); + } catch (error, stackTrace) { + sentryReportError("uploadImage", error, stackTrace); + showSnackIcon(L10().imageUploadFailure, success: false); + } + } + }); + + return result; + } + + /* + * Download this attachment file + */ + Future downloadAttachment() async { + await InvenTreeAPI().downloadFile(attachment); + } +} diff --git a/lib/inventree/company.dart b/lib/inventree/company.dart index a2a3f21d..90ed77c1 100644 --- a/lib/inventree/company.dart +++ b/lib/inventree/company.dart @@ -111,31 +111,6 @@ class InvenTreeCompany extends InvenTreeModel { InvenTreeCompany.fromJson(json); } -/* - * Class representing an attachment file against a Company object - */ -class InvenTreeCompanyAttachment extends InvenTreeAttachment { - InvenTreeCompanyAttachment() : super(); - - InvenTreeCompanyAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - String get REFERENCE_FIELD => "company"; - - @override - String get REF_MODEL_TYPE => "company"; - - @override - String get URL => InvenTreeAPI().supportsModernAttachments - ? "attachment/" - : "company/attachment/"; - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreeCompanyAttachment.fromJson(json); -} - /* * The InvenTreeSupplierPart class represents the SupplierPart model in the InvenTree database */ diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index e08a053e..f87b2de5 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -1,5 +1,4 @@ import "dart:async"; -import "dart:io"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:flutter/material.dart"; @@ -15,7 +14,6 @@ import "package:inventree/helpers.dart"; import "package:inventree/inventree/sentry.dart"; import "package:inventree/widget/dialogs.dart"; -import "package:inventree/widget/fields.dart"; // Paginated response object class InvenTreePageResponse { @@ -934,171 +932,3 @@ class InvenTreeUserSetting extends InvenTreeGlobalSetting { @override String get URL => "settings/user/"; } - -class InvenTreeAttachment extends InvenTreeModel { - // Class representing an "attachment" file - InvenTreeAttachment() : super(); - - InvenTreeAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - String get URL => "attachment/"; - - @override - Map> formFields() { - Map> fields = {"link": {}, "comment": {}}; - - if (!hasLink) { - fields.remove("link"); - } - - return fields; - } - - // Override this reference field for any subclasses - // Note: This is used for the *legacy* attachment API - String get REFERENCE_FIELD => ""; - - // Override this reference field for any subclasses - // Note: This is used for the *modern* attachment API - String get REF_MODEL_TYPE => ""; - - String get attachment => getString("attachment"); - - bool get hasAttachment => attachment.isNotEmpty; - - // Return the filename of the attachment - String get filename { - return attachment.split("/").last; - } - - IconData get icon { - String fn = filename.toLowerCase(); - - if (fn.endsWith(".pdf")) { - return TablerIcons.file_type_pdf; - } else if (fn.endsWith(".csv")) { - return TablerIcons.file_type_csv; - } else if (fn.endsWith(".doc") || fn.endsWith(".docx")) { - return TablerIcons.file_type_doc; - } else if (fn.endsWith(".xls") || fn.endsWith(".xlsx")) { - return TablerIcons.file_type_xls; - } - - // Image formats - final List img_formats = [".png", ".jpg", ".gif", ".bmp", ".svg"]; - - for (String fmt in img_formats) { - if (fn.endsWith(fmt)) { - return TablerIcons.file_type_jpg; - } - } - - return TablerIcons.file; - } - - String get comment => getString("comment"); - - DateTime? get uploadDate { - if (jsondata.containsKey("upload_date")) { - return DateTime.tryParse((jsondata["upload_date"] ?? "") as String); - } else { - return null; - } - } - - // Return a count of how many attachments exist against the specified model ID - Future countAttachments(int modelId) { - Map filters = {}; - - if (InvenTreeAPI().supportsModernAttachments) { - filters["model_type"] = REF_MODEL_TYPE; - filters["model_id"] = modelId.toString(); - } else { - filters[REFERENCE_FIELD] = modelId.toString(); - } - - return count(filters: filters); - } - - Future uploadAttachment( - File attachment, - int modelId, { - String comment = "", - Map fields = const {}, - }) async { - // Ensure that the correct reference field is set - Map data = Map.from(fields); - - String url = URL; - - if (comment.isNotEmpty) { - data["comment"] = comment; - } - - if (InvenTreeAPI().supportsModernAttachments) { - url = "attachment/"; - data["model_id"] = modelId.toString(); - data["model_type"] = REF_MODEL_TYPE; - } else { - if (REFERENCE_FIELD.isEmpty) { - sentryReportMessage( - "uploadAttachment called with empty 'REFERENCE_FIELD'", - ); - return false; - } - - data[REFERENCE_FIELD] = modelId.toString(); - } - - final APIResponse response = await InvenTreeAPI().uploadFile( - url, - attachment, - method: "POST", - name: "attachment", - fields: data, - ); - - return response.successful(); - } - - Future uploadImage(int modelId, {String prefix = "InvenTree"}) async { - bool result = false; - - await FilePickerDialog.pickImageFromCamera().then((File? file) { - if (file != null) { - String dir = path.dirname(file.path); - String ext = path.extension(file.path); - String now = DateTime.now().toIso8601String().replaceAll(":", "-"); - - // Rename the file with a unique name - String filename = "${dir}/${prefix}_image_${now}${ext}"; - - try { - file.rename(filename).then((File renamed) { - uploadAttachment(renamed, modelId).then((success) { - result = success; - showSnackIcon( - result ? L10().imageUploadSuccess : L10().imageUploadFailure, - success: result, - ); - }); - }); - } catch (error, stackTrace) { - sentryReportError("uploadImage", error, stackTrace); - showSnackIcon(L10().imageUploadFailure, success: false); - } - } - }); - - return result; - } - - /* - * Download this attachment file - */ - Future downloadAttachment() async { - await InvenTreeAPI().downloadFile(attachment); - } -} diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index 23e306c1..fc523992 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -547,28 +547,3 @@ class InvenTreePartPricing extends InvenTreeModel { double? get saleHistoryMin => getDoubleOrNull("sale_history_min"); double? get saleHistoryMax => getDoubleOrNull("sale_history_max"); } - -/* - * Class representing an attachment file against a Part object - */ -class InvenTreePartAttachment extends InvenTreeAttachment { - InvenTreePartAttachment() : super(); - - InvenTreePartAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - String get REFERENCE_FIELD => "part"; - - @override - String get REF_MODEL_TYPE => "part"; - - @override - String get URL => InvenTreeAPI().supportsModernAttachments - ? "attachment/" - : "part/attachment/"; - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreePartAttachment.fromJson(json); -} diff --git a/lib/inventree/purchase_order.dart b/lib/inventree/purchase_order.dart index 59874dc1..65af3610 100644 --- a/lib/inventree/purchase_order.dart +++ b/lib/inventree/purchase_order.dart @@ -336,28 +336,3 @@ class InvenTreePOExtraLineItem extends InvenTreeExtraLineItem { ); } } - -/* - * Class representing an attachment file against a PurchaseOrder object - */ -class InvenTreePurchaseOrderAttachment extends InvenTreeAttachment { - InvenTreePurchaseOrderAttachment() : super(); - - InvenTreePurchaseOrderAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - String get REFERENCE_FIELD => "order"; - - @override - String get REF_MODEL_TYPE => "purchaseorder"; - - @override - String get URL => InvenTreeAPI().supportsModernAttachments - ? "attachment/" - : "order/po/attachment/"; - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreePurchaseOrderAttachment.fromJson(json); -} diff --git a/lib/inventree/sales_order.dart b/lib/inventree/sales_order.dart index 8b661f4a..77c3469d 100644 --- a/lib/inventree/sales_order.dart +++ b/lib/inventree/sales_order.dart @@ -334,7 +334,7 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel { /* * Class representing an allocation of stock against a SalesOrderShipment */ -class InvenTreeSalesOrderAllocation extends InvenTreeAttachment { +class InvenTreeSalesOrderAllocation extends InvenTreeModel { InvenTreeSalesOrderAllocation() : super(); InvenTreeSalesOrderAllocation.fromJson(Map json) @@ -428,48 +428,3 @@ class InvenTreeSalesOrderAllocation extends InvenTreeAttachment { } } } - -/* - * Class representing an attachment file against a SalesOrder object - */ -class InvenTreeSalesOrderAttachment extends InvenTreeAttachment { - InvenTreeSalesOrderAttachment() : super(); - - InvenTreeSalesOrderAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreeSalesOrderAttachment.fromJson(json); - - @override - String get REFERENCE_FIELD => "order"; - - @override - String get REF_MODEL_TYPE => "salesorder"; - - @override - String get URL => InvenTreeAPI().supportsModernAttachments - ? "attachment/" - : "order/so/attachment/"; -} - -class InvenTreeSalesOrderShipmentAttachment extends InvenTreeAttachment { - InvenTreeSalesOrderShipmentAttachment() : super(); - - InvenTreeSalesOrderShipmentAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreeSalesOrderShipmentAttachment.fromJson(json); - - @override - String get REFERENCE_FIELD => "shipment"; - - @override - String get REF_MODEL_TYPE => "salesordershipment"; - - @override - String get URL => "attachment/"; -} diff --git a/lib/inventree/stock.dart b/lib/inventree/stock.dart index 1a45e73e..4b5bf3b0 100644 --- a/lib/inventree/stock.dart +++ b/lib/inventree/stock.dart @@ -575,31 +575,6 @@ class InvenTreeStockItem extends InvenTreeModel { } } -/* - * Class representing an attachment file against a StockItem object - */ -class InvenTreeStockItemAttachment extends InvenTreeAttachment { - InvenTreeStockItemAttachment() : super(); - - InvenTreeStockItemAttachment.fromJson(Map json) - : super.fromJson(json); - - @override - String get REFERENCE_FIELD => "stock_item"; - - @override - String get REF_MODEL_TYPE => "stockitem"; - - @override - String get URL => InvenTreeAPI().supportsModernAttachments - ? "attachment/" - : "stock/attachment/"; - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreeStockItemAttachment.fromJson(json); -} - class InvenTreeStockLocation extends InvenTreeModel { InvenTreeStockLocation() : super(); diff --git a/lib/widget/attachment_widget.dart b/lib/widget/attachment_widget.dart index b66462f3..721909d9 100644 --- a/lib/widget/attachment_widget.dart +++ b/lib/widget/attachment_widget.dart @@ -2,14 +2,13 @@ import "dart:io"; import "package:flutter/material.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; +import "package:inventree/api.dart"; +import "package:inventree/inventree/attachment.dart"; +import "package:inventree/widget/link_icon.dart"; import "package:one_context/one_context.dart"; -import "package:inventree/api.dart"; import "package:inventree/l10.dart"; import "package:inventree/app_colors.dart"; - -import "package:inventree/inventree/model.dart"; - import "package:inventree/widget/fields.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/snacks.dart"; @@ -23,13 +22,13 @@ import "package:inventree/widget/refreshable_state.dart"; */ class AttachmentWidget extends StatefulWidget { const AttachmentWidget( - this.attachmentClass, + this.modelType, this.modelId, this.imagePrefix, this.hasUploadPermission, ) : super(); - final InvenTreeAttachment attachmentClass; + final String modelType; final int modelId; final bool hasUploadPermission; final String imagePrefix; @@ -54,15 +53,15 @@ class _AttachmentWidgetState extends RefreshableState { IconButton( icon: Icon(TablerIcons.camera), onPressed: () async { - widget.attachmentClass.uploadImage( - widget.modelId, - prefix: widget.imagePrefix, - ); - FilePickerDialog.pickImageFromCamera().then((File? file) { - upload(context, file).then((_) { - refresh(context); - }); - }); + InvenTreeAttachment() + .uploadImage( + widget.modelType, + widget.modelId, + prefix: widget.imagePrefix, + ) + .then((_) { + refresh(context); + }); }, ), IconButton( @@ -83,8 +82,9 @@ class _AttachmentWidgetState extends RefreshableState { showLoadingOverlay(); - final bool result = await widget.attachmentClass.uploadAttachment( + final bool result = await InvenTreeAttachment().uploadAttachment( file, + widget.modelType, widget.modelId, ); @@ -168,25 +168,24 @@ class _AttachmentWidgetState extends RefreshableState { Future request(BuildContext context) async { Map filters = {}; - if (InvenTreeAPI().supportsModernAttachments) { - filters["model_type"] = widget.attachmentClass.REF_MODEL_TYPE; - filters["model_id"] = widget.modelId.toString(); - } else { - filters[widget.attachmentClass.REFERENCE_FIELD] = widget.modelId - .toString(); - } + filters["model_type"] = widget.modelType; + filters["model_id"] = widget.modelId.toString(); - await widget.attachmentClass.list(filters: filters).then((var results) { - attachments.clear(); + List _attachments = []; + InvenTreeAttachment().list(filters: filters).then((var results) { for (var result in results) { if (result is InvenTreeAttachment) { - attachments.add(result); + _attachments.add(result); } } - }); - setState(() {}); + if (mounted) { + setState(() { + attachments = _attachments; + }); + } + }); } @override @@ -240,3 +239,40 @@ class _AttachmentWidgetState extends RefreshableState { return tiles; } } + +/* + * Return a ListTile to display attachments for the specified model + */ +ListTile? ShowAttachmentsItem( + BuildContext context, + String modelType, + int modelId, + String imagePrefix, + int attachmentCount, + bool hasUploadPermission, +) { + if (!InvenTreeAPI().supportsModernAttachments) { + return null; + } + + return ListTile( + title: Text(L10().attachments), + leading: Icon(TablerIcons.file, color: COLOR_ACTION), + trailing: LinkIcon( + text: attachmentCount > 0 ? attachmentCount.toString() : null, + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => AttachmentWidget( + modelType, + modelId, + imagePrefix, + hasUploadPermission, + ), + ), + ); + }, + ); +} diff --git a/lib/widget/company/company_detail.dart b/lib/widget/company/company_detail.dart index 5d06e581..8947104b 100644 --- a/lib/widget/company/company_detail.dart +++ b/lib/widget/company/company_detail.dart @@ -1,6 +1,7 @@ import "package:flutter/material.dart"; import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; +import "package:inventree/inventree/attachment.dart"; import "package:inventree/l10.dart"; import "package:inventree/api.dart"; @@ -184,15 +185,15 @@ class _CompanyDetailState extends RefreshableState { } }); - InvenTreeCompanyAttachment().countAttachments(widget.company.pk).then(( - value, - ) { - if (mounted) { - setState(() { - attachmentCount = value; + InvenTreeAttachment() + .countAttachments(InvenTreeCompany.MODEL_TYPE, widget.company.pk) + .then((value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } }); - } - }); } Future editCompany(BuildContext context) async { @@ -393,29 +394,19 @@ class _CompanyDetailState extends RefreshableState { ); } - tiles.add( - ListTile( - title: Text(L10().attachments), - leading: Icon(TablerIcons.file, color: COLOR_ACTION), - trailing: LinkIcon( - text: attachmentCount > 0 ? attachmentCount.toString() : null, - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AttachmentWidget( - InvenTreeCompanyAttachment(), - widget.company.pk, - widget.company.name, - InvenTreeCompany().canEdit, - ), - ), - ); - }, - ), + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreeCompany.MODEL_TYPE, + widget.company.pk, + widget.company.name, + attachmentCount, + widget.company.canEdit, ); + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } } diff --git a/lib/widget/order/purchase_order_detail.dart b/lib/widget/order/purchase_order_detail.dart index 4201cd36..0829e06c 100644 --- a/lib/widget/order/purchase_order_detail.dart +++ b/lib/widget/order/purchase_order_detail.dart @@ -7,6 +7,7 @@ import "package:inventree/app_colors.dart"; import "package:inventree/barcode/barcode.dart"; import "package:inventree/barcode/purchase_order.dart"; import "package:inventree/helpers.dart"; +import "package:inventree/inventree/attachment.dart"; import "package:inventree/l10.dart"; import "package:inventree/inventree/model.dart"; @@ -174,8 +175,12 @@ class _PurchaseOrderDetailState /// Upload an image against the current PurchaseOrder Future _uploadImage(BuildContext context) async { - InvenTreePurchaseOrderAttachment() - .uploadImage(widget.order.pk, prefix: widget.order.reference) + InvenTreeAttachment() + .uploadImage( + InvenTreePurchaseOrder.MODEL_TYPE, + widget.order.pk, + prefix: widget.order.reference, + ) .then((result) => refresh(context)); } @@ -295,15 +300,15 @@ class _PurchaseOrderDetailState } } - InvenTreePurchaseOrderAttachment().countAttachments(widget.order.pk).then(( - int value, - ) { - if (mounted) { - setState(() { - attachmentCount = value; + InvenTreeAttachment() + .countAttachments(InvenTreePurchaseOrder.MODEL_TYPE, widget.order.pk) + .then((int value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } }); - } - }); if (api.supportsPurchaseOrderDestination && widget.order.destinationId > 0) { @@ -565,30 +570,19 @@ class _PurchaseOrderDetailState ), ); - // Attachments - tiles.add( - ListTile( - title: Text(L10().attachments), - leading: Icon(TablerIcons.file, color: COLOR_ACTION), - trailing: LinkIcon( - text: attachmentCount > 0 ? attachmentCount.toString() : null, - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AttachmentWidget( - InvenTreePurchaseOrderAttachment(), - widget.order.pk, - widget.order.reference, - widget.order.canEdit, - ), - ), - ); - }, - ), + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreePurchaseOrder.MODEL_TYPE, + widget.order.pk, + widget.order.reference, + attachmentCount, + widget.order.canEdit, ); + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } diff --git a/lib/widget/order/sales_order_detail.dart b/lib/widget/order/sales_order_detail.dart index ec18561c..30692f2b 100644 --- a/lib/widget/order/sales_order_detail.dart +++ b/lib/widget/order/sales_order_detail.dart @@ -3,6 +3,7 @@ import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/barcode/barcode.dart"; import "package:inventree/barcode/sales_order.dart"; +import "package:inventree/inventree/attachment.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/inventree/sales_order.dart"; import "package:inventree/preferences.dart"; @@ -108,8 +109,12 @@ class _SalesOrderDetailState extends RefreshableState { /// Upload an image for this order Future _uploadImage(BuildContext context) async { - InvenTreeSalesOrderAttachment() - .uploadImage(widget.order.pk, prefix: widget.order.reference) + InvenTreeAttachment() + .uploadImage( + InvenTreeSalesOrder.MODEL_TYPE, + widget.order.pk, + prefix: widget.order.reference, + ) .then((result) => refresh(context)); } @@ -266,15 +271,15 @@ class _SalesOrderDetailState extends RefreshableState { true, ); - InvenTreeSalesOrderAttachment().countAttachments(widget.order.pk).then(( - int value, - ) { - if (mounted) { - setState(() { - attachmentCount = value; + InvenTreeAttachment() + .countAttachments(InvenTreeSalesOrder.MODEL_TYPE, widget.order.pk) + .then((int value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } }); - } - }); // Count number of "extra line items" against this order InvenTreeSOExtraLineItem() @@ -492,30 +497,19 @@ class _SalesOrderDetailState extends RefreshableState { ), ); - // Attachments - tiles.add( - ListTile( - title: Text(L10().attachments), - leading: Icon(TablerIcons.file, color: COLOR_ACTION), - trailing: LinkIcon( - text: attachmentCount > 0 ? attachmentCount.toString() : null, - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AttachmentWidget( - InvenTreeSalesOrderAttachment(), - widget.order.pk, - widget.order.reference, - widget.order.canEdit, - ), - ), - ); - }, - ), + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreeSalesOrder.MODEL_TYPE, + widget.order.pk, + widget.order.reference, + attachmentCount, + widget.order.canEdit, ); + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } diff --git a/lib/widget/order/so_shipment_detail.dart b/lib/widget/order/so_shipment_detail.dart index 9116fb7f..34984dfd 100644 --- a/lib/widget/order/so_shipment_detail.dart +++ b/lib/widget/order/so_shipment_detail.dart @@ -8,6 +8,7 @@ import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/api.dart"; import "package:inventree/api_form.dart"; import "package:inventree/app_colors.dart"; +import "package:inventree/inventree/attachment.dart"; import "package:inventree/inventree/sales_order.dart"; import "package:inventree/l10.dart"; import "package:inventree/preferences.dart"; @@ -91,8 +92,11 @@ class _SOShipmentDetailWidgetState }); } - InvenTreeSalesOrderShipmentAttachment() - .countAttachments(widget.shipment.pk) + InvenTreeAttachment() + .countAttachments( + InvenTreeSalesOrderShipment.MODEL_TYPE, + widget.shipment.pk, + ) .then((int value) { if (mounted) { setState(() { @@ -104,8 +108,12 @@ class _SOShipmentDetailWidgetState /// Upload an image for this shipment Future _uploadImage(BuildContext context) async { - InvenTreeSalesOrderShipmentAttachment() - .uploadImage(widget.shipment.pk, prefix: widget.shipment.reference) + InvenTreeAttachment() + .uploadImage( + InvenTreeSalesOrderShipment.MODEL_TYPE, + widget.shipment.pk, + prefix: widget.shipment.reference, + ) .then((result) => refresh(context)); } @@ -339,30 +347,19 @@ class _SOShipmentDetailWidgetState ), ); - // Attachments - tiles.add( - ListTile( - title: Text(L10().attachments), - leading: Icon(TablerIcons.file, color: COLOR_ACTION), - trailing: LinkIcon( - text: attachmentCount > 0 ? attachmentCount.toString() : null, - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AttachmentWidget( - InvenTreeSalesOrderShipmentAttachment(), - widget.shipment.pk, - widget.shipment.reference, - widget.shipment.canEdit, - ), - ), - ); - }, - ), + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreeSalesOrderShipment.MODEL_TYPE, + widget.shipment.pk, + widget.shipment.reference, + attachmentCount, + widget.shipment.canEdit, ); + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } diff --git a/lib/widget/part/part_detail.dart b/lib/widget/part/part_detail.dart index 98cf1737..30b697c4 100644 --- a/lib/widget/part/part_detail.dart +++ b/lib/widget/part/part_detail.dart @@ -4,6 +4,7 @@ import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/barcode/barcode.dart"; +import "package:inventree/inventree/attachment.dart"; import "package:inventree/l10.dart"; import "package:inventree/helpers.dart"; @@ -212,13 +213,15 @@ class _PartDisplayState extends RefreshableState { } // Request the number of attachments - InvenTreePartAttachment().countAttachments(part.pk).then((int value) { - if (mounted) { - setState(() { - attachmentCount = value; + InvenTreeAttachment() + .countAttachments(InvenTreePart.MODEL_TYPE, part.pk) + .then((int value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } }); - } - }); // If show pricing information? if (showPricing) { @@ -596,29 +599,19 @@ class _PartDisplayState extends RefreshableState { ), ); - tiles.add( - ListTile( - title: Text(L10().attachments), - leading: Icon(TablerIcons.file, color: COLOR_ACTION), - trailing: LinkIcon( - text: attachmentCount > 0 ? attachmentCount.toString() : null, - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AttachmentWidget( - InvenTreePartAttachment(), - part.pk, - L10().part, - part.canEdit, - ), - ), - ); - }, - ), + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreePart.MODEL_TYPE, + part.pk, + L10().part, + attachmentCount, + part.canEdit, ); + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } diff --git a/lib/widget/stock/stock_detail.dart b/lib/widget/stock/stock_detail.dart index db295cac..282a9627 100644 --- a/lib/widget/stock/stock_detail.dart +++ b/lib/widget/stock/stock_detail.dart @@ -7,6 +7,7 @@ import "package:inventree/app_colors.dart"; import "package:inventree/barcode/barcode.dart"; import "package:inventree/barcode/stock.dart"; import "package:inventree/helpers.dart"; +import "package:inventree/inventree/attachment.dart"; import "package:inventree/inventree/sales_order.dart"; import "package:inventree/l10.dart"; import "package:inventree/api.dart"; @@ -255,15 +256,15 @@ class _StockItemDisplayState extends RefreshableState { } // Request the number of attachments - InvenTreeStockItemAttachment().countAttachments(widget.item.pk).then(( - int value, - ) { - if (mounted) { - setState(() { - attachmentCount = value; + InvenTreeAttachment() + .countAttachments(InvenTreeStockItem.MODEL_TYPE, widget.item.pk) + .then((int value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } }); - } - }); // Request SalesOrder information if (widget.item.hasSalesOrder) { @@ -837,29 +838,19 @@ class _StockItemDisplayState extends RefreshableState { ), ); - tiles.add( - ListTile( - title: Text(L10().attachments), - leading: Icon(TablerIcons.file, color: COLOR_ACTION), - trailing: LinkIcon( - text: attachmentCount > 0 ? attachmentCount.toString() : null, - ), - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => AttachmentWidget( - InvenTreeStockItemAttachment(), - widget.item.pk, - L10().stockItem, - widget.item.canEdit, - ), - ), - ); - }, - ), + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreeStockItem.MODEL_TYPE, + widget.item.pk, + L10().stockItem, + attachmentCount, + widget.item.canEdit, ); + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } } From 864c3eea76c2303e285b043e8a58c363b32a6d6d Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 4 Dec 2025 18:34:05 +1100 Subject: [PATCH 04/10] Parameters refactor (#738) * refactor attachment code into its own file * Add getters * Remove custom models for each type of attachment * Refactor existing widgets * Fix double camera open bug * Add check for modern parameter API * Add generic parameter type * Remove old code * Remove dead code * Refactor previous widget * Remove unused imports * Refactor common code * format * Update release notes * Helper func to render parameters list tile * Display parameters on part page * parameters for company * Supplier more model types: - ManufacturerPart - SupplierPart - PurchaseOrder - SalesOrder * dart format * Fix image prefix * Remove unused import * Adjust API version --- lib/api.dart | 4 + lib/inventree/parameter.dart | 77 ++++++++++++++++++ lib/inventree/part.dart | 62 --------------- lib/preferences.dart | 1 - lib/settings/part_settings.dart | 22 ------ lib/widget/company/company_detail.dart | 25 ++++++ .../company/manufacturer_part_detail.dart | 64 +++++++++++++-- lib/widget/company/supplier_part_detail.dart | 59 ++++++++++++++ lib/widget/order/purchase_order_detail.dart | 25 ++++++ lib/widget/order/sales_order_detail.dart | 25 ++++++ ...eter_widget.dart => parameter_widget.dart} | 78 +++++++++++++++---- lib/widget/part/part_detail.dart | 65 +++++++++------- 12 files changed, 378 insertions(+), 129 deletions(-) create mode 100644 lib/inventree/parameter.dart rename lib/widget/{part/part_parameter_widget.dart => parameter_widget.dart} (58%) diff --git a/lib/api.dart b/lib/api.dart index 1d24b397..61a63798 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -353,6 +353,10 @@ class InvenTreeAPI { // Supports separate search against "supplier" / "customer" / "manufacturer" bool get supportsSplitCompanySearch => apiVersion >= 315; + // Does the server support the "modern" (consolidated) parameter API? + // Ref: https://github.com/inventree/InvenTree/pull/10699 + bool get supportsModernParameters => apiVersion >= 429; + // Cached list of plugins (refreshed when we connect to the server) List _plugins = []; diff --git a/lib/inventree/parameter.dart b/lib/inventree/parameter.dart new file mode 100644 index 00000000..22006d78 --- /dev/null +++ b/lib/inventree/parameter.dart @@ -0,0 +1,77 @@ +import "package:inventree/inventree/model.dart"; + +class InvenTreeParameter extends InvenTreeModel { + InvenTreeParameter() : super(); + + InvenTreeParameter.fromJson(Map json) : super.fromJson(json); + + @override + InvenTreeParameter createFromJson(Map json) => + InvenTreeParameter.fromJson(json); + + @override + String get URL => "parameter/"; + + @override + Map> formFields() { + Map> fields = { + "header": { + "type": "string", + "read_only": true, + "label": name, + "help_text": description, + "value": "", + }, + "data": {"type": "string"}, + "note": {}, + }; + + return fields; + } + + @override + String get name => getString("name", subKey: "template_detail"); + + @override + String get description => getString("description", subKey: "template_detail"); + + String get value => getString("data"); + + String get valueString { + String v = value; + + if (units.isNotEmpty) { + v += " "; + v += units; + } + + return v; + } + + bool get as_bool => value.toLowerCase() == "true"; + + String get units => getString("units", subKey: "template_detail"); + + bool get is_checkbox => + getBool("checkbox", subKey: "template_detail", backup: false); + + // The model type of the instance this attachment is associated with + String get modelType => getString("model_type"); + + // The ID of the instance this attachment is associated with + int get modelId => getInt("model_id"); + + // Return a count of how many parameters exist against the specified model ID + Future countParameters(String modelType, int modelId) async { + Map filters = {}; + + if (!api.supportsModernParameters) { + return 0; + } + + filters["model_type"] = modelType; + filters["model_id"] = modelId.toString(); + + return count(filters: filters); + } +} diff --git a/lib/inventree/part.dart b/lib/inventree/part.dart index fc523992..033fae99 100644 --- a/lib/inventree/part.dart +++ b/lib/inventree/part.dart @@ -132,68 +132,6 @@ class InvenTreePartTestTemplate extends InvenTreeModel { } } -/* - Class representing the PartParameter database model - */ -class InvenTreePartParameter extends InvenTreeModel { - InvenTreePartParameter() : super(); - - InvenTreePartParameter.fromJson(Map json) - : super.fromJson(json); - - @override - String get URL => "part/parameter/"; - - @override - List get rolesRequired => ["part"]; - - @override - InvenTreeModel createFromJson(Map json) => - InvenTreePartParameter.fromJson(json); - - @override - Map> formFields() { - Map> fields = { - "header": { - "type": "string", - "read_only": true, - "label": name, - "help_text": description, - "value": "", - }, - "data": {"type": "string"}, - }; - - return fields; - } - - @override - String get name => getString("name", subKey: "template_detail"); - - @override - String get description => getString("description", subKey: "template_detail"); - - String get value => getString("data"); - - String get valueString { - String v = value; - - if (units.isNotEmpty) { - v += " "; - v += units; - } - - return v; - } - - bool get as_bool => value.toLowerCase() == "true"; - - String get units => getString("units", subKey: "template_detail"); - - bool get is_checkbox => - getBool("checkbox", subKey: "template_detail", backup: false); -} - /* * Class representing the Part database model */ diff --git a/lib/preferences.dart b/lib/preferences.dart index de7bb0f0..92eda1fe 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -32,7 +32,6 @@ const String INV_LABEL_DEFAULT_PRINTER = "defaultLabelPrinter"; const String INV_LABEL_DEFAULT_PLUGIN = "defaultLabelPlugin"; // Part settings -const String INV_PART_SHOW_PARAMETERS = "partShowParameters"; const String INV_PART_SHOW_BOM = "partShowBom"; const String INV_PART_SHOW_PRICING = "partShowPricing"; diff --git a/lib/settings/part_settings.dart b/lib/settings/part_settings.dart index b0919316..aa136782 100644 --- a/lib/settings/part_settings.dart +++ b/lib/settings/part_settings.dart @@ -13,7 +13,6 @@ class InvenTreePartSettingsWidget extends StatefulWidget { class _InvenTreePartSettingsState extends State { _InvenTreePartSettingsState(); - bool partShowParameters = true; bool partShowBom = true; bool partShowPricing = true; bool stockShowHistory = false; @@ -28,10 +27,6 @@ class _InvenTreePartSettingsState extends State { } Future loadSettings() async { - partShowParameters = await InvenTreeSettingsManager().getBool( - INV_PART_SHOW_PARAMETERS, - true, - ); partShowBom = await InvenTreeSettingsManager().getBool( INV_PART_SHOW_BOM, true, @@ -68,23 +63,6 @@ class _InvenTreePartSettingsState extends State { body: Container( child: ListView( children: [ - ListTile( - title: Text(L10().parameters), - subtitle: Text(L10().parametersSettingDetail), - leading: Icon(TablerIcons.list), - trailing: Switch( - value: partShowParameters, - onChanged: (bool value) { - InvenTreeSettingsManager().setValue( - INV_PART_SHOW_PARAMETERS, - value, - ); - setState(() { - partShowParameters = value; - }); - }, - ), - ), ListTile( title: Text(L10().bom), subtitle: Text(L10().bomEnable), diff --git a/lib/widget/company/company_detail.dart b/lib/widget/company/company_detail.dart index 8947104b..9a6d233f 100644 --- a/lib/widget/company/company_detail.dart +++ b/lib/widget/company/company_detail.dart @@ -2,6 +2,7 @@ import "package:flutter/material.dart"; import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/inventree/attachment.dart"; +import "package:inventree/inventree/parameter.dart"; import "package:inventree/l10.dart"; import "package:inventree/api.dart"; @@ -14,6 +15,7 @@ import "package:inventree/widget/attachment_widget.dart"; import "package:inventree/widget/link_icon.dart"; import "package:inventree/widget/order/purchase_order_list.dart"; import "package:inventree/widget/order/sales_order_list.dart"; +import "package:inventree/widget/parameter_widget.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/snacks.dart"; import "package:inventree/widget/company/supplier_part_list.dart"; @@ -38,6 +40,7 @@ class _CompanyDetailState extends RefreshableState { int outstandingPurchaseOrders = 0; int outstandingSalesOrders = 0; + int parameterCount = 0; int attachmentCount = 0; @override @@ -185,6 +188,16 @@ class _CompanyDetailState extends RefreshableState { } }); + InvenTreeParameter() + .countParameters(InvenTreeCompany.MODEL_TYPE, widget.company.pk) + .then((value) { + if (mounted) { + setState(() { + parameterCount = value; + }); + } + }); + InvenTreeAttachment() .countAttachments(InvenTreeCompany.MODEL_TYPE, widget.company.pk) .then((value) { @@ -394,6 +407,18 @@ class _CompanyDetailState extends RefreshableState { ); } + ListTile? parameterTile = ShowParametersItem( + context, + InvenTreeCompany.MODEL_TYPE, + widget.company.pk, + parameterCount, + widget.company.canEdit, + ); + + if (parameterTile != null) { + tiles.add(parameterTile); + } + ListTile? attachmentTile = ShowAttachmentsItem( context, InvenTreeCompany.MODEL_TYPE, diff --git a/lib/widget/company/manufacturer_part_detail.dart b/lib/widget/company/manufacturer_part_detail.dart index 9cc6bc23..57a7e48f 100644 --- a/lib/widget/company/manufacturer_part_detail.dart +++ b/lib/widget/company/manufacturer_part_detail.dart @@ -1,6 +1,8 @@ import "package:flutter/material.dart"; import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; +import "package:inventree/inventree/attachment.dart"; +import "package:inventree/inventree/parameter.dart"; import "package:inventree/l10.dart"; import "package:inventree/api.dart"; @@ -8,6 +10,8 @@ import "package:inventree/app_colors.dart"; import "package:inventree/inventree/company.dart"; import "package:inventree/inventree/part.dart"; +import "package:inventree/widget/attachment_widget.dart"; +import "package:inventree/widget/parameter_widget.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/snacks.dart"; @@ -31,6 +35,9 @@ class _ManufacturerPartDisplayState extends RefreshableState { _ManufacturerPartDisplayState(); + int parameterCount = 0; + int attachmentCount = 0; + @override String getAppBarTitle() => L10().manufacturerPart; @@ -42,7 +49,34 @@ class _ManufacturerPartDisplayState if (!result) { Navigator.of(context).pop(); + return; } + + InvenTreeParameter() + .countParameters( + InvenTreeManufacturerPart.MODEL_TYPE, + widget.manufacturerPart.pk, + ) + .then((value) { + if (mounted) { + setState(() { + parameterCount = value; + }); + } + }); + + InvenTreeAttachment() + .countAttachments( + InvenTreeManufacturerPart.MODEL_TYPE, + widget.manufacturerPart.pk, + ) + .then((value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } + }); } Future editManufacturerPart(BuildContext context) async { @@ -91,11 +125,6 @@ class _ManufacturerPartDisplayState List getTiles(BuildContext context) { List tiles = []; - if (loading) { - tiles.add(progressIndicator()); - return tiles; - } - // Internal Part tiles.add( ListTile( @@ -174,6 +203,31 @@ class _ManufacturerPartDisplayState ); } + ListTile? parameterTile = ShowParametersItem( + context, + InvenTreeManufacturerPart.MODEL_TYPE, + widget.manufacturerPart.pk, + parameterCount, + widget.manufacturerPart.canEdit, + ); + + if (parameterTile != null) { + tiles.add(parameterTile); + } + + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreeManufacturerPart.MODEL_TYPE, + widget.manufacturerPart.pk, + widget.manufacturerPart.MPN, + attachmentCount, + widget.manufacturerPart.canEdit, + ); + + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } } diff --git a/lib/widget/company/supplier_part_detail.dart b/lib/widget/company/supplier_part_detail.dart index 77e29ab4..ed607483 100644 --- a/lib/widget/company/supplier_part_detail.dart +++ b/lib/widget/company/supplier_part_detail.dart @@ -2,6 +2,9 @@ import "package:flutter/material.dart"; import "package:flutter_speed_dial/flutter_speed_dial.dart"; import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/helpers.dart"; +import "package:inventree/inventree/attachment.dart"; +import "package:inventree/inventree/parameter.dart"; +import "package:inventree/widget/attachment_widget.dart"; import "package:inventree/widget/link_icon.dart"; import "package:inventree/app_colors.dart"; @@ -11,6 +14,7 @@ import "package:inventree/barcode/barcode.dart"; import "package:inventree/inventree/part.dart"; import "package:inventree/inventree/company.dart"; +import "package:inventree/widget/parameter_widget.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/refreshable_state.dart"; @@ -35,6 +39,9 @@ class _SupplierPartDisplayState extends RefreshableState { _SupplierPartDisplayState(); + int parameterCount = 0; + int attachmentCount = 0; + @override String getAppBarTitle() => L10().supplierPart; @@ -97,7 +104,34 @@ class _SupplierPartDisplayState if (!result) { Navigator.of(context).pop(); + return; } + + InvenTreeParameter() + .countParameters( + InvenTreeSupplierPart.MODEL_TYPE, + widget.supplierPart.pk, + ) + .then((value) { + if (mounted) { + setState(() { + parameterCount = value; + }); + } + }); + + InvenTreeAttachment() + .countAttachments( + InvenTreeSupplierPart.MODEL_TYPE, + widget.supplierPart.pk, + ) + .then((value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } + }); } /* @@ -286,6 +320,31 @@ class _SupplierPartDisplayState ); } + ListTile? parameterTile = ShowParametersItem( + context, + InvenTreeSupplierPart.MODEL_TYPE, + widget.supplierPart.pk, + parameterCount, + widget.supplierPart.canEdit, + ); + + if (parameterTile != null) { + tiles.add(parameterTile); + } + + ListTile? attachmentTile = ShowAttachmentsItem( + context, + InvenTreeSupplierPart.MODEL_TYPE, + widget.supplierPart.pk, + widget.supplierPart.SKU, + attachmentCount, + widget.supplierPart.canEdit, + ); + + if (attachmentTile != null) { + tiles.add(attachmentTile); + } + return tiles; } } diff --git a/lib/widget/order/purchase_order_detail.dart b/lib/widget/order/purchase_order_detail.dart index 0829e06c..d309a4b3 100644 --- a/lib/widget/order/purchase_order_detail.dart +++ b/lib/widget/order/purchase_order_detail.dart @@ -8,6 +8,7 @@ import "package:inventree/barcode/barcode.dart"; import "package:inventree/barcode/purchase_order.dart"; import "package:inventree/helpers.dart"; import "package:inventree/inventree/attachment.dart"; +import "package:inventree/inventree/parameter.dart"; import "package:inventree/l10.dart"; import "package:inventree/inventree/model.dart"; @@ -22,6 +23,7 @@ import "package:inventree/widget/order/po_line_list.dart"; import "package:inventree/widget/attachment_widget.dart"; import "package:inventree/widget/notes_widget.dart"; +import "package:inventree/widget/parameter_widget.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/widget/snacks.dart"; @@ -51,6 +53,7 @@ class _PurchaseOrderDetailState int completedLines = 0; int attachmentCount = 0; + int parameterCount = 0; bool showCameraShortcut = true; bool supportProjectCodes = false; @@ -300,6 +303,16 @@ class _PurchaseOrderDetailState } } + InvenTreeParameter() + .countParameters(InvenTreePurchaseOrder.MODEL_TYPE, widget.order.pk) + .then((int value) { + if (mounted) { + setState(() { + parameterCount = value; + }); + } + }); + InvenTreeAttachment() .countAttachments(InvenTreePurchaseOrder.MODEL_TYPE, widget.order.pk) .then((int value) { @@ -570,6 +583,18 @@ class _PurchaseOrderDetailState ), ); + ListTile? parameterTile = ShowParametersItem( + context, + InvenTreePurchaseOrder.MODEL_TYPE, + widget.order.pk, + parameterCount, + widget.order.canEdit, + ); + + if (parameterTile != null) { + tiles.add(parameterTile); + } + ListTile? attachmentTile = ShowAttachmentsItem( context, InvenTreePurchaseOrder.MODEL_TYPE, diff --git a/lib/widget/order/sales_order_detail.dart b/lib/widget/order/sales_order_detail.dart index 30692f2b..79a3620b 100644 --- a/lib/widget/order/sales_order_detail.dart +++ b/lib/widget/order/sales_order_detail.dart @@ -5,12 +5,14 @@ import "package:inventree/barcode/barcode.dart"; import "package:inventree/barcode/sales_order.dart"; import "package:inventree/inventree/attachment.dart"; import "package:inventree/inventree/company.dart"; +import "package:inventree/inventree/parameter.dart"; import "package:inventree/inventree/sales_order.dart"; import "package:inventree/preferences.dart"; import "package:inventree/widget/link_icon.dart"; import "package:inventree/widget/order/so_extra_line_list.dart"; import "package:inventree/widget/order/so_line_list.dart"; import "package:inventree/widget/order/so_shipment_list.dart"; +import "package:inventree/widget/parameter_widget.dart"; import "package:inventree/widget/refreshable_state.dart"; import "package:inventree/l10.dart"; @@ -43,6 +45,7 @@ class _SalesOrderDetailState extends RefreshableState { bool showCameraShortcut = true; bool supportsProjectCodes = false; int attachmentCount = 0; + int parameterCount = 0; @override String getAppBarTitle() { @@ -271,6 +274,16 @@ class _SalesOrderDetailState extends RefreshableState { true, ); + InvenTreeParameter() + .countParameters(InvenTreeSalesOrder.MODEL_TYPE, widget.order.pk) + .then((int value) { + if (mounted) { + setState(() { + parameterCount = value; + }); + } + }); + InvenTreeAttachment() .countAttachments(InvenTreeSalesOrder.MODEL_TYPE, widget.order.pk) .then((int value) { @@ -497,6 +510,18 @@ class _SalesOrderDetailState extends RefreshableState { ), ); + ListTile? parameterTile = ShowParametersItem( + context, + InvenTreeSalesOrder.MODEL_TYPE, + widget.order.pk, + parameterCount, + widget.order.canEdit, + ); + + if (parameterTile != null) { + tiles.add(parameterTile); + } + ListTile? attachmentTile = ShowAttachmentsItem( context, InvenTreeSalesOrder.MODEL_TYPE, diff --git a/lib/widget/part/part_parameter_widget.dart b/lib/widget/parameter_widget.dart similarity index 58% rename from lib/widget/part/part_parameter_widget.dart rename to lib/widget/parameter_widget.dart index c4df1890..07a38fcd 100644 --- a/lib/widget/part/part_parameter_widget.dart +++ b/lib/widget/parameter_widget.dart @@ -1,8 +1,12 @@ import "package:flutter/material.dart"; +import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; +import "package:inventree/api.dart"; +import "package:inventree/app_colors.dart"; import "package:inventree/inventree/model.dart"; +import "package:inventree/inventree/parameter.dart"; import "package:inventree/l10.dart"; -import "package:inventree/inventree/part.dart"; +import "package:inventree/widget/link_icon.dart"; import "package:inventree/widget/paginator.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/refreshable_state.dart"; @@ -10,16 +14,18 @@ import "package:inventree/widget/refreshable_state.dart"; /* * Widget for displaying a list of parameters associated with a given Part instance */ -class PartParameterWidget extends StatefulWidget { - const PartParameterWidget(this.part); +class ParameterWidget extends StatefulWidget { + const ParameterWidget(this.modelType, this.modelId, this.editable) : super(); - final InvenTreePart part; + final String modelType; + final int modelId; + final bool editable; @override _ParameterWidgetState createState() => _ParameterWidgetState(); } -class _ParameterWidgetState extends RefreshableState { +class _ParameterWidgetState extends RefreshableState { _ParameterWidgetState(); @override @@ -34,9 +40,16 @@ class _ParameterWidgetState extends RefreshableState { @override Widget getBody(BuildContext context) { - Map filters = {"part": widget.part.pk.toString()}; + Map filters = { + "model_type": widget.modelType, + "model_id": widget.modelId.toString(), + }; - return Column(children: [Expanded(child: PaginatedParameterList(filters))]); + return Column( + children: [ + Expanded(child: PaginatedParameterList(filters, widget.editable)), + ], + ); } } @@ -44,9 +57,11 @@ class _ParameterWidgetState extends RefreshableState { * Widget for displaying a paginated list of Part parameters */ class PaginatedParameterList extends PaginatedSearchWidget { - const PaginatedParameterList(Map filters) + const PaginatedParameterList(Map filters, this.editable) : super(filters: filters); + final bool editable; + @override String get searchTitle => L10().parameters; @@ -75,7 +90,7 @@ class _PaginatedParameterState int offset, Map params, ) async { - final page = await InvenTreePartParameter().listPaginated( + final page = await InvenTreeParameter().listPaginated( limit, offset, filters: params, @@ -84,7 +99,7 @@ class _PaginatedParameterState return page; } - Future editParameter(InvenTreePartParameter parameter) async { + Future editParameter(InvenTreeParameter parameter) async { // Checkbox values are handled separately if (parameter.is_checkbox) { return; @@ -101,7 +116,7 @@ class _PaginatedParameterState @override Widget buildItem(BuildContext context, InvenTreeModel model) { - InvenTreePartParameter parameter = model as InvenTreePartParameter; + InvenTreeParameter parameter = model as InvenTreeParameter; String title = parameter.name; @@ -116,7 +131,7 @@ class _PaginatedParameterState ? Switch( value: parameter.as_bool, onChanged: (bool value) { - if (parameter.canEdit) { + if (widget.editable) { showLoadingOverlay(); parameter.update(values: {"data": value.toString()}).then(( value, @@ -131,10 +146,47 @@ class _PaginatedParameterState onTap: parameter.is_checkbox ? null : () async { - if (parameter.canEdit) { + if (widget.editable) { editParameter(parameter); } }, ); } } + +/* + * Return a ListTile to display parameters for the specified model + */ +ListTile? ShowParametersItem( + BuildContext context, + String modelType, + int modelId, + int parameterCount, + bool editable, +) { + // Note: Currently cannot add parameters from the app, + // So, if there are no parameters, do not show the item + if (parameterCount == 0) { + return null; + } + + if (!InvenTreeAPI().supportsModernParameters) { + return null; + } + + return ListTile( + title: Text(L10().parameters), + leading: Icon(TablerIcons.list_details, color: COLOR_ACTION), + trailing: LinkIcon( + text: parameterCount > 0 ? parameterCount.toString() : null, + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ParameterWidget(modelType, modelId, editable), + ), + ); + }, + ); +} diff --git a/lib/widget/part/part_detail.dart b/lib/widget/part/part_detail.dart index 30b697c4..73a299f8 100644 --- a/lib/widget/part/part_detail.dart +++ b/lib/widget/part/part_detail.dart @@ -5,6 +5,7 @@ import "package:flutter_tabler_icons/flutter_tabler_icons.dart"; import "package:inventree/app_colors.dart"; import "package:inventree/barcode/barcode.dart"; import "package:inventree/inventree/attachment.dart"; +import "package:inventree/inventree/parameter.dart"; import "package:inventree/l10.dart"; import "package:inventree/helpers.dart"; @@ -16,10 +17,10 @@ import "package:inventree/preferences.dart"; import "package:inventree/widget/attachment_widget.dart"; import "package:inventree/widget/link_icon.dart"; +import "package:inventree/widget/parameter_widget.dart"; import "package:inventree/widget/part/bom_list.dart"; import "package:inventree/widget/part/part_list.dart"; import "package:inventree/widget/notes_widget.dart"; -import "package:inventree/widget/part/part_parameter_widget.dart"; import "package:inventree/widget/part/part_pricing.dart"; import "package:inventree/widget/progress.dart"; import "package:inventree/widget/part/category_display.dart"; @@ -50,13 +51,11 @@ class _PartDisplayState extends RefreshableState { InvenTreeStockLocation? defaultLocation; - int parameterCount = 0; - bool allowLabelPrinting = false; - bool showParameters = false; bool showBom = false; bool showPricing = false; + int parameterCount = 0; int attachmentCount = 0; int bomCount = 0; int usedInCount = 0; @@ -153,10 +152,6 @@ class _PartDisplayState extends RefreshableState { INV_PART_SHOW_PRICING, true, ); - showParameters = await InvenTreeSettingsManager().getBool( - INV_PART_SHOW_PARAMETERS, - true, - ); showBom = await InvenTreeSettingsManager().getBool(INV_PART_SHOW_BOM, true); allowLabelPrinting = await InvenTreeSettingsManager().getBool( INV_ENABLE_LABEL_PRINTING, @@ -213,15 +208,30 @@ class _PartDisplayState extends RefreshableState { } // Request the number of attachments - InvenTreeAttachment() - .countAttachments(InvenTreePart.MODEL_TYPE, part.pk) - .then((int value) { - if (mounted) { - setState(() { - attachmentCount = value; - }); - } - }); + if (api.supportsModernAttachments) { + InvenTreeAttachment() + .countAttachments(InvenTreePart.MODEL_TYPE, part.pk) + .then((int value) { + if (mounted) { + setState(() { + attachmentCount = value; + }); + } + }); + } + + // Request the number of parameters + if (api.supportsModernParameters) { + InvenTreeParameter() + .countParameters(InvenTreePart.MODEL_TYPE, part.pk) + .then((int value) { + if (mounted) { + setState(() { + parameterCount = value; + }); + } + }); + } // If show pricing information? if (showPricing) { @@ -599,6 +609,18 @@ class _PartDisplayState extends RefreshableState { ), ); + ListTile? parameterTile = ShowParametersItem( + context, + InvenTreePart.MODEL_TYPE, + part.pk, + parameterCount, + part.canEdit, + ); + + if (parameterTile != null) { + tiles.add(parameterTile); + } + ListTile? attachmentTile = ShowAttachmentsItem( context, InvenTreePart.MODEL_TYPE, @@ -705,10 +727,6 @@ class _PartDisplayState extends RefreshableState { List getTabIcons(BuildContext context) { List icons = [Tab(text: L10().details), Tab(text: L10().stock)]; - if (showParameters) { - icons.add(Tab(text: L10().parameters)); - } - return icons; } @@ -721,11 +739,6 @@ class _PartDisplayState extends RefreshableState { ), PaginatedStockItemList({"part": part.pk.toString()}), ]; - - if (showParameters) { - tabs.add(PaginatedParameterList({"part": part.pk.toString()})); - } - return tabs; } } From 571ff1880f91983db03e8098a5f20f58ec9b6703 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 6 Dec 2025 11:24:17 +1100 Subject: [PATCH 05/10] New translations app_en.arb (Chinese Simplified) (#739) --- lib/l10n/zh_CN/app_zh_CN.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/zh_CN/app_zh_CN.arb b/lib/l10n/zh_CN/app_zh_CN.arb index edb54e2c..876f122d 100644 --- a/lib/l10n/zh_CN/app_zh_CN.arb +++ b/lib/l10n/zh_CN/app_zh_CN.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "条形码扫描已暂停", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "点击或按住以暂停扫描", "@barcodeScanPause": {}, "barcodeScanAssign": "扫描以分配条形码", "@barcodeScanAssign": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "关键词", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "标签打印机", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "选择标签打印机", "@labelSelectDriver": {}, "labelPrinting": "打印标签", "@labelPrinting": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "创建新库存地点", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "默认库存地点", "@locationDefault": {}, "locationNotSet": "没有指定仓储位置", "@locationNotSet": {}, From 8c15bdafdf9aeb03be2c43e2b68794d345dbca96 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 19 Dec 2025 09:52:38 +1100 Subject: [PATCH 06/10] New Crowdin updates (#740) * New translations app_en.arb (Hungarian) * New translations app_en.arb (Hungarian) * New translations app_en.arb (Dutch) * New translations app_en.arb (Dutch) * New translations app_en.arb (Swedish) * New translations app_en.arb (Ukrainian) * New translations app_en.arb (Ukrainian) * New translations app_en.arb (German) * New translations app_en.arb (Turkish) * New translations app_en.arb (Italian) * New translations app_en.arb (Turkish) * New translations app_en.arb (Turkish) * New translations app_en.arb (Romanian) --- lib/l10n/de_DE/app_de_DE.arb | 30 +++++------ lib/l10n/hu_HU/app_hu_HU.arb | 52 +++++++++--------- lib/l10n/it_IT/app_it_IT.arb | 6 +-- lib/l10n/nl_NL/app_nl_NL.arb | 52 +++++++++--------- lib/l10n/ro_RO/app_ro_RO.arb | 16 +++--- lib/l10n/sv_SE/app_sv_SE.arb | 30 +++++------ lib/l10n/tr_TR/app_tr_TR.arb | 72 ++++++++++++------------- lib/l10n/uk_UA/app_uk_UA.arb | 102 +++++++++++++++++------------------ 8 files changed, 180 insertions(+), 180 deletions(-) diff --git a/lib/l10n/de_DE/app_de_DE.arb b/lib/l10n/de_DE/app_de_DE.arb index dc075efa..e0bb95c4 100644 --- a/lib/l10n/de_DE/app_de_DE.arb +++ b/lib/l10n/de_DE/app_de_DE.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Barcode-Scannen angehalten", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Tippen um das Scannen zu pausieren", "@barcodeScanPause": {}, "barcodeScanAssign": "Scannen um Barcode zuzuweisen", "@barcodeScanAssign": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Schlüsselwörter", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Etikettendrucker Treiber", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Etikettendrucker Treiber auswählen", "@labelSelectDriver": {}, "labelPrinting": "Etikettendruck", "@labelPrinting": {}, @@ -944,29 +944,29 @@ "@shipment": {}, "shipments": "Lieferungen", "@shipments": {}, - "shipmentsPending": "Ausstehende Sendungen", + "shipmentsPending": "Ausstehende Lieferungen", "@shipmentsPending": {}, "shipmentAdd": "Lieferung hinzufügen", "@shipmentAdd": {}, - "shipmentCheck": "Sendung prüfen", + "shipmentCheck": "Lieferung überprüfen", "@shipmentCheck": {}, - "shipmentCheckDetail": "Diese Sendung als geprüft markieren", + "shipmentCheckDetail": "Diese Lieferung als geprüft markieren", "@shipmentCheckDetail": {}, - "shipmentChecked": "Sendung geprüft", + "shipmentChecked": "Lieferung überprüft", "@shipmentChecked": {}, "shipmentDate": "Versanddatum", "@shipmentDate": {}, - "shipmentEdit": "Sendung bearbeiten", + "shipmentEdit": "Lieferung bearbeiten", "@shipmentEdit": {}, - "shipmentReference": "Shipment Reference", + "shipmentReference": "Sendungsreferenz", "@shipmentReference": {}, "shipmentSend": "Lieferung versenden", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Lieferung ungeprüft markieren", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "Diese Lieferung als ungeprüft markieren", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "Lieferung Aktualisiert", "@shipmentUpdated": {}, "shipped": "Versandt", "@shipped": {}, @@ -1102,7 +1102,7 @@ "@timeout": { "description": "" }, - "toggleTorch": "Toggle Torch", + "toggleTorch": "Taschenlampe umschalten", "@toggleTorch": {}, "tokenError": "Token-Fehler", "@tokenError": {}, @@ -1182,7 +1182,7 @@ "@priceRange": {}, "priceOverrideMin": "Mindestpreis überschreiben", "@priceOverrideMin": {}, - "priceOverrideMax": "Maximum Price Override", + "priceOverrideMax": "Maximalen Preis ignorieren", "@priceOverrideMax": {}, "salePrice": "Verkaufspreis", "@salePrice": {}, @@ -1198,7 +1198,7 @@ "@variantCost": {}, "overallPricing": "Gesamt Preise", "@overallPricing": {}, - "pricingOverrides": "Pricing Overrides", + "pricingOverrides": "Preisgestaltung ignorieren", "@pricingOverrides": {}, "currency": "Währung", "@currency": {}, diff --git a/lib/l10n/hu_HU/app_hu_HU.arb b/lib/l10n/hu_HU/app_hu_HU.arb index 3286dfae..509d9d2a 100644 --- a/lib/l10n/hu_HU/app_hu_HU.arb +++ b/lib/l10n/hu_HU/app_hu_HU.arb @@ -46,7 +46,7 @@ "@aspectRatioSquare": {}, "allocateStock": "Készlet foglalása", "@allocateStock": {}, - "allocatedStock": "Allocated Stock", + "allocatedStock": "Lefoglalt Készlet", "@allocatedStock": {}, "appReleaseNotes": "Kiadási közlemények", "@appReleaseNotes": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Vonalkód olvasás megállítva", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Érintse meg a szkennelés szüneteltetéséhez", "@barcodeScanPause": {}, "barcodeScanAssign": "Kódolvasás a hozzárendeléshez", "@barcodeScanAssign": {}, @@ -240,7 +240,7 @@ "@deletePartDetail": {}, "deleteSuccess": "Törlés sikeres", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "Szállítási Dátum", "@deliveryDate": {}, "description": "Leírás", "@description": {}, @@ -384,9 +384,9 @@ "@homeShowPo": {}, "homeShowPoDescription": "Beszerzési rendelések gomb megjelenítése a főoldalon", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "Szállítmányok Mutatása", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "Függőben lévő szállítmányok megjelenítése a kezdőképernyőn", "@homeShowShipmentsDescription": {}, "homeShowSo": "Vevői rendelések megmutatása", "@homeShowSo": {}, @@ -454,9 +454,9 @@ "@invalidSupplierPart": {}, "invalidUsernamePassword": "Érvénytelen felhasználónév/jelszó kombináció", "@invalidUsernamePassword": {}, - "invoice": "Invoice", + "invoice": "Számla", "@invoice": {}, - "invoiceNumber": "Invoice Number", + "invoiceNumber": "Számlaszám", "@invoiceNumber": {}, "issue": "Kiküldés", "@issue": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Kulcsszavak", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Címke Meghajtó", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Címkenyomtató Meghajtó Kiválasztása", "@labelSelectDriver": {}, "labelPrinting": "Címke nyomtatás", "@labelPrinting": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "Új készlet hely létrehozása", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Alapértelmezett Hely", "@locationDefault": {}, "locationNotSet": "Nincs megadva hely", "@locationNotSet": {}, @@ -544,7 +544,7 @@ "@missingData": {}, "name": "Név", "@name": {}, - "no": "No", + "no": "Nem", "@no": {}, "notApplicable": "N/A", "@notApplicable": {}, @@ -660,7 +660,7 @@ "@password": {}, "passwordEmpty": "Jelszó nem lehet üres", "@passwordEmpty": {}, - "pending": "Pending", + "pending": "Függőben", "@pending": {}, "permissionAccountDenied": "Nincs meg a szükséges jogosultságod, hogy végrehajtsd ezt a műveletet", "@permissionAccountDenied": {}, @@ -940,33 +940,33 @@ "@serverNotConnected": {}, "serverNotSelected": "Nincs kiszolgáló választva", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "Szállítmány", "@shipment": {}, "shipments": "Szállítmányok", "@shipments": {}, - "shipmentsPending": "Pending Shipments", + "shipmentsPending": "Függőben Lévő Szállítmányok", "@shipmentsPending": {}, "shipmentAdd": "Szállítmány hozzáadása", "@shipmentAdd": {}, - "shipmentCheck": "Check Shipment", + "shipmentCheck": "Szállítmány Ellenőrzése", "@shipmentCheck": {}, - "shipmentCheckDetail": "Mark this shipment as checked", + "shipmentCheckDetail": "Jelölje meg ezt a szállítmányt ellenőrzöttként", "@shipmentCheckDetail": {}, - "shipmentChecked": "Shipment Checked", + "shipmentChecked": "Szállítmány Ellenőrizve", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "Szállítmány Dátuma", "@shipmentDate": {}, - "shipmentEdit": "Edit Shipment", + "shipmentEdit": "Szállítmány Szerkesztése", "@shipmentEdit": {}, - "shipmentReference": "Shipment Reference", + "shipmentReference": "Szállítmány Hivatkozás", "@shipmentReference": {}, - "shipmentSend": "Send Shipment", + "shipmentSend": "Szállítmány Küldése", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Szállítmány Ellenőrzés Visszavonása", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "Jelölje meg ezt a szállítmányt nem ellenőrzöttként", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "Szállítmány Frissítve", "@shipmentUpdated": {}, "shipped": "Kiszállítva", "@shipped": {}, @@ -1112,7 +1112,7 @@ "@tokenMissingFromResponse": {}, "totalPrice": "Teljes ár", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "Nyomkövetési Szám", "@trackingNumber": {}, "transfer": "Áthelyezés", "@transfer": { @@ -1174,7 +1174,7 @@ "@viewSupplierPart": {}, "website": "Weboldal", "@website": {}, - "yes": "Yes", + "yes": "Igen", "@yes": {}, "price": "Ár", "@price": {}, diff --git a/lib/l10n/it_IT/app_it_IT.arb b/lib/l10n/it_IT/app_it_IT.arb index db6286ab..ecbe8b11 100644 --- a/lib/l10n/it_IT/app_it_IT.arb +++ b/lib/l10n/it_IT/app_it_IT.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Scansione codice a barre in pausa", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Tocca per mettere in pausa la scansione", "@barcodeScanPause": {}, "barcodeScanAssign": "Scansiona per assegnare codice a barre", "@barcodeScanAssign": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Parole Chiave", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Driver Etichetta", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Seleziona Il Driver Della Stampante Etichette", "@labelSelectDriver": {}, "labelPrinting": "Etichetta in stampa", "@labelPrinting": {}, diff --git a/lib/l10n/nl_NL/app_nl_NL.arb b/lib/l10n/nl_NL/app_nl_NL.arb index d8eab7d2..ba457583 100644 --- a/lib/l10n/nl_NL/app_nl_NL.arb +++ b/lib/l10n/nl_NL/app_nl_NL.arb @@ -46,7 +46,7 @@ "@aspectRatioSquare": {}, "allocateStock": "Voorraad Toewijzen", "@allocateStock": {}, - "allocatedStock": "Allocated Stock", + "allocatedStock": "Toegewezen voorraad", "@allocatedStock": {}, "appReleaseNotes": "App release notities weergeven", "@appReleaseNotes": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Barcode scannen gepauzeerd", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Klik om scannen te pauzeren", "@barcodeScanPause": {}, "barcodeScanAssign": "Scan om streepjescode toe te wijzen", "@barcodeScanAssign": {}, @@ -240,7 +240,7 @@ "@deletePartDetail": {}, "deleteSuccess": "Succesvol verwijderd", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "Leveringsdatum", "@deliveryDate": {}, "description": "Omschrijving", "@description": {}, @@ -384,9 +384,9 @@ "@homeShowPo": {}, "homeShowPoDescription": "Inkooporder knop op startscherm weergeven", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "Verzending weergeven", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "Toon Leveringen in afwachting op het startscherm", "@homeShowShipmentsDescription": {}, "homeShowSo": "Toon Verkooporders", "@homeShowSo": {}, @@ -454,9 +454,9 @@ "@invalidSupplierPart": {}, "invalidUsernamePassword": "Ongeldige gebruikersnaam / wachtwoord combinatie", "@invalidUsernamePassword": {}, - "invoice": "Invoice", + "invoice": "Factuur", "@invoice": {}, - "invoiceNumber": "Invoice Number", + "invoiceNumber": "Factuur nummer", "@invoiceNumber": {}, "issue": "Probleem", "@issue": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Trefwoorden", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Label printer", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Selecteer Label Printer Driver", "@labelSelectDriver": {}, "labelPrinting": "Label afdrukken", "@labelPrinting": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "Creëer nieuwe voorraadlocatie", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Standaard locatie", "@locationDefault": {}, "locationNotSet": "Geen locatie opgegeven", "@locationNotSet": {}, @@ -544,9 +544,9 @@ "@missingData": {}, "name": "Naam", "@name": {}, - "no": "No", + "no": "Nee", "@no": {}, - "notApplicable": "N/A", + "notApplicable": "N.v.t. ", "@notApplicable": {}, "notConnected": "Niet verbonden", "@notConnected": {}, @@ -660,7 +660,7 @@ "@password": {}, "passwordEmpty": "Wachtwoord mag niet leeg zijn", "@passwordEmpty": {}, - "pending": "Pending", + "pending": "In behandeling", "@pending": {}, "permissionAccountDenied": "U heeft niet de vereiste rechten om deze actie uit te voeren", "@permissionAccountDenied": {}, @@ -940,33 +940,33 @@ "@serverNotConnected": {}, "serverNotSelected": "Server niet geselecteerd", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "Levering", "@shipment": {}, "shipments": "Verzendingen", "@shipments": {}, - "shipmentsPending": "Pending Shipments", + "shipmentsPending": "Leveringen in behandeling", "@shipmentsPending": {}, "shipmentAdd": "Verzending toevoegen", "@shipmentAdd": {}, - "shipmentCheck": "Check Shipment", + "shipmentCheck": "Controleer Levering", "@shipmentCheck": {}, - "shipmentCheckDetail": "Mark this shipment as checked", + "shipmentCheckDetail": "Markeer deze levering als gecontroleerd", "@shipmentCheckDetail": {}, - "shipmentChecked": "Shipment Checked", + "shipmentChecked": "Levering gecontroleerd", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "Leverings Datum", "@shipmentDate": {}, - "shipmentEdit": "Edit Shipment", + "shipmentEdit": "Wijzig levering", "@shipmentEdit": {}, "shipmentReference": "Shipment Reference", "@shipmentReference": {}, - "shipmentSend": "Send Shipment", + "shipmentSend": "Verzending versturen", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Verzending uitvinken", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "Markeer deze levering als niet gecontroleerd", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "Verzending bijgewerkt", "@shipmentUpdated": {}, "shipped": "Verzonden", "@shipped": {}, @@ -1112,7 +1112,7 @@ "@tokenMissingFromResponse": {}, "totalPrice": "Totaalprijs", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "Traceernummer", "@trackingNumber": {}, "transfer": "Verplaats", "@transfer": { @@ -1174,7 +1174,7 @@ "@viewSupplierPart": {}, "website": "Website", "@website": {}, - "yes": "Yes", + "yes": "Ja", "@yes": {}, "price": "Prijs", "@price": {}, diff --git a/lib/l10n/ro_RO/app_ro_RO.arb b/lib/l10n/ro_RO/app_ro_RO.arb index ff74b986..6f07c0dc 100644 --- a/lib/l10n/ro_RO/app_ro_RO.arb +++ b/lib/l10n/ro_RO/app_ro_RO.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Scanare cod de bare întreruptă", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Atingeți pentru a întrerupe scanarea", "@barcodeScanPause": {}, "barcodeScanAssign": "Scanează pentru a atribui cod de bare", "@barcodeScanAssign": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Cuvinte cheie", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Etichetează șofer", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Selectați șofer de imprimante etichetă", "@labelSelectDriver": {}, "labelPrinting": "Printare etichete", "@labelPrinting": {}, @@ -822,17 +822,17 @@ "@response504": {}, "response505": "Versiunea HTTP nu este suportată", "@response505": {}, - "responseData": "Response data", + "responseData": "Date Răspuns", "@responseData": {}, - "responseInvalid": "Invalid Response Code", + "responseInvalid": "Cod de răspuns nevalid", "@responseInvalid": {}, - "responseUnknown": "Unknown Response", + "responseUnknown": "Răspuns necunoscut", "@responseUnknown": {}, - "result": "Result", + "result": "Rezultat", "@result": { "description": "" }, - "returned": "Returned", + "returned": "Returnat", "@returned": {}, "salesOrder": "Sales Order", "@salesOrder": {}, diff --git a/lib/l10n/sv_SE/app_sv_SE.arb b/lib/l10n/sv_SE/app_sv_SE.arb index ae837a46..88d8b85f 100644 --- a/lib/l10n/sv_SE/app_sv_SE.arb +++ b/lib/l10n/sv_SE/app_sv_SE.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Streckkodsskanning pausad", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Tryck för att pausa skanning", "@barcodeScanPause": {}, "barcodeScanAssign": "Skanna för att tilldela streckkod", "@barcodeScanAssign": {}, @@ -228,7 +228,7 @@ "@delete": {}, "deleteFailed": "Borttagning misslyckades", "@deleteFailed": {}, - "deleteImageConfirmation": "Are you sure you want to delete this image?", + "deleteImageConfirmation": "Är du säker på att du vill radera denna bild?", "@deleteImageConfirmation": {}, "deleteImageTooltip": "Radera bild", "@deleteImageTooltip": {}, @@ -240,7 +240,7 @@ "@deletePartDetail": {}, "deleteSuccess": "Borttagning lyckad", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "Leveransdatum", "@deliveryDate": {}, "description": "Beskrivning", "@description": {}, @@ -384,9 +384,9 @@ "@homeShowPo": {}, "homeShowPoDescription": "Visa knappen för inköpsorder på startskärmen", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "Visa leveranser", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "Visa väntande leveranser på startskärmen", "@homeShowShipmentsDescription": {}, "homeShowSo": "Visa försäljningsorder", "@homeShowSo": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "Skapa ny lagerplats", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Förvald plats", "@locationDefault": {}, "locationNotSet": "Ingen plats specificerad", "@locationNotSet": {}, @@ -564,9 +564,9 @@ "@noResults": {}, "noImageAvailable": "Ingen bild tillgänglig", "@noImageAvailable": {}, - "noPricingAvailable": "No pricing available", + "noPricingAvailable": "Ingen prisinformation tillgänglig", "@noPricingAvailable": {}, - "noPricingDataFound": "No pricing data found for this part", + "noPricingDataFound": "Inga prisuppgifter hittades för denna artikel", "@noPricingDataFound": {}, "noSubcategories": "Inga underkategorier", "@noSubcategories": {}, @@ -630,7 +630,7 @@ "@partsNone": {}, "partNoResults": "Inga artiklar som matchar sökfrågan", "@partNoResults": {}, - "partPricing": "Part Pricing", + "partPricing": "Artikelpris", "@partPricing": {}, "partPricingSettingDetail": "Display part pricing information", "@pricingSettingDetail": {}, @@ -762,7 +762,7 @@ "@reference": {}, "refresh": "Uppdatera", "@refresh": {}, - "rotateClockwise": "Rotate 90° clockwise", + "rotateClockwise": "Rotera 90° medurs", "@rotateClockwise": {}, "refreshing": "Uppdaterar", "@refreshing": {}, @@ -940,7 +940,7 @@ "@serverNotConnected": {}, "serverNotSelected": "Servern är inte vald", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "Försändelse", "@shipment": {}, "shipments": "Frakt", "@shipments": {}, @@ -954,7 +954,7 @@ "@shipmentCheckDetail": {}, "shipmentChecked": "Shipment Checked", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "Leveransdatum", "@shipmentDate": {}, "shipmentEdit": "Edit Shipment", "@shipmentEdit": {}, @@ -1112,7 +1112,7 @@ "@tokenMissingFromResponse": {}, "totalPrice": "Totalpris", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "Sändningsnummer", "@trackingNumber": {}, "transfer": "Överföring", "@transfer": { @@ -1184,11 +1184,11 @@ "@priceOverrideMin": {}, "priceOverrideMax": "Maximum Price Override", "@priceOverrideMax": {}, - "salePrice": "Sale Price", + "salePrice": "Försäljningspris", "@salePrice": {}, "saleHistory": "Sale History", "@saleHistory": {}, - "supplierPricing": "Supplier Pricing", + "supplierPricing": "Leverantörspriser", "@supplierPricing": {}, "bomCost": "BOM Cost", "@bomCost": {}, diff --git a/lib/l10n/tr_TR/app_tr_TR.arb b/lib/l10n/tr_TR/app_tr_TR.arb index dfffe0e6..464d3900 100644 --- a/lib/l10n/tr_TR/app_tr_TR.arb +++ b/lib/l10n/tr_TR/app_tr_TR.arb @@ -48,7 +48,7 @@ "@allocateStock": {}, "allocatedStock": "Tahsis Edilen Stok", "@allocatedStock": {}, - "appReleaseNotes": "Uygulama yayınlama notlarını göster", + "appReleaseNotes": "Uygulama yayınlama notlarını görüntüle", "@appReleaseNotes": {}, "appSettings": "Uygulama Ayarları", "@appSettings": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Barkod tarama duraklatıldı", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Taramayı duraklatmak için dokunun", "@barcodeScanPause": {}, "barcodeScanAssign": "Atanmış barkodu tara", "@barcodeScanAssign": {}, @@ -116,7 +116,7 @@ "@barcodeScanDelayDetail": {}, "barcodeScanGeneral": "Bir InvenTree barkodu tara", "@barcodeScanGeneral": {}, - "barcodeScanInItems": "Stok ögelerini bu konum içine tara", + "barcodeScanInItems": "Stok kalemlerini bu konumun içine tara", "@barcodeScanInItems": {}, "barcodeScanLocation": "Stok konumu tara", "@barcodeScanLocation": {}, @@ -128,7 +128,7 @@ "@barcodeScanIntoLocationSuccess": {}, "barcodeScanIntoLocationFailure": "Madde taranmış değil", "@barcodeScanIntoLocationFailure": {}, - "barcodeScanItem": "Stok öğesi tara", + "barcodeScanItem": "Stok kalemi tara", "@barcodeScanItem": {}, "barcodeTones": "Barkod Tonları", "@barcodeTones": {}, @@ -144,9 +144,9 @@ "@bom": {}, "bomEnable": "Malzeme Listesini Görüntüle", "@bomEnable": {}, - "build": "Oluştur", + "build": "Yap", "@build": {}, - "building": "Oluşturma", + "building": "Yapılıyor", "@building": {}, "cameraCreationError": "Kamera Kontrolcüsü Açılamadı", "@cameraCreationError": {}, @@ -278,7 +278,7 @@ "@editPart": { "description": "edit part" }, - "editItem": "Parçayı Düzenle", + "editItem": "Stok kalemi düzenle", "@editItem": {}, "editLineItem": "Satır Ögesini Düzenle", "@editLineItem": {}, @@ -348,7 +348,7 @@ "@filterInStockDetail": {}, "filterSerialized": "Sıralandırılmış", "@filterSerialized": {}, - "filterSerializedDetail": "Sıralandırılmış stok ürünkerini göster", + "filterSerializedDetail": "Seri numaralı stok kalemlerini göster", "@filterSerializedDetail": {}, "filterTemplate": "Şablon", "@filterTemplate": {}, @@ -414,7 +414,7 @@ "@imageUploadSuccess": {}, "inactive": "Pasif", "@inactive": {}, - "inactiveCompany": "Bu şirket inaktif olarak imlendi", + "inactiveCompany": "Bu şirket pasif olarak imlendi", "@inactiveCompany": {}, "inactiveDetail": "Bu parça pasif olarak işaretlendi", "@inactiveDetail": {}, @@ -434,7 +434,7 @@ "@info": {}, "inProduction": "Yapım Aşamasında", "@inProduction": {}, - "inProductionDetail": "Bu ürün üretim aşamasında", + "inProductionDetail": "Bu stok kalemi üretimdedir", "@inProductionDetail": {}, "internalPart": "İç Parça", "@internalPart": {}, @@ -448,7 +448,7 @@ "@invalidPartCategory": {}, "invalidStockLocation": "Geçersiz Stok Konumu", "@invalidStockLocation": {}, - "invalidStockItem": "Geçersiz Stok Parçası", + "invalidStockItem": "Geçersiz Stok Kalemi", "@invalidStockItem": {}, "invalidSupplierPart": "Geçersiz Tedarikçi Parçası", "@invalidSupplierPart": {}, @@ -474,7 +474,7 @@ "@keywords": {}, "labelDriver": "Label Driver", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Etiket Yazıcı Sürücüsü Seçin", "@labelSelectDriver": {}, "labelPrinting": "Etiket Yazdırma", "@labelPrinting": {}, @@ -492,7 +492,7 @@ "@languageDefault": {}, "languageSelect": "Dil Seçin", "@languageSelect": {}, - "lastStocktake": "Son stok tutma", + "lastStocktake": "Son Stok Sayımı", "@lastStocktake": {}, "lastUpdated": "Son güncelleme", "@lastUpdated": {}, @@ -506,7 +506,7 @@ "@lineItems": {}, "lineItemUpdated": "Satır ögesi güncellendi", "@lineItemUpdated": {}, - "locateItem": "Stok ögesi bul", + "locateItem": "Stok kalemi bul", "@locateItem": {}, "locateLocation": "Stok konumu bul", "@locateLocation": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "Yeni stok konumu oluştur", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Varsayılan Konum", "@locationDefault": {}, "locationNotSet": "Belirtilmiş konum yok", "@locationNotSet": {}, @@ -602,7 +602,7 @@ "@packageName": {}, "parameters": "Parametreler", "@parameters": {}, - "parametersSettingDetail": "Parça parametrelerini göster", + "parametersSettingDetail": "Parça parametrelerini görüntüle", "@parametersSettingDetail": {}, "parent": "Üst", "@parent": {}, @@ -712,7 +712,7 @@ "@purchaseOrderConfirmScan": {}, "purchaseOrderConfirmScanDetail": "Taranan Ürünlerin Detaylarını Onayla", "@purchaseOrderConfirmScanDetail": {}, - "purchaseOrderEnable": "Satın Alma Emirlerini Etkinleştir", + "purchaseOrderEnable": "Satın Alma Siparişlerini Etkinleştir", "@purchaseOrderEnable": {}, "purchaseOrderEnableDetail": "Satın Alma Emirlerinin İşlevselliğini Etkinleştir", "@purchaseOrderEnableDetail": {}, @@ -728,7 +728,7 @@ "@purchaseOrderEdit": {}, "purchaseOrderSettings": "Satın Alma Emri Ayarları", "@purchaseOrderSettings": {}, - "purchaseOrders": "Satınalma Siparişleri", + "purchaseOrders": "Satın Alma Siparişleri", "@purchaseOrders": {}, "purchaseOrderUpdated": "Satın Alma Siparişi güncellendi", "@purchaseOrderUpdated": {}, @@ -756,7 +756,7 @@ "@receivedFilterDetail": {}, "receiveItem": "Alınan Öğeler", "@receiveItem": {}, - "receivedItem": "Alınan stok parçaları", + "receivedItem": "Alınan stok kalemleri", "@receivedItem": {}, "reference": "Referans", "@reference": {}, @@ -838,7 +838,7 @@ "@salesOrder": {}, "salesOrders": "Satış Siparişleri", "@salesOrders": {}, - "salesOrderEnable": "Satış Emirlerini Etkinleştir", + "salesOrderEnable": "Satış Siparişlerini Etkinleştir", "@salesOrderEnable": {}, "salesOrderEnableDetail": "Satış Siparişlerinin İşlevselliğini Etkinleştir", "@salesOrderEnableDetail": {}, @@ -860,7 +860,7 @@ }, "scanBarcode": "Barkod Tara", "@scanBarcode": {}, - "scanSupplierPart": "Sağlayıcı parça barkodunu tara", + "scanSupplierPart": "Tedarikçi parça barkodunu tara", "@scanSupplierPart": {}, "scanIntoLocation": "Konuma Tara", "@scanIntoLocation": {}, @@ -998,25 +998,25 @@ "@stockItems": {}, "stockItemCreate": "Yeni Stok Kalemi", "@stockItemCreate": {}, - "stockItemCreateDetail": "Bu konuma yeni stok kalemi oluştur", + "stockItemCreateDetail": "Bu konumda yeni stok kalemi oluştur", "@stockItemCreateDetail": {}, "stockItemDelete": "Stok parçasını sil", "@stockItemDelete": {}, - "stockItemDeleteConfirm": "Bu stock ögesini silmek istediğinize emin misiniz?", + "stockItemDeleteConfirm": "Bu stok kalemini silmek istediğinize emin misiniz?", "@stockItemDeleteConfirm": {}, - "stockItemDeleteFailure": "Stok parçası silinemedi", + "stockItemDeleteFailure": "Stok kalemi silinemedi", "@stockItemDeleteFailure": {}, - "stockItemDeleteSuccess": "Stok ögesi silindi", + "stockItemDeleteSuccess": "Stok kalemi silindi", "@stockItemDeleteSuccess": {}, "stockItemHistory": "Stok Geçmişi", "@stockItemHistory": {}, - "stockItemHistoryDetail": "Geçmiş stok takip bilgisini göster", + "stockItemHistoryDetail": "Geçmiş stok takip bilgisini görüntüle", "@stockItemHistoryDetail": {}, - "stockItemTransferred": "Stok ögesi aktarıldı", + "stockItemTransferred": "Stok kalemi aktarıldı", "@stockItemTransferred": {}, - "stockItemUpdated": "Stok ögesi güncellendi", + "stockItemUpdated": "Stok kalemi güncellendi", "@stockItemUpdated": {}, - "stockItemsNotAvailable": "Kullanılabilir stok ögesi yok", + "stockItemsNotAvailable": "Stok kalemi bulunmamaktadır", "@stockItemsNotAvailable": {}, "stockItemNotes": "Stok Kalemi Notları", "@stockItemNotes": {}, @@ -1056,11 +1056,11 @@ "@supplier": {}, "supplierPart": "Tedarikçi Parçası", "@supplierPart": {}, - "supplierPartEdit": "Sağlayıcı Parçasını Düzenle", + "supplierPartEdit": "Tedarikçi Parçasını Düzenle", "@supplierPartEdit": {}, - "supplierPartNumber": "Sağlayıcı Parça Numarası", + "supplierPartNumber": "Tedarikçi Parça Numarası", "@supplierPartNumber": {}, - "supplierPartUpdated": "Sağlayıcı Parçası Güncellendi", + "supplierPartUpdated": "Tedarikçi Parçası Güncellendi", "@supplierPartUpdated": {}, "supplierParts": "Tedarikçi Parçaları", "@supplierParts": {}, @@ -1086,7 +1086,7 @@ "@testResults": { "description": "" }, - "testResultsDetail": "Stok ögesi test sonuçlarını görüntüle", + "testResultsDetail": "Stok kalemi test sonuçlarını görüntüle", "@testResultsDetail": {}, "testResultAdd": "Test Sonucu Ekle", "@testResultAdd": {}, @@ -1166,7 +1166,7 @@ "@valueCannotBeEmpty": {}, "valueRequired": "Değer gereklidir", "@valueRequired": {}, - "variants": "Türevler", + "variants": "Varyantlar", "@variants": {}, "version": "Sürüm", "@version": {}, @@ -1188,13 +1188,13 @@ "@salePrice": {}, "saleHistory": "Satış Geçmişi", "@saleHistory": {}, - "supplierPricing": "Sağlayıcı Fiyatlandırması", + "supplierPricing": "Tedarikçi Fiyatlandırması", "@supplierPricing": {}, "bomCost": "BoM Maliyeti", "@bomCost": {}, "internalCost": "Dahili Maliyet", "@internalCost": {}, - "variantCost": "Türev Maliyeti", + "variantCost": "Varyant Maliyeti", "@variantCost": {}, "overallPricing": "Genel Fiyatlandırma", "@overallPricing": {}, diff --git a/lib/l10n/uk_UA/app_uk_UA.arb b/lib/l10n/uk_UA/app_uk_UA.arb index 5eb5c487..da21c3af 100644 --- a/lib/l10n/uk_UA/app_uk_UA.arb +++ b/lib/l10n/uk_UA/app_uk_UA.arb @@ -46,7 +46,7 @@ "@aspectRatioSquare": {}, "allocateStock": "Виділити запас", "@allocateStock": {}, - "allocatedStock": "Allocated Stock", + "allocatedStock": "Виділений Запас", "@allocatedStock": {}, "appReleaseNotes": "Показати примітки до випуску", "@appReleaseNotes": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Сканування штрих-кодів призупинено", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Торкніться або утримуйте, щоб призупинити сканування", "@barcodeScanPause": {}, "barcodeScanAssign": "Сканувати щоб призначити штрих-код", "@barcodeScanAssign": {}, @@ -228,11 +228,11 @@ "@delete": {}, "deleteFailed": "Помилка видалення", "@deleteFailed": {}, - "deleteImageConfirmation": "Are you sure you want to delete this image?", + "deleteImageConfirmation": "Ви дійсно хочете видалити це зображення?", "@deleteImageConfirmation": {}, - "deleteImageTooltip": "Delete Image", + "deleteImageTooltip": "Видалити Зображення", "@deleteImageTooltip": {}, - "deleteImage": "Delete Image", + "deleteImage": "Видалити Зображення", "@deleteImage": {}, "deletePart": "Видалити деталь", "@deletePart": {}, @@ -240,7 +240,7 @@ "@deletePartDetail": {}, "deleteSuccess": "Операція видалення пройшла успішно", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "Дата Доставки", "@deliveryDate": {}, "description": "Опис", "@description": {}, @@ -384,9 +384,9 @@ "@homeShowPo": {}, "homeShowPoDescription": "Показувати кнопку замовлення на домашньому екрані", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "Показати відправлення", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "Показати відкладені відправлення на головному екрані", "@homeShowShipmentsDescription": {}, "homeShowSo": "Показати замовлення", "@homeShowSo": {}, @@ -454,15 +454,15 @@ "@invalidSupplierPart": {}, "invalidUsernamePassword": "Неправильна комбінація імені користувача та пароля", "@invalidUsernamePassword": {}, - "invoice": "Invoice", + "invoice": "Інвойс", "@invoice": {}, - "invoiceNumber": "Invoice Number", + "invoiceNumber": "Номер Інвойсу", "@invoiceNumber": {}, - "issue": "Issue", + "issue": "Видача", "@issue": {}, - "issueDate": "Issue Date", + "issueDate": "Дата Видачі", "@issueDate": {}, - "issueOrder": "Issue Order", + "issueOrder": "Оформити Замовлення", "@issueOrder": {}, "itemInLocation": "Товар вже на місці", "@itemInLocation": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "Ключові слова", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Драйвер Етикеток", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Вибрати Драйвер Принтера Етикеток", "@labelSelectDriver": {}, "labelPrinting": "Друк Ярликів", "@labelPrinting": {}, @@ -482,9 +482,9 @@ "@labelPrintingDetail": {}, "labelTemplate": "Шаблон Ярлика", "@labelTemplate": {}, - "labelSelectTemplate": "Select Label Template", + "labelSelectTemplate": "Вибрати Шаблон Етикетки", "@labelSelectTemplate": {}, - "labelSelectPrinter": "Select Label Printer", + "labelSelectPrinter": "Вибрати Принтер Етикеток", "@labelSelectPrinter": {}, "language": "Мова", "@language": {}, @@ -492,19 +492,19 @@ "@languageDefault": {}, "languageSelect": "Вибір мови", "@languageSelect": {}, - "lastStocktake": "Last Stocktake", + "lastStocktake": "Остання інвентаризація", "@lastStocktake": {}, "lastUpdated": "Останнє оновлення", "@lastUpdated": {}, "level": "Рівень", "@level": {}, - "lineItemAdd": "Add Line Item", + "lineItemAdd": "Додати Позицію", "@lineItemAdd": {}, - "lineItem": "Line Item", + "lineItem": "Позиція", "@lineItem": {}, - "lineItems": "Line Items", + "lineItems": "Позиції", "@lineItems": {}, - "lineItemUpdated": "Line item updated", + "lineItemUpdated": "Позицію оновлено", "@lineItemUpdated": {}, "locateItem": "Знайти елемент запасів", "@locateItem": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "Створити нове розташування на складі", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Розташування за замовчуванням", "@locationDefault": {}, "locationNotSet": "Розташування не вказано", "@locationNotSet": {}, @@ -544,9 +544,9 @@ "@missingData": {}, "name": "Назва", "@name": {}, - "no": "No", + "no": "Ні", "@no": {}, - "notApplicable": "N/A", + "notApplicable": "Н/Д", "@notApplicable": {}, "notConnected": "Не під’єднано", "@notConnected": {}, @@ -564,19 +564,19 @@ "@noResults": {}, "noImageAvailable": "Немає доступного зображення", "@noImageAvailable": {}, - "noPricingAvailable": "No pricing available", + "noPricingAvailable": "Ціни не вказано", "@noPricingAvailable": {}, - "noPricingDataFound": "No pricing data found for this part", + "noPricingDataFound": "Для цієї деталі не знайдено даних про ціну", "@noPricingDataFound": {}, - "noSubcategories": "No Subcategories", + "noSubcategories": "Немає Підкатегорій", "@noSubcategories": {}, - "noSubcategoriesAvailable": "No subcategories available", + "noSubcategoriesAvailable": "Немає доступних підкатегорій", "@noSubcategoriesAvailable": {}, "numberInvalid": "Некоректний номер", "@numberInvalid": {}, - "onOrder": "On Order", + "onOrder": "У замовленні", "@onOrder": {}, - "onOrderDetails": "Items currently on order", + "onOrderDetails": "Позиції в поточних замовленнях", "@onOrderDetails": {}, "orientation": "Орієнтація екрана", "@orientation": {}, @@ -632,7 +632,7 @@ "@partNoResults": {}, "partPricing": "Ціна деталі", "@partPricing": {}, - "partPricingSettingDetail": "Display part pricing information", + "partPricingSettingDetail": "Відображати інформацію про ціни на деталь", "@pricingSettingDetail": {}, "partSettings": "Налаштування позиції", "@partSettings": {}, @@ -652,7 +652,7 @@ "@partDetails": {}, "partNotes": "Примітки до позиції", "@partNotes": {}, - "partStock": "Part Stock", + "partStock": "Наявність На Складі", "@partStock": { "description": "part stock" }, @@ -660,7 +660,7 @@ "@password": {}, "passwordEmpty": "Пароль не може бути порожнім", "@passwordEmpty": {}, - "pending": "Pending", + "pending": "В очікуванні", "@pending": {}, "permissionAccountDenied": "Ваш обліковий запис не має необхідних прав для виконання цієї дії", "@permissionAccountDenied": {}, @@ -712,27 +712,27 @@ "@purchaseOrderConfirmScan": {}, "purchaseOrderConfirmScanDetail": "Підтвердити подробиці при скануванні в позицій", "@purchaseOrderConfirmScanDetail": {}, - "purchaseOrderEnable": "Enable Purchase Orders", + "purchaseOrderEnable": "Увімкнути Закупівлю", "@purchaseOrderEnable": {}, - "purchaseOrderEnableDetail": "Enable purchase order functionality", + "purchaseOrderEnableDetail": "Увімкнути функціонал закупівлі", "@purchaseOrderEnableDetail": {}, - "purchaseOrderShowCamera": "Camera Shortcut", + "purchaseOrderShowCamera": "Швидкий Доступ до Камери", "@purchaseOrderShowCamera": {}, - "purchaseOrderShowCameraDetail": "Enable image upload shortcut on purchase order screen", + "purchaseOrderShowCameraDetail": "Увімкнути ярлик для завантаження зображень на екрані закупівель", "@purchaseOrderShowCameraDetail": {}, - "purchaseOrder": "Purchase Order", + "purchaseOrder": "Замовлення на Закупівлю", "@purchaseOrder": {}, - "purchaseOrderCreate": "New Purchase Order", + "purchaseOrderCreate": "Нове Замовлення на Закупівлю", "@purchaseOrderCreate": {}, - "purchaseOrderEdit": "Edit Purchase Order", + "purchaseOrderEdit": "Редагувати Замовлення на Закупівлю", "@purchaseOrderEdit": {}, - "purchaseOrderSettings": "Purchase order settings", + "purchaseOrderSettings": "Налаштування замовлення на закупівлю", "@purchaseOrderSettings": {}, - "purchaseOrders": "Purchase Orders", + "purchaseOrders": "Закупівлі", "@purchaseOrders": {}, - "purchaseOrderUpdated": "Purchase order updated", + "purchaseOrderUpdated": "Замовлення на закупівлю оновлено", "@purchaseOrderUpdated": {}, - "purchasePrice": "Purchase Price", + "purchasePrice": "Закупівельна Ціна", "@purchasePrice": {}, "quantity": "Кількість", "@quantity": { @@ -740,7 +740,7 @@ }, "quantityAvailable": "Доступна кількість", "@quantityAvailable": {}, - "quantityEmpty": "Quantity is empty", + "quantityEmpty": "Кількість не вказана", "@quantityEmpty": {}, "quantityInvalid": "Некоректна кількість", "@quantityInvalid": {}, @@ -752,13 +752,13 @@ "@queryNoResults": {}, "received": "Отримано", "@received": {}, - "receivedFilterDetail": "Show received items", + "receivedFilterDetail": "Показувати отримані позиції", "@receivedFilterDetail": {}, - "receiveItem": "Receive Item", + "receiveItem": "Прийняти Позицію", "@receiveItem": {}, - "receivedItem": "Received Stock Item", + "receivedItem": "Отримана Складська Позиція", "@receivedItem": {}, - "reference": "Reference", + "reference": "Номер документа", "@reference": {}, "refresh": "Оновити", "@refresh": {}, @@ -766,7 +766,7 @@ "@rotateClockwise": {}, "refreshing": "Оновлення", "@refreshing": {}, - "rejected": "Rejected", + "rejected": "Відхилено", "@rejected": {}, "releaseNotes": "Замітки до випуску", "@releaseNotes": {}, From bf19ace3e93754c86d70b6cd9e0151cecf72896e Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 7 Jan 2026 10:38:10 +1100 Subject: [PATCH 07/10] New Crowdin updates (#742) * New translations app_en.arb (Turkish) * New translations app_en.arb (Persian) * New translations app_en.arb (Turkish) * New translations app_en.arb (Turkish) * New translations app_en.arb (Turkish) * New translations app_en.arb (Spanish, Mexico) * New translations app_en.arb (Turkish) * New translations app_en.arb (Chinese Simplified) * New translations app_en.arb (Turkish) * New translations app_en.arb (Danish) * New translations app_en.arb (Danish) * New translations app_en.arb (Danish) * New translations app_en.arb (Turkish) * New translations app_en.arb (Polish) * New translations app_en.arb (Romanian) * New translations app_en.arb (Romanian) * New translations app_en.arb (Danish) * New translations app_en.arb (Romanian) --- lib/l10n/da_DK/app_da_DK.arb | 936 +++++++++++++++++------------------ lib/l10n/es_MX/app_es_MX.arb | 6 +- lib/l10n/fa_IR/app_fa_IR.arb | 126 ++--- lib/l10n/pl_PL/app_pl_PL.arb | 2 +- lib/l10n/ro_RO/app_ro_RO.arb | 330 ++++++------ lib/l10n/tr_TR/app_tr_TR.arb | 110 ++-- lib/l10n/zh_CN/app_zh_CN.arb | 4 +- 7 files changed, 757 insertions(+), 757 deletions(-) diff --git a/lib/l10n/da_DK/app_da_DK.arb b/lib/l10n/da_DK/app_da_DK.arb index 697846b2..c05efb3e 100644 --- a/lib/l10n/da_DK/app_da_DK.arb +++ b/lib/l10n/da_DK/app_da_DK.arb @@ -42,11 +42,11 @@ "@aspectRatio3x2": {}, "aspectRatio4x3": "4:3", "@aspectRatio4x3": {}, - "aspectRatioSquare": "Square (1:1)", + "aspectRatioSquare": "Firkantet (1:1)", "@aspectRatioSquare": {}, "allocateStock": "Tildel lager", "@allocateStock": {}, - "allocatedStock": "Allocated Stock", + "allocatedStock": "Allokeret Lager", "@allocatedStock": {}, "appReleaseNotes": "Vis app-udgivelsesnoter", "@appReleaseNotes": {}, @@ -54,9 +54,9 @@ "@appSettings": {}, "appSettingsDetails": "Konfigurer InvenTree app-indstillinger", "@appSettingsDetails": {}, - "assignedToMe": "Assigned to Me", + "assignedToMe": "Tildelt til Mig", "@assignedToMe": {}, - "assignedToMeDetail": "Show orders which are assigned to me", + "assignedToMeDetail": "Vis ordrer som er tildelt mig", "@assignedToMeDetail": {}, "attachments": "Vedhæftede filer", "@attachments": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "Stregkode skanning på pause", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "Tryk for at pause scanning", "@barcodeScanPause": {}, "barcodeScanAssign": "Scan for at tildele stregkode", "@barcodeScanAssign": {}, @@ -112,135 +112,135 @@ "@barcodeScanControllerDetail": {}, "barcodeScanDelay": "Forsinkelse Af Stregkode", "@barcodeScanDelay": {}, - "barcodeScanDelayDetail": "Delay between barcode scans", + "barcodeScanDelayDetail": "Forsinkelse mellem stregkode scanninger", "@barcodeScanDelayDetail": {}, - "barcodeScanGeneral": "Scan an InvenTree barcode", + "barcodeScanGeneral": "Scan en InvenTree stregkode", "@barcodeScanGeneral": {}, - "barcodeScanInItems": "Scan stock items into this location", + "barcodeScanInItems": "Scan lagervare ind på denne lokation", "@barcodeScanInItems": {}, - "barcodeScanLocation": "Scan stock location", + "barcodeScanLocation": "Scan lager lokation", "@barcodeScanLocation": {}, - "barcodeScanSingle": "Single Scan Mode", + "barcodeScanSingle": "Enkelt Scan Tilstand", "@barcodeScanSingle": {}, - "barcodeScanSingleDetail": "Pause barcode scanner after each scan", + "barcodeScanSingleDetail": "Sæt stregkodeskanneren på pause efter hver scanning", "@barcodeScanSingleDetail": {}, - "barcodeScanIntoLocationSuccess": "Scanned into location", + "barcodeScanIntoLocationSuccess": "Scannet ind i lokation", "@barcodeScanIntoLocationSuccess": {}, - "barcodeScanIntoLocationFailure": "Item not scanned in", + "barcodeScanIntoLocationFailure": "Element er ikke scannet ind", "@barcodeScanIntoLocationFailure": {}, - "barcodeScanItem": "Scan stock item", + "barcodeScanItem": "Scan lagervare", "@barcodeScanItem": {}, - "barcodeTones": "Barcode Tones", + "barcodeTones": "Stregkodetoner", "@barcodeTones": {}, - "barcodeUnassign": "Unassign Barcode", + "barcodeUnassign": "Frigiv Stregkode", "@barcodeUnassign": {}, - "barcodeUnknown": "Barcode is not recognized", + "barcodeUnknown": "Stregkode ikke genkendt", "@barcodeUnknown": {}, - "batchCode": "Batch Code", + "batchCode": "Batch kode", "@batchCode": {}, - "billOfMaterials": "Bill of Materials", + "billOfMaterials": "Stykliste", "@billOfMaterials": {}, - "bom": "BOM", + "bom": "Stykliste", "@bom": {}, - "bomEnable": "Display Bill of Materials", + "bomEnable": "Vis Stykliste", "@bomEnable": {}, - "build": "Build", + "build": "Byg", "@build": {}, - "building": "Building", + "building": "Bygger", "@building": {}, - "cameraCreationError": "Could not open camera controller", + "cameraCreationError": "Kunne ikke åbne kameracontrolleren", "@cameraCreationError": {}, - "cameraInternal": "Internal Camera", + "cameraInternal": "Internt Kamera", "@cameraInternal": {}, - "cameraInternalDetail": "Use internal camera to read barcodes", + "cameraInternalDetail": "Brug internt kamera til at læse stregkoder", "@cameraInternalDetail": {}, - "cancel": "Cancel", + "cancel": "Annuller", "@cancel": { "description": "Cancel" }, - "cancelOrder": "Cancel Order", + "cancelOrder": "Annuller ordre", "@cancelOrder": {}, - "category": "Category", + "category": "Kategori", "@category": {}, - "categoryCreate": "New Category", + "categoryCreate": "Ny kategori", "@categoryCreate": {}, - "categoryCreateDetail": "Create new part category", + "categoryCreateDetail": "Opret ny del kategori", "@categoryCreateDetail": {}, - "categoryUpdated": "Part category updated", + "categoryUpdated": "Del kategori opdateret", "@categoryUpdated": {}, - "company": "Company", + "company": "Firma", "@company": {}, - "companyAdd": "Add Company", + "companyAdd": "Tilføj firma", "@companyAdd": {}, - "companyEdit": "Edit Company", + "companyEdit": "Rediger virksomhed", "@companyEdit": {}, - "companyNoResults": "No companies matching query", + "companyNoResults": "Ingen virksomheder, der matcher forespørgsel", "@companyNoResults": {}, - "companyUpdated": "Company details updated", + "companyUpdated": "Virksomhedsoplysninger opdateret", "@companyUpdated": {}, - "companies": "Companies", + "companies": "Firmaer", "@companies": {}, - "complete": "Complete", + "complete": "Færdiggjort", "@complete": {}, - "completeOrder": "Complete Order", + "completeOrder": "Fuldfør ordre", "@completeOrder": {}, - "completionDate": "Completion Date", + "completionDate": "Færdiggørelsesdato", "@completionDate": {}, - "configureServer": "Configure server settings", + "configureServer": "Konfigurer serverindstillinger", "@configureServer": {}, - "confirmScan": "Confirm Transfer", + "confirmScan": "Bekræft overførsel", "@confirmScan": {}, - "confirmScanDetail": "Confirm stock transfer details when scanning barcodes", + "confirmScanDetail": "Bekræft lageroverførsel detaljer ved scanning stregkoder", "@confirmScanDetail": {}, - "connectionRefused": "Connection Refused", + "connectionRefused": "Forbindelse Afvist", "@connectionRefused": {}, - "count": "Count", + "count": "Antal", "@count": { "description": "Count" }, - "countStock": "Count Stock", + "countStock": "Tæl Lager", "@countStock": { "description": "Count Stock" }, - "credits": "Credits", + "credits": "Anerkendelser", "@credits": {}, - "crop": "Crop", + "crop": "Beskær", "@crop": {}, - "cropImage": "Crop Image", + "cropImage": "Beskær billede", "@cropImage": {}, - "customer": "Customer", + "customer": "Kunde", "@customer": {}, - "customers": "Customers", + "customers": "Kunder", "@customers": {}, - "customerReference": "Customer Reference", + "customerReference": "Kundens Reference", "@customerReference": {}, - "damaged": "Damaged", + "damaged": "Beskadiget", "@damaged": {}, - "colorScheme": "Color Scheme", + "colorScheme": "Farveskema", "@colorScheme": {}, - "colorSchemeDetail": "Select color scheme", + "colorSchemeDetail": "Vælg farveskema", "@colorSchemeDetail": {}, - "darkMode": "Dark Mode", + "darkMode": "Mørk tilstand", "@darkMode": {}, - "darkModeEnable": "Enable dark mode", + "darkModeEnable": "Aktiver mørk tilstand", "@darkModeEnable": {}, - "delete": "Delete", + "delete": "Slet", "@delete": {}, - "deleteFailed": "Delete operation failed", + "deleteFailed": "Sletning fejlede", "@deleteFailed": {}, - "deleteImageConfirmation": "Are you sure you want to delete this image?", + "deleteImageConfirmation": "Er du sikker på at du vil slette dette billede?", "@deleteImageConfirmation": {}, - "deleteImageTooltip": "Delete Image", + "deleteImageTooltip": "Slet billede", "@deleteImageTooltip": {}, - "deleteImage": "Delete Image", + "deleteImage": "Slet billede", "@deleteImage": {}, - "deletePart": "Delete Part", + "deletePart": "Slet Del", "@deletePart": {}, - "deletePartDetail": "Remove this part from the database", + "deletePartDetail": "Fjern denne del fra databasen", "@deletePartDetail": {}, "deleteSuccess": "Sletning lykkedes", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "Leveringsdato", "@deliveryDate": {}, "description": "Beskrivelse", "@description": {}, @@ -254,9 +254,9 @@ }, "documentation": "Dokumentation", "@documentation": {}, - "downloadComplete": "Download Complete", + "downloadComplete": "Download fuldført", "@downloadComplete": {}, - "downloadError": "Error downloading image", + "downloadError": "Fejl ved download af billede", "@downloadError": {}, "downloading": "Overfører fil", "@downloading": {}, @@ -264,7 +264,7 @@ "@edit": { "description": "edit" }, - "editAttachment": "Edit Attachment", + "editAttachment": "Rediger Vedhæftning", "@editAttachment": {}, "editCategory": "Rediger kategori", "@editCategory": {}, @@ -282,91 +282,91 @@ "@editItem": {}, "editLineItem": "Rediger Linjeelement", "@editLineItem": {}, - "email": "Email", + "email": "E-mail", "@email": {}, "enterPassword": "Indtast adgangskode", "@enterPassword": {}, "enterUsername": "Indtast brugernavn", "@enterUsername": {}, - "error": "Error", + "error": "Fejl", "@error": { "description": "Error" }, - "errorCreate": "Error creating database entry", + "errorCreate": "Fejl under oprettelse af database post", "@errorCreate": {}, - "errorDelete": "Error deleting database entry", + "errorDelete": "Fejl ved sletning af databasepost", "@errorDelete": {}, - "errorDetails": "Error Details", + "errorDetails": "Fejldetaljer", "@errorDetails": {}, - "errorFetch": "Error fetching data from server", + "errorFetch": "Fejl ved hentning af data fra server", "@errorFetch": {}, - "errorUserRoles": "Error requesting user roles from server", + "errorUserRoles": "Fejl ved forespørgsel af brugerroller fra server", "@errorUserRoles": {}, - "errorPluginInfo": "Error requesting plugin data from server", + "errorPluginInfo": "Fejl ved forespørgsel af plugin data fra server", "@errorPluginInfo": {}, - "errorReporting": "Error Reporting", + "errorReporting": "Fejlrapportering", "@errorReporting": {}, - "errorReportUpload": "Upload Error Reports", + "errorReportUpload": "Upload Fejlrapporter", "@errorReportUpload": {}, - "errorReportUploadDetails": "Upload anonymous error reports and crash logs", + "errorReportUploadDetails": "Upload anonyme fejlrapporter og nedbrudslogs", "@errorReportUploadDetails": {}, - "expiryDate": "Expiry Date", + "expiryDate": "Udløbsdato", "@expiryDate": {}, - "expiryExpired": "Expired", + "expiryExpired": "Udløbet", "@expiryExpired": {}, - "expiryStale": "Stale", + "expiryStale": "Forældet", "@expiryStale": {}, - "extraLineItem": "Extra Line Item", + "extraLineItem": "Ekstra linjepost", "@extraLineItem": {}, - "extraLineItems": "Extra Line Items", + "extraLineItems": "Ekstra linjeposter", "@extraLineItems": {}, "feedback": "Feedback", "@feedback": {}, - "feedbackError": "Error submitting feedback", + "feedbackError": "Indsendelse af feedback mislykkedes", "@feedbackError": {}, - "feedbackSuccess": "Feedback submitted", + "feedbackSuccess": "Feedback indsendt", "@feedbackSuccess": {}, "filterActive": "Aktiv", "@filterActive": {}, - "filterActiveDetail": "Show active parts", + "filterActiveDetail": "Vis aktive dele", "@filterActiveDetail": {}, - "filterAssembly": "Assembled", + "filterAssembly": "Samlede", "@filterAssembly": {}, - "filterAssemblyDetail": "Show assembled parts", + "filterAssemblyDetail": "Vis samledele", "@filterAssemblyDetail": {}, - "filterComponent": "Component", + "filterComponent": "Komponent", "@filterComponent": {}, - "filterComponentDetail": "Show component parts", + "filterComponentDetail": "Vis komponentdele", "@filterComponentDetail": {}, - "filterExternal": "External", + "filterExternal": "Ekstern", "@filterExternal": {}, - "filterExternalDetail": "Show stock in external locations", + "filterExternalDetail": "Vis lager på eksterne lokationer", "@filterExternalDetail": {}, "filterInStock": "På Lager", "@filterInStock": {}, - "filterInStockDetail": "Show parts which have stock", + "filterInStockDetail": "Vis dele som har lagerbeholdning", "@filterInStockDetail": {}, - "filterSerialized": "Serialized", + "filterSerialized": "Serialiseret", "@filterSerialized": {}, - "filterSerializedDetail": "Show serialized stock items", + "filterSerializedDetail": "Vis serialiserede lagervarer", "@filterSerializedDetail": {}, - "filterTemplate": "Template", + "filterTemplate": "Skabelon", "@filterTemplate": {}, - "filterTemplateDetail": "Show template parts", + "filterTemplateDetail": "Vis skabelon dele", "@filterTemplateDetail": {}, - "filterTrackable": "Trackable", + "filterTrackable": "Sporbar", "@filterTrackable": {}, - "filterTrackableDetail": "Show trackable parts", + "filterTrackableDetail": "Vis sporbare dele", "@filterTrackableDetail": {}, "filterVirtual": "Virtuel", "@filterVirtual": {}, - "filterVirtualDetail": "Show virtual parts", + "filterVirtualDetail": "Vis virtuelle dele", "@filterVirtualDetail": {}, - "filteringOptions": "Filtering Options", + "filteringOptions": "Filtreringsindstillinger", "@filteringOptions": {}, - "formatException": "Format Exception", + "formatException": "Format Undtagelse", "@formatException": {}, - "formatExceptionJson": "JSON data format exception", + "formatExceptionJson": "Undtagelse fra JSON-dataformat", "@formatExceptionJson": {}, "formError": "Formular Fejl", "@formError": {}, @@ -384,51 +384,51 @@ "@homeShowPo": {}, "homeShowPoDescription": "Vis indkøbsordreknap på startskærmen", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "Vis Forsendelser", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "Vis afventende forsendelser på startskærmen", "@homeShowShipmentsDescription": {}, - "homeShowSo": "Show Sales Orders", + "homeShowSo": "Vis Salgs ordrer", "@homeShowSo": {}, - "homeShowSoDescription": "Show sales order button on home screen", + "homeShowSoDescription": "Vis salgsknap på startskærmen", "@homeShowSoDescription": {}, - "homeShowSubscribed": "Subscribed Parts", + "homeShowSubscribed": "Abonnerede Dele", "@homeShowSubscribed": {}, - "homeShowSubscribedDescription": "Show subscribed parts on home screen", + "homeShowSubscribedDescription": "Vis abonnerede dele på startskærmen", "@homeShowSubscsribedDescription": {}, "homeShowSuppliers": "Vis Leverandører", "@homeShowSuppliers": {}, - "homeShowSuppliersDescription": "Show suppliers button on home screen", + "homeShowSuppliersDescription": "Vis leverandørknap på startskærmen", "@homeShowSupplierDescription": {}, - "homeShowManufacturers": "Show Manufacturers", + "homeShowManufacturers": "Vis Producenter", "@homeShowManufacturers": {}, - "homeShowManufacturersDescription": "Show manufacturers button on home screen", + "homeShowManufacturersDescription": "Vis producent-knap på startskærmen", "@homeShowManufacturersDescription": {}, - "homeShowCustomers": "Show Customers", + "homeShowCustomers": "Vis Kunder", "@homeShowCustomers": {}, - "homeShowCustomersDescription": "Show customers button on home screen", + "homeShowCustomersDescription": "Vis kunde-knap på startskærmen", "@homeShowCustomersDescription": {}, - "imageUploadFailure": "Image upload failed", + "imageUploadFailure": "Upload af billede fejlede", "@imageUploadFailure": {}, - "imageUploadSuccess": "Image uploaded", + "imageUploadSuccess": "Billede uploadet", "@imageUploadSuccess": {}, "inactive": "Inaktiv", "@inactive": {}, - "inactiveCompany": "This company is marked as inactive", + "inactiveCompany": "Virksomheden er markeret som inaktiv", "@inactiveCompany": {}, - "inactiveDetail": "This part is marked as inactive", + "inactiveDetail": "Denne del er markeret som inaktiv", "@inactiveDetail": {}, - "includeSubcategories": "Include Subcategories", + "includeSubcategories": "Inkluder underkategorier", "@includeSubcategories": {}, - "includeSubcategoriesDetail": "Show results from subcategories", + "includeSubcategoriesDetail": "Vis resultater fra underkategorier", "@includeSubcategoriesDetail": {}, - "includeSublocations": "Include Sublocations", + "includeSublocations": "Inkluder underlokationer", "@includeSublocations": {}, - "includeSublocationsDetail": "Show results from sublocations", + "includeSublocationsDetail": "Vis resultater fra underkategorier", "@includeSublocationsDetail": {}, - "incompleteDetails": "Incomplete profile details", + "incompleteDetails": "Ukomplette profiloplysninger", "@incompleteDetails": {}, - "internalPartNumber": "Internal Part Number", + "internalPartNumber": "Internt Delnummer", "@internalPartNumber": {}, "info": "Info", "@info": {}, @@ -438,9 +438,9 @@ "@inProductionDetail": {}, "internalPart": "Intern Del", "@internalPart": {}, - "invalidHost": "Invalid hostname", + "invalidHost": "Ugyldigt hostnavn", "@invalidHost": {}, - "invalidHostDetails": "Provided hostname is not valid", + "invalidHostDetails": "Det angivne hostnavn er ikke gyldigt", "@invalidHostDetails": {}, "invalidPart": "Ugyldig Del", "@invalidPart": {}, @@ -454,754 +454,754 @@ "@invalidSupplierPart": {}, "invalidUsernamePassword": "Ugyldigt brugernavn/adgangskode-kombination", "@invalidUsernamePassword": {}, - "invoice": "Invoice", + "invoice": "Faktura", "@invoice": {}, - "invoiceNumber": "Invoice Number", + "invoiceNumber": "Fakturanummer", "@invoiceNumber": {}, - "issue": "Issue", + "issue": "Problem", "@issue": {}, - "issueDate": "Issue Date", + "issueDate": "Udstedelsesdato", "@issueDate": {}, - "issueOrder": "Issue Order", + "issueOrder": "Udstede Ordre", "@issueOrder": {}, - "itemInLocation": "Item already in location", + "itemInLocation": "Element allerede på placering", "@itemInLocation": {}, - "itemDeleted": "Item has been removed", + "itemDeleted": "Element er blevet fjernet", "@itemDeleted": {}, - "itemUpdated": "Item updated", + "itemUpdated": "Element opdateret", "@itemUpdated": {}, - "keywords": "Keywords", + "keywords": "Nøgleord", "@keywords": {}, "labelDriver": "Label Driver", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "Vælg Label Printer Driver", "@labelSelectDriver": {}, - "labelPrinting": "Label Printing", + "labelPrinting": "Label Udskriver", "@labelPrinting": {}, - "labelPrintingDetail": "Enable label printing", + "labelPrintingDetail": "Aktiver label udskrivning", "@labelPrintingDetail": {}, - "labelTemplate": "Label Template", + "labelTemplate": "Label Skabelon", "@labelTemplate": {}, - "labelSelectTemplate": "Select Label Template", + "labelSelectTemplate": "Vælg Label Skabelon", "@labelSelectTemplate": {}, - "labelSelectPrinter": "Select Label Printer", + "labelSelectPrinter": "Vælg Label Printer", "@labelSelectPrinter": {}, - "language": "Language", + "language": "Sprog", "@language": {}, - "languageDefault": "Default system language", + "languageDefault": "Standard systemsprog", "@languageDefault": {}, - "languageSelect": "Select Language", + "languageSelect": "Vælg sprog", "@languageSelect": {}, - "lastStocktake": "Last Stocktake", + "lastStocktake": "Sidste lageroptagelse", "@lastStocktake": {}, - "lastUpdated": "Last Updated", + "lastUpdated": "Senest opdateret", "@lastUpdated": {}, - "level": "Level", + "level": "Niveau", "@level": {}, - "lineItemAdd": "Add Line Item", + "lineItemAdd": "Tilføj Linjeelement", "@lineItemAdd": {}, - "lineItem": "Line Item", + "lineItem": "Linje Element", "@lineItem": {}, - "lineItems": "Line Items", + "lineItems": "Linjeelementer", "@lineItems": {}, - "lineItemUpdated": "Line item updated", + "lineItemUpdated": "Linje element opdateret", "@lineItemUpdated": {}, - "locateItem": "Locate stock item", + "locateItem": "Find lagervare", "@locateItem": {}, - "locateLocation": "Locate stock location", + "locateLocation": "Find lager lokation", "@locateLocation": {}, - "locationCreate": "New Location", + "locationCreate": "Ny lokation", "@locationCreate": {}, - "locationCreateDetail": "Create new stock location", + "locationCreateDetail": "Opret ny lagerlokation", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "Standard lokation", "@locationDefault": {}, - "locationNotSet": "No location specified", + "locationNotSet": "Ingen lokation specificeret", "@locationNotSet": {}, - "locationUpdated": "Stock location updated", + "locationUpdated": "Lager lokation opdateret", "@locationUpdated": {}, - "login": "Login", + "login": "Log ind", "@login": {}, - "loginEnter": "Enter login details", + "loginEnter": "Indtast login detaljer", "@loginEnter": {}, - "loginEnterDetails": "Username and password are not stored locally", + "loginEnterDetails": "Brugernavn og adgangskode er ikke gemt lokalt", "@loginEnterDetails": {}, "link": "Link", "@link": {}, - "lost": "Lost", + "lost": "Mistet", "@lost": {}, - "manufacturerPart": "Manufacturer Part", + "manufacturerPart": "Producent Del", "@manufacturerPart": {}, - "manufacturerPartEdit": "Edit Manufacturer Part", + "manufacturerPartEdit": "Rediger Producent Del", "@manufacturerPartEdit": {}, - "manufacturerPartNumber": "Manufacturer Part Number", + "manufacturerPartNumber": "Producent Delnummer", "@manufacturerPartNumber": {}, - "manufacturer": "Manufacturer", + "manufacturer": "Producent", "@manufacturer": {}, - "manufacturers": "Manufacturers", + "manufacturers": "Producenter", "@manufacturers": {}, - "missingData": "Missing Data", + "missingData": "Mangler data", "@missingData": {}, - "name": "Name", + "name": "Navn", "@name": {}, - "no": "No", + "no": "Nej", "@no": {}, "notApplicable": "N/A", "@notApplicable": {}, - "notConnected": "Not Connected", + "notConnected": "Ikke Forbundet", "@notConnected": {}, - "notes": "Notes", + "notes": "Noter", "@notes": { "description": "Notes" }, - "notifications": "Notifications", + "notifications": "Notifikationer", "@notifications": {}, - "notificationsEmpty": "No unread notifications", + "notificationsEmpty": "Ingen ulæste notifikationer", "@notificationsEmpty": {}, - "noResponse": "No Response from Server", + "noResponse": "Intet svar fra server", "@noResponse": {}, - "noResults": "No Results", + "noResults": "Ingen Resultater", "@noResults": {}, - "noImageAvailable": "No image available", + "noImageAvailable": "Intet billede tilgængeligt", "@noImageAvailable": {}, - "noPricingAvailable": "No pricing available", + "noPricingAvailable": "Ingen priser tilgængelig", "@noPricingAvailable": {}, - "noPricingDataFound": "No pricing data found for this part", + "noPricingDataFound": "Ingen prisdata fundet for denne del", "@noPricingDataFound": {}, - "noSubcategories": "No Subcategories", + "noSubcategories": "Ingen Underkategorier", "@noSubcategories": {}, - "noSubcategoriesAvailable": "No subcategories available", + "noSubcategoriesAvailable": "Ingen underkategorier tilgængelige", "@noSubcategoriesAvailable": {}, - "numberInvalid": "Invalid number", + "numberInvalid": "Ugyldigt nummer", "@numberInvalid": {}, - "onOrder": "On Order", + "onOrder": "På bestilling", "@onOrder": {}, - "onOrderDetails": "Items currently on order", + "onOrderDetails": "Elementer i øjeblikket på ordre", "@onOrderDetails": {}, - "orientation": "Screen Orientation", + "orientation": "Skærm Orientering", "@orientation": {}, - "orientationDetail": "Screen orientation (requires restart)", + "orientationDetail": "Skærm orientering (kræver genstart)", "@orientationDetail": {}, - "orientationLandscape": "Landscape", + "orientationLandscape": "Landskab", "@orientationLandscape": {}, - "orientationPortrait": "Portrait", + "orientationPortrait": "Portræt", "@orientationPortrait": {}, "orientationSystem": "System", "@orientationSystem": {}, - "outstanding": "Outstanding", + "outstanding": "Udestående", "@outstanding": {}, - "outstandingOrderDetail": "Show outstanding orders", + "outstandingOrderDetail": "Vis udestående ordrer", "@outstandingOrderDetail": {}, - "overdue": "Overdue", + "overdue": "Overskredet", "@overdue": {}, - "overdueDetail": "Show overdue orders", + "overdueDetail": "Vis forfaldne ordre", "@overdueDetail": {}, - "packaging": "Packaging", + "packaging": "Emballage", "@packaging": {}, - "packageName": "Package Name", + "packageName": "Pakkenavn", "@packageName": {}, - "parameters": "Parameters", + "parameters": "Parametre", "@parameters": {}, - "parametersSettingDetail": "Display part parameters", + "parametersSettingDetail": "Vis delparametre", "@parametersSettingDetail": {}, - "parent": "Parent", + "parent": "Overordnet", "@parent": {}, - "parentCategory": "Parent Category", + "parentCategory": "Overordnet kategori", "@parentCategory": {}, - "parentLocation": "Parent Location", + "parentLocation": "Overordnet Placering", "@parentLocation": {}, - "part": "Part", + "part": "Del", "@part": { "description": "Part (single)" }, - "partCreate": "New Part", + "partCreate": "Ny Del", "@partCreate": {}, - "partCreateDetail": "Create new part in this category", + "partCreateDetail": "Opret ny del i denne kategori", "@partCreateDetail": {}, - "partEdited": "Part updated", + "partEdited": "Del opdateret", "@partEdited": {}, - "parts": "Parts", + "parts": "Dele", "@parts": { "description": "Part (multiple)" }, - "partNotSalable": "Part not marked as salable", + "partNotSalable": "Del ikke markeret som salgbart", "@partNotSalable": {}, - "partsNone": "No Parts", + "partsNone": "Ingen Dele", "@partsNone": {}, - "partNoResults": "No parts matching query", + "partNoResults": "Ingen dele matcher forespørgsel", "@partNoResults": {}, - "partPricing": "Part Pricing", + "partPricing": "Del Prisfastsættelse", "@partPricing": {}, - "partPricingSettingDetail": "Display part pricing information", + "partPricingSettingDetail": "Vis delprisinformation", "@pricingSettingDetail": {}, - "partSettings": "Part Settings", + "partSettings": "Del Indstillinger", "@partSettings": {}, - "partsStarred": "Subscribed Parts", + "partsStarred": "Abonnerede Dele", "@partsStarred": {}, - "partsStarredNone": "No starred parts available", + "partsStarredNone": "Ingen markerede dele til rådighed", "@partsStarredNone": {}, - "partSuppliers": "Part Suppliers", + "partSuppliers": "Del Leverandører", "@partSuppliers": {}, - "partCategory": "Part Category", + "partCategory": "Del Kategori", "@partCategory": {}, - "partCategoryTopLevel": "Top level part category", + "partCategoryTopLevel": "Top niveau del kategori", "@partCategoryTopLevel": {}, - "partCategories": "Part Categories", + "partCategories": "Del Kategorier", "@partCategories": {}, - "partDetails": "Part Details", + "partDetails": "Del Detaljer", "@partDetails": {}, - "partNotes": "Part Notes", + "partNotes": "Del Noter", "@partNotes": {}, - "partStock": "Part Stock", + "partStock": "Del Lagerbeholdning", "@partStock": { "description": "part stock" }, - "password": "Password", + "password": "Adgangskode", "@password": {}, - "passwordEmpty": "Password cannot be empty", + "passwordEmpty": "Adgangskode kan ikke være tom", "@passwordEmpty": {}, - "pending": "Pending", + "pending": "Afventende", "@pending": {}, - "permissionAccountDenied": "Your account does not have the required permissions to perform this action", + "permissionAccountDenied": "Din konto har ikke de nødvendige tilladelser til at udføre denne handling", "@permissionAccountDenied": {}, - "permissionRequired": "Permission Required", + "permissionRequired": "Tilladelse påkrævet", "@permissionRequired": {}, - "phone": "Phone", + "phone": "Telefon", "@phone": {}, - "printLabel": "Print Label", + "printLabel": "Udskriv label", "@printLabel": {}, "plugin": "Plugin", "@plugin": {}, "pluginPrinter": "Printer", "@pluginPrinter": {}, - "pluginSupport": "Plugin Support Enabled", + "pluginSupport": "Plugin Support Aktiveret", "@pluginSupport": {}, - "pluginSupportDetail": "The server supports custom plugins", + "pluginSupportDetail": "Serveren understøtter brugerdefinerede plugins", "@pluginSupportDetail": {}, - "printLabelFailure": "Label printing failed", + "printLabelFailure": "Label udskrivning mislykkedes", "@printLabelFailure": {}, - "printLabelSuccess": "Label sent to printer", + "printLabelSuccess": "Label sendt til printer", "@printLabelSuccess": {}, - "profile": "Profile", + "profile": "Profil", "@profile": {}, - "profileAdd": "Add Server Profile", + "profileAdd": "Tilføj Serverprofil", "@profileAdd": {}, - "profileConnect": "Connect to Server", + "profileConnect": "Opretter forbindelse til server", "@profileConnect": {}, - "profileEdit": "Edit Server Profile", + "profileEdit": "Rediger serverprofil", "@profileEdit": {}, - "profileDelete": "Delete Server Profile", + "profileDelete": "Slet Server Profil", "@profileDelete": {}, - "profileLogout": "Logout Profile", + "profileLogout": "Log Af Profil", "@profileLogout": {}, - "profileName": "Profile Name", + "profileName": "Profilnavn", "@profileName": {}, - "profileNone": "No profiles available", + "profileNone": "Ingen profiler til rådighed", "@profileNone": {}, - "profileNotSelected": "No Profile Selected", + "profileNotSelected": "Ingen Profil Valgt", "@profileNotSelected": {}, - "profileSelect": "Select InvenTree Server", + "profileSelect": "Vælg InvenTree Server", "@profileSelect": {}, - "profileSelectOrCreate": "Select server or create a new profile", + "profileSelectOrCreate": "Vælg server eller opret ny profil", "@profileSelectOrCreate": {}, - "profileTapToCreate": "Tap to create or select a profile", + "profileTapToCreate": "Tryk for at oprette eller vælge en profil", "@profileTapToCreate": {}, - "projectCode": "Project Code", + "projectCode": "Projektkode", "@projectCode": {}, - "purchaseOrderConfirmScan": "Confirm Scan Data", + "purchaseOrderConfirmScan": "Bekræft Scanningsdata", "@purchaseOrderConfirmScan": {}, - "purchaseOrderConfirmScanDetail": "Confirm details when scanning in items", + "purchaseOrderConfirmScanDetail": "Bekræft detaljer ved ind scanning af elementer", "@purchaseOrderConfirmScanDetail": {}, - "purchaseOrderEnable": "Enable Purchase Orders", + "purchaseOrderEnable": "Aktive Indkøbsordrer", "@purchaseOrderEnable": {}, - "purchaseOrderEnableDetail": "Enable purchase order functionality", + "purchaseOrderEnableDetail": "Aktiver salgsordre funktionalitet", "@purchaseOrderEnableDetail": {}, - "purchaseOrderShowCamera": "Camera Shortcut", + "purchaseOrderShowCamera": "Genvej Til Kamera", "@purchaseOrderShowCamera": {}, - "purchaseOrderShowCameraDetail": "Enable image upload shortcut on purchase order screen", + "purchaseOrderShowCameraDetail": "Aktiver genvej til billedupload på købsordre skærmen", "@purchaseOrderShowCameraDetail": {}, - "purchaseOrder": "Purchase Order", + "purchaseOrder": "Købsordre", "@purchaseOrder": {}, - "purchaseOrderCreate": "New Purchase Order", + "purchaseOrderCreate": "Ny købsordre", "@purchaseOrderCreate": {}, - "purchaseOrderEdit": "Edit Purchase Order", + "purchaseOrderEdit": "Rediger Købsordre", "@purchaseOrderEdit": {}, - "purchaseOrderSettings": "Purchase order settings", + "purchaseOrderSettings": "Indstillinger for indkøbsordre", "@purchaseOrderSettings": {}, - "purchaseOrders": "Purchase Orders", + "purchaseOrders": "Indkøbsordrer", "@purchaseOrders": {}, - "purchaseOrderUpdated": "Purchase order updated", + "purchaseOrderUpdated": "Købsordre opdateret", "@purchaseOrderUpdated": {}, - "purchasePrice": "Purchase Price", + "purchasePrice": "Købspris", "@purchasePrice": {}, - "quantity": "Quantity", + "quantity": "Antal", "@quantity": { "description": "Quantity" }, - "quantityAvailable": "Quantity Available", + "quantityAvailable": "Antal Tilgængelig", "@quantityAvailable": {}, - "quantityEmpty": "Quantity is empty", + "quantityEmpty": "Antal er tomt", "@quantityEmpty": {}, - "quantityInvalid": "Quantity is invalid", + "quantityInvalid": "Antal er ugyldigt", "@quantityInvalid": {}, - "quantityPositive": "Quantity must be positive", + "quantityPositive": "Antallet skal være positivt", "@quantityPositive": {}, - "queryEmpty": "Enter search query", + "queryEmpty": "Indtast søgestreng", "@queryEmpty": {}, - "queryNoResults": "No results for query", + "queryNoResults": "Ingen resultater fundet", "@queryNoResults": {}, - "received": "Received", + "received": "Modtaget", "@received": {}, - "receivedFilterDetail": "Show received items", + "receivedFilterDetail": "Vis modtagne elementer", "@receivedFilterDetail": {}, - "receiveItem": "Receive Item", + "receiveItem": "Modtage Element", "@receiveItem": {}, - "receivedItem": "Received Stock Item", + "receivedItem": "Modtaget Lagervare", "@receivedItem": {}, "reference": "Reference", "@reference": {}, - "refresh": "Refresh", + "refresh": "Genindlæs", "@refresh": {}, - "rotateClockwise": "Rotate 90° clockwise", + "rotateClockwise": "Roter 90° med uret", "@rotateClockwise": {}, - "refreshing": "Refreshing", + "refreshing": "Genindlæser", "@refreshing": {}, - "rejected": "Rejected", + "rejected": "Afvist", "@rejected": {}, "releaseNotes": "Release Notes", "@releaseNotes": {}, - "remove": "Remove", + "remove": "Fjern", "@remove": { "description": "remove" }, - "removeStock": "Remove Stock", + "removeStock": "Fjern Lagervarer", "@removeStock": { "description": "remove stock" }, - "reportBug": "Report Bug", + "reportBug": "Rapporter fejl", "@reportBug": {}, - "reportBugDescription": "Submit bug report (requires GitHub account)", + "reportBugDescription": "Indsend fejlrapport (kræver GitHub konto)", "@reportBugDescription": {}, - "responsible": "Responsible", + "responsible": "Ansvarlig", "@responsible": {}, - "results": "Results", + "results": "Resultater", "@results": {}, - "request": "Request", + "request": "Anmodning", "@request": {}, - "requestFailed": "Request Failed", + "requestFailed": "Anmodning fejlede", "@requestFailed": {}, - "requestSuccessful": "Request successful", + "requestSuccessful": "Anmodning succesfuld", "@requestSuccessful": {}, - "requestingData": "Requesting Data", + "requestingData": "Anmoder Data", "@requestingData": {}, - "required": "Required", + "required": "Påkrævet", "@required": { "description": "This field is required" }, - "response400": "Bad Request", + "response400": "Dårlig anmodning", "@response400": {}, - "response401": "Unauthorized", + "response401": "Uautoriseret", "@response401": {}, - "response403": "Permission Denied", + "response403": "Adgang nægtet", "@response403": {}, - "response404": "Resource Not Found", + "response404": "Ressource Ikke Fundet", "@response404": {}, - "response405": "Method Not Allowed", + "response405": "Metode ikke tilladt", "@response405": {}, - "response429": "Too Many Requests", + "response429": "For Mange Anmodninger", "@response429": {}, - "response500": "Internal Server Error", + "response500": "Intern serverfejl", "@response500": {}, - "response501": "Not Implemented", + "response501": "Ikke implementeret", "@response501": {}, - "response502": "Bad Gateway", + "response502": "Dårlig Gateway", "@response502": {}, - "response503": "Service Unavailable", + "response503": "Service er utilgængelig", "@response503": {}, "response504": "Gateway Timeout", "@response504": {}, - "response505": "HTTP Version Not Supported", + "response505": "HTTP-version understøttes ikke", "@response505": {}, - "responseData": "Response data", + "responseData": "Svardata", "@responseData": {}, - "responseInvalid": "Invalid Response Code", + "responseInvalid": "Ugyldig Svar Kode", "@responseInvalid": {}, - "responseUnknown": "Unknown Response", + "responseUnknown": "Ukendt Svar", "@responseUnknown": {}, - "result": "Result", + "result": "Resultat", "@result": { "description": "" }, - "returned": "Returned", + "returned": "Returneret", "@returned": {}, - "salesOrder": "Sales Order", + "salesOrder": "Salgsordrer", "@salesOrder": {}, - "salesOrders": "Sales Orders", + "salesOrders": "Salgsordrer", "@salesOrders": {}, - "salesOrderEnable": "Enable Sales Orders", + "salesOrderEnable": "Aktiver Salgsordrer", "@salesOrderEnable": {}, - "salesOrderEnableDetail": "Enable sales order functionality", + "salesOrderEnableDetail": "Aktiver salgsordre funktionalitet", "@salesOrderEnableDetail": {}, - "salesOrderShowCamera": "Camera Shortcut", + "salesOrderShowCamera": "Genvej Til Kamera", "@salesOrderShowCamera": {}, - "salesOrderShowCameraDetail": "Enable image upload shortcut on sales order screen", + "salesOrderShowCameraDetail": "Aktiver genvej til billedupload til salgsordre på skærmen", "@salesOrderShowCameraDetail": {}, - "salesOrderSettings": "Sales order settings", + "salesOrderSettings": "Indstillinger for salgsordre", "@salesOrderSettings": {}, - "salesOrderCreate": "New Sales Order", + "salesOrderCreate": "Ny salgsordre", "@saleOrderCreate": {}, - "salesOrderEdit": "Edit Sales Order", + "salesOrderEdit": "Rediger Salgsordre", "@salesOrderEdit": {}, - "salesOrderUpdated": "Sales order updated", + "salesOrderUpdated": "Salgs ordre opdateret", "@salesOrderUpdated": {}, - "save": "Save", + "save": "Gem", "@save": { "description": "Save" }, - "scanBarcode": "Scan Barcode", + "scanBarcode": "Scan stregkode", "@scanBarcode": {}, - "scanSupplierPart": "Scan supplier part barcode", + "scanSupplierPart": "Scan leverandørdel stregkode", "@scanSupplierPart": {}, - "scanIntoLocation": "Scan Into Location", + "scanIntoLocation": "Scan Til Placering", "@scanIntoLocation": {}, - "scanIntoLocationDetail": "Scan this item into location", + "scanIntoLocationDetail": "Skan dette element til placering", "@scanIntoLocationDetail": {}, - "scannerExternal": "External Scanner", + "scannerExternal": "Ekstern Scanner", "@scannerExternal": {}, - "scannerExternalDetail": "Use external scanner to read barcodes (wedge mode)", + "scannerExternalDetail": "Brug ekstern scanner til at læse stregkoder (kiletilstand)", "@scannerExternalDetail": {}, - "scanReceivedParts": "Scan Received Parts", + "scanReceivedParts": "Scan Modtagne Dele", "@scanReceivedParts": {}, - "search": "Search", + "search": "Søg", "@search": { "description": "search" }, - "searching": "Searching", + "searching": "Søger", "@searching": {}, - "searchLocation": "Search for location", + "searchLocation": "Søg efter lokation", "@searchLocation": {}, - "searchParts": "Search Parts", + "searchParts": "Søg efter dele", "@searchParts": {}, - "searchStock": "Search Stock", + "searchStock": "Søg Lager", "@searchStock": {}, - "select": "Select", + "select": "Vælg", "@select": {}, - "selectFile": "Select File", + "selectFile": "Vælg fil", "@selectFile": {}, - "selectImage": "Select Image", + "selectImage": "Vælg billede", "@selectImage": {}, - "selectLocation": "Select a location", + "selectLocation": "Vælg en placering", "@selectLocation": {}, "send": "Send", "@send": {}, - "serialNumber": "Serial Number", + "serialNumber": "Serienummer", "@serialNumber": {}, - "serialNumbers": "Serial Numbers", + "serialNumbers": "Serienummer", "@serialNumbers": {}, "server": "Server", "@server": {}, - "serverAddress": "Server Address", + "serverAddress": "Serveradresse", "@serverAddress": {}, - "serverApiRequired": "Required API Version", + "serverApiRequired": "Kræver API-version", "@serverApiRequired": {}, "serverApiVersion": "Server API Version", "@serverApiVersion": {}, - "serverAuthenticationError": "Authentication Error", + "serverAuthenticationError": "Autentificeringsfejl", "@serverAuthenticationError": {}, - "serverCertificateError": "Cerficate Error", + "serverCertificateError": "Certifikatfejl", "@serverCertificateError": {}, - "serverCertificateInvalid": "Server HTTPS certificate is invalid", + "serverCertificateInvalid": "Server HTTPS certifikat er ugyldigt", "@serverCertificateInvalid": {}, - "serverConnected": "Connected to Server", + "serverConnected": "Forbundet til server", "@serverConnected": {}, - "serverConnecting": "Connecting to server", + "serverConnecting": "Opretter forbindelse til server", "@serverConnecting": {}, - "serverCouldNotConnect": "Could not connect to server", + "serverCouldNotConnect": "Kunne ikke forbinde til server", "@serverCouldNotConnect": {}, - "serverEmpty": "Server cannot be empty", + "serverEmpty": "Serveren kan ikke være tom", "@serverEmpty": {}, - "serverError": "Server Error", + "serverError": "Serverfejl", "@serverError": {}, - "serverDetails": "Server Details", + "serverDetails": "Server detaljer", "@serverDetails": {}, - "serverMissingData": "Server response missing required fields", + "serverMissingData": "Server svar mangler obligatoriske felter", "@serverMissingData": {}, - "serverOld": "Old Server Version", + "serverOld": "Gammel Server Version", "@serverOld": {}, - "serverSettings": "Server Settings", + "serverSettings": "Server indstillinger", "@serverSettings": {}, - "serverStart": "Server must start with http[s]", + "serverStart": "Server skal starte med http[s]", "@serverStart": {}, - "settings": "Settings", + "settings": "Indstillinger", "@settings": {}, - "serverInstance": "Server Instance", + "serverInstance": "Server Instans", "@serverInstance": {}, - "serverNotConnected": "Server not connected", + "serverNotConnected": "Server ikke forbundet", "@serverNotConnected": {}, - "serverNotSelected": "Server not selected", + "serverNotSelected": "Server ikke valgt", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "Forsendelse", "@shipment": {}, - "shipments": "Shipments", + "shipments": "Forsendelser", "@shipments": {}, - "shipmentsPending": "Pending Shipments", + "shipmentsPending": "Afventer Forsendelser", "@shipmentsPending": {}, - "shipmentAdd": "Add Shipment", + "shipmentAdd": "Tilføj Forsendelse", "@shipmentAdd": {}, - "shipmentCheck": "Check Shipment", + "shipmentCheck": "Tjek Forsendelse", "@shipmentCheck": {}, - "shipmentCheckDetail": "Mark this shipment as checked", + "shipmentCheckDetail": "Marker denne forsendelse som kontrolleret", "@shipmentCheckDetail": {}, - "shipmentChecked": "Shipment Checked", + "shipmentChecked": "Forsendelse Kontrolleret", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "Afsendelsesdato", "@shipmentDate": {}, - "shipmentEdit": "Edit Shipment", + "shipmentEdit": "Rediger Forsendelse", "@shipmentEdit": {}, - "shipmentReference": "Shipment Reference", + "shipmentReference": "Forsendelse Reference", "@shipmentReference": {}, - "shipmentSend": "Send Shipment", + "shipmentSend": "Send Forsendelse", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Afmarkér Forsendelse", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "Marker denne forsendelse som afmarkeret", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "Forsendelse Opdateret", "@shipmentUpdated": {}, - "shipped": "Shipped", + "shipped": "Afsendt", "@shipped": {}, - "sku": "SKU", + "sku": "Lagerbeholdning", "@sku": {}, - "sounds": "Sounds", + "sounds": "Lyde", "@sounds": {}, - "soundOnBarcodeAction": "Play audible tone on barcode action", + "soundOnBarcodeAction": "Afspil hørbar tone ved stregkodehandling", "@soundOnBarcodeAction": {}, - "soundOnServerError": "Play audible tone on server error", + "soundOnServerError": "Afspil akustisk tone ved serverfejl", "@soundOnServerError": {}, - "startDate": "Start Date", + "startDate": "Startdato", "@startDate": {}, "status": "Status", "@status": {}, - "statusCode": "Status Code", + "statusCode": "Status Kode", "@statusCode": {}, - "stock": "Stock", + "stock": "Lager", "@stock": { "description": "stock" }, - "stockDetails": "Current available stock quantity", + "stockDetails": "Aktuel disponibel lagermængde", "@stockDetails": {}, - "stockItem": "Stock Item", + "stockItem": "Lagervarer", "@stockItem": { "description": "stock item title" }, - "stockItems": "Stock Items", + "stockItems": "Lagervarer", "@stockItems": {}, - "stockItemCreate": "New Stock Item", + "stockItemCreate": "Ny Lagervare", "@stockItemCreate": {}, - "stockItemCreateDetail": "Create new stock item in this location", + "stockItemCreateDetail": "Opret ny lagervare på denne lokation", "@stockItemCreateDetail": {}, - "stockItemDelete": "Delete Stock Item", + "stockItemDelete": "Slet Lagervare", "@stockItemDelete": {}, - "stockItemDeleteConfirm": "Are you sure you want to delete this stock item?", + "stockItemDeleteConfirm": "Er du sikker på, at du vil slette denne lagervare?", "@stockItemDeleteConfirm": {}, - "stockItemDeleteFailure": "Could not delete stock item", + "stockItemDeleteFailure": "Kunne ikke slette lagervare", "@stockItemDeleteFailure": {}, - "stockItemDeleteSuccess": "Stock item deleted", + "stockItemDeleteSuccess": "Lagervare slettet", "@stockItemDeleteSuccess": {}, - "stockItemHistory": "Stock History", + "stockItemHistory": "Lager Historik", "@stockItemHistory": {}, - "stockItemHistoryDetail": "Display historical stock tracking information", + "stockItemHistoryDetail": "Vis historisk lagersporings information", "@stockItemHistoryDetail": {}, - "stockItemTransferred": "Stock item transferred", + "stockItemTransferred": "Lagervare overført", "@stockItemTransferred": {}, - "stockItemUpdated": "Stock item updated", + "stockItemUpdated": "Lagervare opdateret", "@stockItemUpdated": {}, - "stockItemsNotAvailable": "No stock items available", + "stockItemsNotAvailable": "Ingen lagervarer tilgængelige", "@stockItemsNotAvailable": {}, - "stockItemNotes": "Stock Item Notes", + "stockItemNotes": "Lager Vare Noter", "@stockItemNotes": {}, - "stockItemUpdateSuccess": "Stock item updated", + "stockItemUpdateSuccess": "Lagervare opdateret", "@stockItemUpdateSuccess": {}, - "stockItemUpdateFailure": "Stock item update failed", + "stockItemUpdateFailure": "Lagervare opdatering mislykkedes", "@stockItemUpdateFailure": {}, - "stockLocation": "Stock Location", + "stockLocation": "Lagerlokationer", "@stockLocation": { "description": "stock location" }, - "stockLocations": "Stock Locations", + "stockLocations": "Lagerlokationer", "@stockLocations": {}, - "stockTopLevel": "Top level stock location", + "stockTopLevel": "Top niveau lager lokation", "@stockTopLevel": {}, - "strictHttps": "Use Strict HTTPS", + "strictHttps": "Brug Streng HTTPS", "@strictHttps": {}, - "strictHttpsDetails": "Enforce strict checking of HTTPs certificates", + "strictHttpsDetails": "Håndhæve streng kontrol af HTTPS-certifikater", "@strictHttpsDetails": {}, - "subcategory": "Subcategory", + "subcategory": "Underkategori", "@subcategory": {}, - "subcategories": "Subcategories", + "subcategories": "Underkategorier", "@subcategories": {}, - "sublocation": "Sublocation", + "sublocation": "Under lokation", "@sublocation": {}, - "sublocations": "Sublocations", + "sublocations": "Under lokationer", "@sublocations": {}, - "sublocationNone": "No Sublocations", + "sublocationNone": "Ingen under lokationer", "@sublocationNone": {}, - "sublocationNoneDetail": "No sublocations available", + "sublocationNoneDetail": "Ingen under lokationer tilgængelige", "@sublocationNoneDetail": {}, - "submitFeedback": "Submit Feedback", + "submitFeedback": "Indsend feedback", "@submitFeedback": {}, - "suppliedParts": "Supplied Parts", + "suppliedParts": "Leveret Dele", "@suppliedParts": {}, - "supplier": "Supplier", + "supplier": "Leverandør", "@supplier": {}, - "supplierPart": "Supplier Part", + "supplierPart": "Leverandør Del", "@supplierPart": {}, - "supplierPartEdit": "Edit Supplier Part", + "supplierPartEdit": "Rediger Leverandør Del", "@supplierPartEdit": {}, - "supplierPartNumber": "Supplier Part Number", + "supplierPartNumber": "Leverandør Delnummer", "@supplierPartNumber": {}, - "supplierPartUpdated": "Supplier Part Updated", + "supplierPartUpdated": "Leverandør Del Opdateret", "@supplierPartUpdated": {}, - "supplierParts": "Supplier Parts", + "supplierParts": "Leverandør Dele", "@supplierParts": {}, - "suppliers": "Suppliers", + "suppliers": "Leverandør", "@suppliers": {}, - "supplierReference": "Supplier Reference", + "supplierReference": "Leverandør Reference", "@supplierReference": {}, - "switchCamera": "Switch Camera", + "switchCamera": "Skift Kamera", "@switchCamera": {}, - "takePicture": "Take Picture", + "takePicture": "Tag billede", "@takePicture": {}, - "targetDate": "Target Date", + "targetDate": "Måldato", "@targetDate": {}, - "templatePart": "Parent Template Part", + "templatePart": "Overordnet Skabelon Del", "@templatePart": {}, - "testName": "Test Name", + "testName": "Test navn", "@testName": {}, - "testPassedOrFailed": "Test passed or failed", + "testPassedOrFailed": "Test bestået eller fejlet", "@testPassedOrFailed": {}, - "testsRequired": "Required Tests", + "testsRequired": "Påkrævede Test", "@testsRequired": {}, - "testResults": "Test Results", + "testResults": "Testresultater", "@testResults": { "description": "" }, - "testResultsDetail": "Display stock item test results", + "testResultsDetail": "Vis testresultater for lagervarer", "@testResultsDetail": {}, - "testResultAdd": "Add Test Result", + "testResultAdd": "Tilføj Testresultat", "@testResultAdd": {}, - "testResultNone": "No Test Results", + "testResultNone": "Ingen Testresultater", "@testResultNone": {}, - "testResultNoneDetail": "No test results available", + "testResultNoneDetail": "Ingen testresultater tilgængelige", "@testResultNoneDetail": {}, - "testResultUploadFail": "Error uploading test result", + "testResultUploadFail": "Fejl under upload af testresultat", "@testResultUploadFail": {}, - "testResultUploadPass": "Test result uploaded", + "testResultUploadPass": "Test resultat uploadet", "@testResultUploadPass": {}, "timeout": "Timeout", "@timeout": { "description": "" }, - "toggleTorch": "Toggle Torch", + "toggleTorch": "Tænd/sluk lys", "@toggleTorch": {}, - "tokenError": "Token Error", + "tokenError": "Token Fejl", "@tokenError": {}, - "tokenMissing": "Missing Token", + "tokenMissing": "Mangler Token", "@tokenMissing": {}, - "tokenMissingFromResponse": "Access token missing from response", + "tokenMissingFromResponse": "Adgangstoken mangler fra svar", "@tokenMissingFromResponse": {}, - "totalPrice": "Total Price", + "totalPrice": "Total Pris", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "Sporingsnummer", "@trackingNumber": {}, - "transfer": "Transfer", + "transfer": "Overfør", "@transfer": { "description": "transfer" }, - "transferStock": "Transfer Stock", + "transferStock": "Overfør Lager", "@transferStock": { "description": "transfer stock" }, - "transferStockDetail": "Transfer item to a different location", + "transferStockDetail": "Overfør element til en anden lokation", "@transferStockDetail": {}, - "transferStockLocation": "Transfer Stock Location", + "transferStockLocation": "Overføre lager lokation", "@transferStockLocation": {}, - "transferStockLocationDetail": "Transfer this stock location into another", + "transferStockLocationDetail": "Overfør denne lager lokation til en anden", "@transferStockLocationDetail": {}, - "translate": "Translate", + "translate": "Oversæt", "@translate": {}, - "translateHelp": "Help translate the InvenTree app", + "translateHelp": "Hjælp med at oversætte InvenTree appen", "@translateHelp": {}, - "unavailable": "Unavailable", + "unavailable": "Utilgængelig", "@unavailable": {}, - "unavailableDetail": "Item is not available", + "unavailableDetail": "Elementet er ikke tilgængeligt", "@unavailableDetail": {}, - "unitPrice": "Unit Price", + "unitPrice": "Enhedspris", "@unitPrice": {}, - "units": "Units", + "units": "Enheder", "@units": {}, - "unknownResponse": "Unknown Response", + "unknownResponse": "Ukendt Svar", "@unknownResponse": {}, "upload": "Upload", "@upload": {}, - "uploadFailed": "File upload failed", + "uploadFailed": "File upload mislykkedes", "@uploadFailed": {}, - "uploadSuccess": "File uploaded", + "uploadSuccess": "Fil uploadet", "@uploadSuccess": {}, - "uploadImage": "Upload Image", + "uploadImage": "Upload billede", "@uploadImage": {}, - "usedIn": "Used In", + "usedIn": "Brugt I", "@usedIn": {}, - "usedInDetails": "Assemblies which require this part", + "usedInDetails": "Samlinger som kræver denne del", "@usedInDetails": {}, - "username": "Username", + "username": "Brugernavn", "@username": {}, - "usernameEmpty": "Username cannot be empty", + "usernameEmpty": "Brugernavn kan ikke være tomt", "@usernameEmpty": {}, - "value": "Value", + "value": "Værdi", "@value": { "description": "value" }, - "valueCannotBeEmpty": "Value cannot be empty", + "valueCannotBeEmpty": "Værdien kan ikke være tom", "@valueCannotBeEmpty": {}, - "valueRequired": "Value is required", + "valueRequired": "Værdi er påkrævet", "@valueRequired": {}, - "variants": "Variants", + "variants": "Varianter", "@variants": {}, "version": "Version", "@version": {}, - "viewSupplierPart": "View Supplier Part", + "viewSupplierPart": "Vis Leverandør Del", "@viewSupplierPart": {}, - "website": "Website", + "website": "Hjemmeside", "@website": {}, - "yes": "Yes", + "yes": "Ja", "@yes": {}, - "price": "Price", + "price": "Pris", "@price": {}, - "priceRange": "Price Range", + "priceRange": "Prisklasse", "@priceRange": {}, - "priceOverrideMin": "Minimum Price Override", + "priceOverrideMin": "Tilsidesættelse af minimumspris", "@priceOverrideMin": {}, - "priceOverrideMax": "Maximum Price Override", + "priceOverrideMax": "Tilsidesættelse af maksimalpris", "@priceOverrideMax": {}, - "salePrice": "Sale Price", + "salePrice": "Salgspris", "@salePrice": {}, - "saleHistory": "Sale History", + "saleHistory": "Salgs Historik", "@saleHistory": {}, - "supplierPricing": "Supplier Pricing", + "supplierPricing": "Leverandør Pris", "@supplierPricing": {}, - "bomCost": "BOM Cost", + "bomCost": "Stykliste Pris", "@bomCost": {}, - "internalCost": "Internal Cost", + "internalCost": "Intern Omkostning", "@internalCost": {}, - "variantCost": "Variant Cost", + "variantCost": "Variant Pris", "@variantCost": {}, - "overallPricing": "Overall Pricing", + "overallPricing": "Samlet prisfastsættelse", "@overallPricing": {}, - "pricingOverrides": "Pricing Overrides", + "pricingOverrides": "Tilsidesætter Prisfastsættelse", "@pricingOverrides": {}, - "currency": "Currency", + "currency": "Valuta", "@currency": {}, - "priceBreaks": "Price Breaks", + "priceBreaks": "Prispauser", "@priceBreaks": {} } \ No newline at end of file diff --git a/lib/l10n/es_MX/app_es_MX.arb b/lib/l10n/es_MX/app_es_MX.arb index 4f0ec84f..11970823 100644 --- a/lib/l10n/es_MX/app_es_MX.arb +++ b/lib/l10n/es_MX/app_es_MX.arb @@ -962,7 +962,7 @@ "@shipmentReference": {}, "shipmentSend": "Send Shipment", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Deseleccionar Envío", "@shipmentUncheck": {}, "shipmentUncheckDetail": "Mark this shipment as unchecked", "@shipmentUncheckDetail": {}, @@ -1068,7 +1068,7 @@ "@suppliers": {}, "supplierReference": "Referencia del proveedor", "@supplierReference": {}, - "switchCamera": "Switch Camera", + "switchCamera": "Cambiar Cámara", "@switchCamera": {}, "takePicture": "Tomar una foto", "@takePicture": {}, @@ -1148,7 +1148,7 @@ "@uploadFailed": {}, "uploadSuccess": "Archivo subido", "@uploadSuccess": {}, - "uploadImage": "Upload Image", + "uploadImage": "Subir Imagen", "@uploadImage": {}, "usedIn": "Usado en", "@usedIn": {}, diff --git a/lib/l10n/fa_IR/app_fa_IR.arb b/lib/l10n/fa_IR/app_fa_IR.arb index 02358b03..ceb836db 100644 --- a/lib/l10n/fa_IR/app_fa_IR.arb +++ b/lib/l10n/fa_IR/app_fa_IR.arb @@ -36,17 +36,17 @@ "@appDetails": {}, "allocated": "اختصاص داده شده", "@allocated": {}, - "aspectRatio16x9": "16:9", + "aspectRatio16x9": "۱۶ به ۹", "@aspectRatio16x9": {}, - "aspectRatio3x2": "3:2", + "aspectRatio3x2": "۳ به ۲", "@aspectRatio3x2": {}, - "aspectRatio4x3": "4:3", + "aspectRatio4x3": "۴ به ۳", "@aspectRatio4x3": {}, - "aspectRatioSquare": "Square (1:1)", + "aspectRatioSquare": "مربعی (۱ به ۱)", "@aspectRatioSquare": {}, "allocateStock": "موجودی اختصاص داده شده", "@allocateStock": {}, - "allocatedStock": "Allocated Stock", + "allocatedStock": "موجودی اختصاص داده شده", "@allocatedStock": {}, "appReleaseNotes": "نمایش یادداشت های انتشار برنامه", "@appReleaseNotes": {}, @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "اسکن بارکد متوقف شد", "@barodeScanPaused": {}, - "barcodeScanPause": "Tap to pause scanning", + "barcodeScanPause": "برای توقف اسکن لمس کنید", "@barcodeScanPause": {}, "barcodeScanAssign": "برای اختصاص بارکد اسکن کنید", "@barcodeScanAssign": {}, @@ -180,9 +180,9 @@ "@companyUpdated": {}, "companies": "شرکت‌ها", "@companies": {}, - "complete": "Complete", + "complete": "تکمیل", "@complete": {}, - "completeOrder": "Complete Order", + "completeOrder": "تکمیل سفارش", "@completeOrder": {}, "completionDate": "تاریخ تکمیل", "@completionDate": {}, @@ -204,9 +204,9 @@ }, "credits": "اعتبارات", "@credits": {}, - "crop": "Crop", + "crop": "برش", "@crop": {}, - "cropImage": "Crop Image", + "cropImage": "برش تصویر", "@cropImage": {}, "customer": "مشتری", "@customer": {}, @@ -228,11 +228,11 @@ "@delete": {}, "deleteFailed": "عملیات حذف ناموفق بوده است", "@deleteFailed": {}, - "deleteImageConfirmation": "Are you sure you want to delete this image?", + "deleteImageConfirmation": "آیا مطمئن هستید که میخواهید این تصویر را حذف کنید؟", "@deleteImageConfirmation": {}, - "deleteImageTooltip": "Delete Image", + "deleteImageTooltip": "حذف تصویر", "@deleteImageTooltip": {}, - "deleteImage": "Delete Image", + "deleteImage": "حذف تصویر", "@deleteImage": {}, "deletePart": "حذف قسمت", "@deletePart": {}, @@ -240,7 +240,7 @@ "@deletePartDetail": {}, "deleteSuccess": "عملیات حذف با موفقیت انجام شد", "@deleteSuccess": {}, - "deliveryDate": "Delivery Date", + "deliveryDate": "تاریخ تحویل", "@deliveryDate": {}, "description": "توضیحات", "@description": {}, @@ -254,9 +254,9 @@ }, "documentation": "مستندات", "@documentation": {}, - "downloadComplete": "Download Complete", + "downloadComplete": "دانلود انجام شد", "@downloadComplete": {}, - "downloadError": "Error downloading image", + "downloadError": "خطای دانلود تصویر", "@downloadError": {}, "downloading": "در حال دانلود فایل", "@downloading": {}, @@ -282,7 +282,7 @@ "@editItem": {}, "editLineItem": "ویرایش ایتم خط", "@editLineItem": {}, - "email": "Email", + "email": "پست الکترونیکی", "@email": {}, "enterPassword": "رمز عبور را وارد کنید", "@enterPassword": {}, @@ -384,9 +384,9 @@ "@homeShowPo": {}, "homeShowPoDescription": "نمایش دکمه سفارش خرید در صفحه خانه", "@homeShowPoDescription": {}, - "homeShowShipments": "Show Shipments", + "homeShowShipments": "نمایش محموله", "@homeShowShipments": {}, - "homeShowShipmentsDescription": "Show pending shipments on the home screen", + "homeShowShipmentsDescription": "نمایش محموله در انتظار ارسال بر روی صفحه اصلی", "@homeShowShipmentsDescription": {}, "homeShowSo": "نمایش سفارش های فروش", "@homeShowSo": {}, @@ -454,9 +454,9 @@ "@invalidSupplierPart": {}, "invalidUsernamePassword": "ترکیب نام کاربری / رمز عبور نامعتبر", "@invalidUsernamePassword": {}, - "invoice": "Invoice", + "invoice": "صورت‌حساب", "@invoice": {}, - "invoiceNumber": "Invoice Number", + "invoiceNumber": "شماره صورت‌حساب", "@invoiceNumber": {}, "issue": "موضوع", "@issue": {}, @@ -472,9 +472,9 @@ "@itemUpdated": {}, "keywords": "کلمات کلیدی", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "درایور چاپگر برچسب", "@labelDriver": {}, - "labelSelectDriver": "Select Label Printer Driver", + "labelSelectDriver": "انتخاب درایور چاپگر برچسب", "@labelSelectDriver": {}, "labelPrinting": "چاپ لیبل", "@labelPrinting": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "مکان سهام جدید ایجاد کنید", "@locationCreateDetail": {}, - "locationDefault": "Default Location", + "locationDefault": "مکان پیش‌فرض", "@locationDefault": {}, "locationNotSet": "هیچ مکانی مشخص نشده است", "@locationNotSet": {}, @@ -544,9 +544,9 @@ "@missingData": {}, "name": "نام", "@name": {}, - "no": "No", + "no": "خیر", "@no": {}, - "notApplicable": "N/A", + "notApplicable": "موجود نیست", "@notApplicable": {}, "notConnected": "متصل نیست", "@notConnected": {}, @@ -562,11 +562,11 @@ "@noResponse": {}, "noResults": "بدون نتیجه", "@noResults": {}, - "noImageAvailable": "No image available", + "noImageAvailable": "هیچ تصویری موجود نیست", "@noImageAvailable": {}, - "noPricingAvailable": "No pricing available", + "noPricingAvailable": "هیچ قیمتی موجود نیست", "@noPricingAvailable": {}, - "noPricingDataFound": "No pricing data found for this part", + "noPricingDataFound": "هیچ اطلاعات قیمتی برای این قطعه یافت نشد", "@noPricingDataFound": {}, "noSubcategories": "بدون زیر دسته بندی", "@noSubcategories": {}, @@ -630,9 +630,9 @@ "@partsNone": {}, "partNoResults": "هیچ قطعه ای مطابق با جست و جو یافت نشد", "@partNoResults": {}, - "partPricing": "Part Pricing", + "partPricing": "قیمت‌گذاری قطعات", "@partPricing": {}, - "partPricingSettingDetail": "Display part pricing information", + "partPricingSettingDetail": "نمایش اطلاعات قیمت‌گذاری قطعات", "@pricingSettingDetail": {}, "partSettings": "تنظیمات قطعه", "@partSettings": {}, @@ -660,13 +660,13 @@ "@password": {}, "passwordEmpty": "رمز عبور نمی تواند خالی باشد", "@passwordEmpty": {}, - "pending": "Pending", + "pending": "در حال بررسی", "@pending": {}, "permissionAccountDenied": "حساب شما مجوزهای لازم برای انجام این عمل را ندارد", "@permissionAccountDenied": {}, "permissionRequired": "نیازمند مجوز", "@permissionRequired": {}, - "phone": "Phone", + "phone": "تماس", "@phone": {}, "printLabel": "پرینت برچسب", "@printLabel": {}, @@ -762,7 +762,7 @@ "@reference": {}, "refresh": "تازه سازی", "@refresh": {}, - "rotateClockwise": "Rotate 90° clockwise", + "rotateClockwise": "چرخش °90 درجه در جهت عقربه های ساعت", "@rotateClockwise": {}, "refreshing": "در حال تازه سازی", "@refreshing": {}, @@ -940,33 +940,33 @@ "@serverNotConnected": {}, "serverNotSelected": "سرور انتخاب نشده است", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "محموله", "@shipment": {}, "shipments": "محموله ها", "@shipments": {}, - "shipmentsPending": "Pending Shipments", + "shipmentsPending": "محموله در انتظار ارسال", "@shipmentsPending": {}, "shipmentAdd": "افزودن محموله", "@shipmentAdd": {}, - "shipmentCheck": "Check Shipment", + "shipmentCheck": "بررسی محموله", "@shipmentCheck": {}, - "shipmentCheckDetail": "Mark this shipment as checked", + "shipmentCheckDetail": "این محموله را بررسی شده علامت گذاری کن", "@shipmentCheckDetail": {}, - "shipmentChecked": "Shipment Checked", + "shipmentChecked": "محموله بررسی شده", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "تاریخ ارسال", "@shipmentDate": {}, - "shipmentEdit": "Edit Shipment", + "shipmentEdit": "تغییر محموله", "@shipmentEdit": {}, - "shipmentReference": "Shipment Reference", + "shipmentReference": "کد محموله", "@shipmentReference": {}, - "shipmentSend": "Send Shipment", + "shipmentSend": "ارسال محموله", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "محموله بررسی نشده", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "این محموله را بررسی نشده علامت گذاری کن", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "محموله به روز رسانی شد", "@shipmentUpdated": {}, "shipped": "ارسال شده", "@shipped": {}, @@ -1112,7 +1112,7 @@ "@tokenMissingFromResponse": {}, "totalPrice": "قیمت کل", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "کد رهگیری", "@trackingNumber": {}, "transfer": "انتقال", "@transfer": { @@ -1148,7 +1148,7 @@ "@uploadFailed": {}, "uploadSuccess": "فایل اپلود شد", "@uploadSuccess": {}, - "uploadImage": "Upload Image", + "uploadImage": "بارگذاری تصویر", "@uploadImage": {}, "usedIn": "استفاده شده در", "@usedIn": {}, @@ -1174,34 +1174,34 @@ "@viewSupplierPart": {}, "website": "وب سایت", "@website": {}, - "yes": "Yes", + "yes": "بله", "@yes": {}, - "price": "Price", + "price": "قیمت", "@price": {}, - "priceRange": "Price Range", + "priceRange": "بازه‌ قیمت", "@priceRange": {}, - "priceOverrideMin": "Minimum Price Override", + "priceOverrideMin": "قیمت دستی مینیمم", "@priceOverrideMin": {}, - "priceOverrideMax": "Maximum Price Override", + "priceOverrideMax": "قیمت دستی ماکزیمم", "@priceOverrideMax": {}, - "salePrice": "Sale Price", + "salePrice": "قیمت حراج", "@salePrice": {}, - "saleHistory": "Sale History", + "saleHistory": "تاریخچه حراج", "@saleHistory": {}, - "supplierPricing": "Supplier Pricing", + "supplierPricing": "قیمت تامین کننده", "@supplierPricing": {}, - "bomCost": "BOM Cost", + "bomCost": "هزینه تمام شده", "@bomCost": {}, - "internalCost": "Internal Cost", + "internalCost": "هزینه داخلی", "@internalCost": {}, - "variantCost": "Variant Cost", + "variantCost": "هزینه متغیر", "@variantCost": {}, - "overallPricing": "Overall Pricing", + "overallPricing": "قیمت نهایی", "@overallPricing": {}, - "pricingOverrides": "Pricing Overrides", + "pricingOverrides": "قیمت دستی", "@pricingOverrides": {}, - "currency": "Currency", + "currency": "واحد پول", "@currency": {}, - "priceBreaks": "Price Breaks", + "priceBreaks": "کاهش قیمت", "@priceBreaks": {} } \ No newline at end of file diff --git a/lib/l10n/pl_PL/app_pl_PL.arb b/lib/l10n/pl_PL/app_pl_PL.arb index ac7a6c24..5aa8e5c5 100644 --- a/lib/l10n/pl_PL/app_pl_PL.arb +++ b/lib/l10n/pl_PL/app_pl_PL.arb @@ -1202,6 +1202,6 @@ "@pricingOverrides": {}, "currency": "Waluta", "@currency": {}, - "priceBreaks": "Price Breaks", + "priceBreaks": "Widełki cenowe", "@priceBreaks": {} } \ No newline at end of file diff --git a/lib/l10n/ro_RO/app_ro_RO.arb b/lib/l10n/ro_RO/app_ro_RO.arb index 6f07c0dc..adfed52c 100644 --- a/lib/l10n/ro_RO/app_ro_RO.arb +++ b/lib/l10n/ro_RO/app_ro_RO.arb @@ -834,374 +834,374 @@ }, "returned": "Returnat", "@returned": {}, - "salesOrder": "Sales Order", + "salesOrder": "Comenzi de Vânzare", "@salesOrder": {}, - "salesOrders": "Sales Orders", + "salesOrders": "Comenzi de Vânzare", "@salesOrders": {}, - "salesOrderEnable": "Enable Sales Orders", + "salesOrderEnable": "Activează Comenzile de Vânzări", "@salesOrderEnable": {}, - "salesOrderEnableDetail": "Enable sales order functionality", + "salesOrderEnableDetail": "Activați funcționalitatea comenzilor de vânzare", "@salesOrderEnableDetail": {}, - "salesOrderShowCamera": "Camera Shortcut", + "salesOrderShowCamera": "Scurtătura Cameră", "@salesOrderShowCamera": {}, - "salesOrderShowCameraDetail": "Enable image upload shortcut on sales order screen", + "salesOrderShowCameraDetail": "Activează scurtătura de încărcare a imaginilor pe ecranul comenzii de vânzare", "@salesOrderShowCameraDetail": {}, - "salesOrderSettings": "Sales order settings", + "salesOrderSettings": "Setările comenzii de vânzare", "@salesOrderSettings": {}, - "salesOrderCreate": "New Sales Order", + "salesOrderCreate": "Comandă de vânzări nouă", "@saleOrderCreate": {}, - "salesOrderEdit": "Edit Sales Order", + "salesOrderEdit": "Editează Comanda de Vânzare", "@salesOrderEdit": {}, - "salesOrderUpdated": "Sales order updated", + "salesOrderUpdated": "Comanda de vanzare actualizată", "@salesOrderUpdated": {}, - "save": "Save", + "save": "Salvaţi", "@save": { "description": "Save" }, - "scanBarcode": "Scan Barcode", + "scanBarcode": "Scanați codul de bare", "@scanBarcode": {}, - "scanSupplierPart": "Scan supplier part barcode", + "scanSupplierPart": "Scanare cod de bare furnizor", "@scanSupplierPart": {}, - "scanIntoLocation": "Scan Into Location", + "scanIntoLocation": "Scanare în locație", "@scanIntoLocation": {}, - "scanIntoLocationDetail": "Scan this item into location", + "scanIntoLocationDetail": "Scanează acest articol în locație", "@scanIntoLocationDetail": {}, - "scannerExternal": "External Scanner", + "scannerExternal": "Scanner extern", "@scannerExternal": {}, - "scannerExternalDetail": "Use external scanner to read barcodes (wedge mode)", + "scannerExternalDetail": "Utilizează scanerul extern pentru a citi codurile de bare (modul wedge)", "@scannerExternalDetail": {}, - "scanReceivedParts": "Scan Received Parts", + "scanReceivedParts": "Scanați capitolele primite", "@scanReceivedParts": {}, - "search": "Search", + "search": "Caută", "@search": { "description": "search" }, - "searching": "Searching", + "searching": "Căutare", "@searching": {}, - "searchLocation": "Search for location", + "searchLocation": "Căutați locația", "@searchLocation": {}, - "searchParts": "Search Parts", + "searchParts": "Caută componente", "@searchParts": {}, - "searchStock": "Search Stock", + "searchStock": "Căutare Stoc", "@searchStock": {}, - "select": "Select", + "select": "Selectează", "@select": {}, - "selectFile": "Select File", + "selectFile": "Selectează fișier", "@selectFile": {}, - "selectImage": "Select Image", + "selectImage": "Selectează imagine", "@selectImage": {}, - "selectLocation": "Select a location", + "selectLocation": "Selectați o locație", "@selectLocation": {}, - "send": "Send", + "send": "Trimite", "@send": {}, - "serialNumber": "Serial Number", + "serialNumber": "Număr de serie", "@serialNumber": {}, - "serialNumbers": "Serial Numbers", + "serialNumbers": "Număr de serie", "@serialNumbers": {}, "server": "Server", "@server": {}, - "serverAddress": "Server Address", + "serverAddress": "Adresă server", "@serverAddress": {}, - "serverApiRequired": "Required API Version", + "serverApiRequired": "Versiunea API necesară", "@serverApiRequired": {}, - "serverApiVersion": "Server API Version", + "serverApiVersion": "Versiune API server", "@serverApiVersion": {}, - "serverAuthenticationError": "Authentication Error", + "serverAuthenticationError": "Eroare autentificare", "@serverAuthenticationError": {}, "serverCertificateError": "Cerficate Error", "@serverCertificateError": {}, - "serverCertificateInvalid": "Server HTTPS certificate is invalid", + "serverCertificateInvalid": "Certificatul HTTPS al serverului nu este valid", "@serverCertificateInvalid": {}, - "serverConnected": "Connected to Server", + "serverConnected": "Conectare la server", "@serverConnected": {}, - "serverConnecting": "Connecting to server", + "serverConnecting": "Se conecteaza la server", "@serverConnecting": {}, - "serverCouldNotConnect": "Could not connect to server", + "serverCouldNotConnect": "Nu s-a putut conecta la server", "@serverCouldNotConnect": {}, - "serverEmpty": "Server cannot be empty", + "serverEmpty": "Serverul nu poate fi gol", "@serverEmpty": {}, - "serverError": "Server Error", + "serverError": "Eroare de server", "@serverError": {}, - "serverDetails": "Server Details", + "serverDetails": "Detalii despre server", "@serverDetails": {}, - "serverMissingData": "Server response missing required fields", + "serverMissingData": "Răspuns server lipsă câmpuri obligatorii", "@serverMissingData": {}, - "serverOld": "Old Server Version", + "serverOld": "Versiunea veche a serverului", "@serverOld": {}, - "serverSettings": "Server Settings", + "serverSettings": "Setări server", "@serverSettings": {}, - "serverStart": "Server must start with http[s]", + "serverStart": "Serverul trebuie să înceapă cu http[s]", "@serverStart": {}, - "settings": "Settings", + "settings": "Setări", "@settings": {}, - "serverInstance": "Server Instance", + "serverInstance": "Instanță server", "@serverInstance": {}, - "serverNotConnected": "Server not connected", + "serverNotConnected": "Serverul nu este conectat", "@serverNotConnected": {}, - "serverNotSelected": "Server not selected", + "serverNotSelected": "Serverul nu este selectat", "@serverNotSelected": {}, - "shipment": "Shipment", + "shipment": "Expediere", "@shipment": {}, - "shipments": "Shipments", + "shipments": "Livrări", "@shipments": {}, - "shipmentsPending": "Pending Shipments", + "shipmentsPending": "Livrări în așteptare", "@shipmentsPending": {}, - "shipmentAdd": "Add Shipment", + "shipmentAdd": "Adaugă livrare", "@shipmentAdd": {}, - "shipmentCheck": "Check Shipment", + "shipmentCheck": "Verifica livrare", "@shipmentCheck": {}, - "shipmentCheckDetail": "Mark this shipment as checked", + "shipmentCheckDetail": "Marchează livrarea ca verificată", "@shipmentCheckDetail": {}, - "shipmentChecked": "Shipment Checked", + "shipmentChecked": "Livrare verificată", "@shipmentChecked": {}, - "shipmentDate": "Shipment Date", + "shipmentDate": "Data livrării", "@shipmentDate": {}, - "shipmentEdit": "Edit Shipment", + "shipmentEdit": "Editare livrare", "@shipmentEdit": {}, - "shipmentReference": "Shipment Reference", + "shipmentReference": "Referință livrare", "@shipmentReference": {}, - "shipmentSend": "Send Shipment", + "shipmentSend": "Livrare Trimisa", "@shipmentSend": {}, - "shipmentUncheck": "Uncheck Shipment", + "shipmentUncheck": "Debifează livrare", "@shipmentUncheck": {}, - "shipmentUncheckDetail": "Mark this shipment as unchecked", + "shipmentUncheckDetail": "Marchează livrarea ca nebifat", "@shipmentUncheckDetail": {}, - "shipmentUpdated": "Shipment Updated", + "shipmentUpdated": "Livrare actualizată", "@shipmentUpdated": {}, - "shipped": "Shipped", + "shipped": "Livrat", "@shipped": {}, "sku": "SKU", "@sku": {}, - "sounds": "Sounds", + "sounds": "Sunete", "@sounds": {}, - "soundOnBarcodeAction": "Play audible tone on barcode action", + "soundOnBarcodeAction": "Redă ton sonor la acțiunea codului de bare", "@soundOnBarcodeAction": {}, - "soundOnServerError": "Play audible tone on server error", + "soundOnServerError": "Redă sunetul sonor la eroarea serverului", "@soundOnServerError": {}, - "startDate": "Start Date", + "startDate": "Data inceput", "@startDate": {}, "status": "Status", "@status": {}, "statusCode": "Status Code", "@statusCode": {}, - "stock": "Stock", + "stock": "Stoc", "@stock": { "description": "stock" }, - "stockDetails": "Current available stock quantity", + "stockDetails": "Stoc disponibil curent", "@stockDetails": {}, - "stockItem": "Stock Item", + "stockItem": "Articol Stoc", "@stockItem": { "description": "stock item title" }, - "stockItems": "Stock Items", + "stockItems": "Articol Stoc", "@stockItems": {}, - "stockItemCreate": "New Stock Item", + "stockItemCreate": "Element nou în stoc", "@stockItemCreate": {}, - "stockItemCreateDetail": "Create new stock item in this location", + "stockItemCreateDetail": "Crează element nou în stoc în această locație", "@stockItemCreateDetail": {}, - "stockItemDelete": "Delete Stock Item", + "stockItemDelete": "Şterge elementul din stoc", "@stockItemDelete": {}, - "stockItemDeleteConfirm": "Are you sure you want to delete this stock item?", + "stockItemDeleteConfirm": "Sunteţi sigur că doriţi să ştergeţi acest articol din stoc?", "@stockItemDeleteConfirm": {}, - "stockItemDeleteFailure": "Could not delete stock item", + "stockItemDeleteFailure": "Nu s-a putut șterge articolul din stoc", "@stockItemDeleteFailure": {}, - "stockItemDeleteSuccess": "Stock item deleted", + "stockItemDeleteSuccess": "Articol șters", "@stockItemDeleteSuccess": {}, - "stockItemHistory": "Stock History", + "stockItemHistory": "Istoric Stoc", "@stockItemHistory": {}, - "stockItemHistoryDetail": "Display historical stock tracking information", + "stockItemHistoryDetail": "Afişează informaţii istorice de urmărire stoc", "@stockItemHistoryDetail": {}, - "stockItemTransferred": "Stock item transferred", + "stockItemTransferred": "Articol stoc transferat", "@stockItemTransferred": {}, - "stockItemUpdated": "Stock item updated", + "stockItemUpdated": "Articol stoc actualizat", "@stockItemUpdated": {}, - "stockItemsNotAvailable": "No stock items available", + "stockItemsNotAvailable": "Nu sunt articole disponibile în stoc", "@stockItemsNotAvailable": {}, - "stockItemNotes": "Stock Item Notes", + "stockItemNotes": "Note element de stoc", "@stockItemNotes": {}, - "stockItemUpdateSuccess": "Stock item updated", + "stockItemUpdateSuccess": "Articol stoc actualizat", "@stockItemUpdateSuccess": {}, - "stockItemUpdateFailure": "Stock item update failed", + "stockItemUpdateFailure": "Actualizarea articolului stoc a eșuat", "@stockItemUpdateFailure": {}, - "stockLocation": "Stock Location", + "stockLocation": "Locația stocului", "@stockLocation": { "description": "stock location" }, - "stockLocations": "Stock Locations", + "stockLocations": "Locația stocului", "@stockLocations": {}, - "stockTopLevel": "Top level stock location", + "stockTopLevel": "Locație stoc nivel superior", "@stockTopLevel": {}, - "strictHttps": "Use Strict HTTPS", + "strictHttps": "Folosește HTTPS Strict", "@strictHttps": {}, - "strictHttpsDetails": "Enforce strict checking of HTTPs certificates", + "strictHttpsDetails": "Impune controlul strict al certificatelor HTTP", "@strictHttpsDetails": {}, - "subcategory": "Subcategory", + "subcategory": "Subcategorie", "@subcategory": {}, - "subcategories": "Subcategories", + "subcategories": "Subcategorii", "@subcategories": {}, - "sublocation": "Sublocation", + "sublocation": "Sublocare", "@sublocation": {}, - "sublocations": "Sublocations", + "sublocations": "Sublocare", "@sublocations": {}, - "sublocationNone": "No Sublocations", + "sublocationNone": "Fără sublocări", "@sublocationNone": {}, - "sublocationNoneDetail": "No sublocations available", + "sublocationNoneDetail": "Nu există sublocații disponibile", "@sublocationNoneDetail": {}, - "submitFeedback": "Submit Feedback", + "submitFeedback": "Trimiteți feedback", "@submitFeedback": {}, - "suppliedParts": "Supplied Parts", + "suppliedParts": "Piese furnizate", "@suppliedParts": {}, - "supplier": "Supplier", + "supplier": "Furnizor", "@supplier": {}, - "supplierPart": "Supplier Part", + "supplierPart": "Piesă Furnizor", "@supplierPart": {}, - "supplierPartEdit": "Edit Supplier Part", + "supplierPartEdit": "Editați articol furnizorului", "@supplierPartEdit": {}, - "supplierPartNumber": "Supplier Part Number", + "supplierPartNumber": "Cod furnizor", "@supplierPartNumber": {}, - "supplierPartUpdated": "Supplier Part Updated", + "supplierPartUpdated": "Cod furnizor actualizat", "@supplierPartUpdated": {}, - "supplierParts": "Supplier Parts", + "supplierParts": "Piese Furnizor", "@supplierParts": {}, - "suppliers": "Suppliers", + "suppliers": "Furnizori", "@suppliers": {}, - "supplierReference": "Supplier Reference", + "supplierReference": "Cod furnizor", "@supplierReference": {}, - "switchCamera": "Switch Camera", + "switchCamera": "Comutați Camera", "@switchCamera": {}, - "takePicture": "Take Picture", + "takePicture": "Faceți o fotografie", "@takePicture": {}, - "targetDate": "Target Date", + "targetDate": "Data țintă", "@targetDate": {}, - "templatePart": "Parent Template Part", + "templatePart": "Capitol șablon părinte", "@templatePart": {}, - "testName": "Test Name", + "testName": "Nume test", "@testName": {}, - "testPassedOrFailed": "Test passed or failed", + "testPassedOrFailed": "Testul a trecut sau a eșuat", "@testPassedOrFailed": {}, - "testsRequired": "Required Tests", + "testsRequired": "Teste necesare", "@testsRequired": {}, - "testResults": "Test Results", + "testResults": "Rezultatele testului", "@testResults": { "description": "" }, - "testResultsDetail": "Display stock item test results", + "testResultsDetail": "Afișează rezultatele testului produsului în stoc", "@testResultsDetail": {}, - "testResultAdd": "Add Test Result", + "testResultAdd": "Adăugare rezultat test", "@testResultAdd": {}, - "testResultNone": "No Test Results", + "testResultNone": "Niciun rezultat de test", "@testResultNone": {}, - "testResultNoneDetail": "No test results available", + "testResultNoneDetail": "Nici un rezultat de test disponibil", "@testResultNoneDetail": {}, - "testResultUploadFail": "Error uploading test result", + "testResultUploadFail": "Eroare încărcare rezultat test", "@testResultUploadFail": {}, - "testResultUploadPass": "Test result uploaded", + "testResultUploadPass": "Rezultat test încărcat", "@testResultUploadPass": {}, "timeout": "Timeout", "@timeout": { "description": "" }, - "toggleTorch": "Toggle Torch", + "toggleTorch": "Comutare lanternă", "@toggleTorch": {}, - "tokenError": "Token Error", + "tokenError": "Eroare token", "@tokenError": {}, - "tokenMissing": "Missing Token", + "tokenMissing": "Token lipsă", "@tokenMissing": {}, - "tokenMissingFromResponse": "Access token missing from response", + "tokenMissingFromResponse": "Token-ul de acces lipsește din răspuns", "@tokenMissingFromResponse": {}, - "totalPrice": "Total Price", + "totalPrice": "Preț total", "@totalPrice": {}, - "trackingNumber": "Tracking Number", + "trackingNumber": "Număr de urmărire", "@trackingNumber": {}, "transfer": "Transfer", "@transfer": { "description": "transfer" }, - "transferStock": "Transfer Stock", + "transferStock": "Transfera stoc", "@transferStock": { "description": "transfer stock" }, - "transferStockDetail": "Transfer item to a different location", + "transferStockDetail": "Transferați articolul într-o locație diferită", "@transferStockDetail": {}, - "transferStockLocation": "Transfer Stock Location", + "transferStockLocation": "Transfer locație stoc", "@transferStockLocation": {}, - "transferStockLocationDetail": "Transfer this stock location into another", + "transferStockLocationDetail": "Transferați această locație a stocului în alta", "@transferStockLocationDetail": {}, - "translate": "Translate", + "translate": "Traduceți", "@translate": {}, - "translateHelp": "Help translate the InvenTree app", + "translateHelp": "Ajută la traducerea aplicației InvenTree", "@translateHelp": {}, - "unavailable": "Unavailable", + "unavailable": "Indisponibil", "@unavailable": {}, - "unavailableDetail": "Item is not available", + "unavailableDetail": "Articolul nu este disponibil", "@unavailableDetail": {}, - "unitPrice": "Unit Price", + "unitPrice": "Preţ Unitar", "@unitPrice": {}, - "units": "Units", + "units": "Unități", "@units": {}, - "unknownResponse": "Unknown Response", + "unknownResponse": "Răspuns necunoscut", "@unknownResponse": {}, - "upload": "Upload", + "upload": "Încărcaţi", "@upload": {}, - "uploadFailed": "File upload failed", + "uploadFailed": "Încărcare fișier eșuată", "@uploadFailed": {}, - "uploadSuccess": "File uploaded", + "uploadSuccess": "Fişier încărcat", "@uploadSuccess": {}, - "uploadImage": "Upload Image", + "uploadImage": "Încărcare imagine", "@uploadImage": {}, - "usedIn": "Used In", + "usedIn": "Folosite în", "@usedIn": {}, - "usedInDetails": "Assemblies which require this part", + "usedInDetails": "Ansambluri care necesită aceast articol", "@usedInDetails": {}, "username": "Nume utilizator", "@username": {}, "usernameEmpty": "Numele de utilizator nu poate fi gol", "@usernameEmpty": {}, - "value": "Value", + "value": "Valoare", "@value": { "description": "value" }, - "valueCannotBeEmpty": "Value cannot be empty", + "valueCannotBeEmpty": "Valoarea nu poate fi goală", "@valueCannotBeEmpty": {}, - "valueRequired": "Value is required", + "valueRequired": "Valoarea este obligatorie", "@valueRequired": {}, - "variants": "Variants", + "variants": "Variante", "@variants": {}, - "version": "Version", + "version": "Verisune", "@version": {}, - "viewSupplierPart": "View Supplier Part", + "viewSupplierPart": "Vezi capitol furnizor", "@viewSupplierPart": {}, "website": "Website", "@website": {}, - "yes": "Yes", + "yes": "Da", "@yes": {}, - "price": "Price", + "price": "Preț", "@price": {}, - "priceRange": "Price Range", + "priceRange": "Interval de preț", "@priceRange": {}, - "priceOverrideMin": "Minimum Price Override", + "priceOverrideMin": "Suprascriere Preț Minim", "@priceOverrideMin": {}, - "priceOverrideMax": "Maximum Price Override", + "priceOverrideMax": "Suprascriere de preț maximă", "@priceOverrideMax": {}, - "salePrice": "Sale Price", + "salePrice": "Preț de vânzare", "@salePrice": {}, - "saleHistory": "Sale History", + "saleHistory": "Istoric vanzari", "@saleHistory": {}, - "supplierPricing": "Supplier Pricing", + "supplierPricing": "Prețurile furnizorului", "@supplierPricing": {}, - "bomCost": "BOM Cost", + "bomCost": "Cost BOM", "@bomCost": {}, - "internalCost": "Internal Cost", + "internalCost": "Cost intern", "@internalCost": {}, - "variantCost": "Variant Cost", + "variantCost": "Cost variantă", "@variantCost": {}, - "overallPricing": "Overall Pricing", + "overallPricing": "Preț general", "@overallPricing": {}, - "pricingOverrides": "Pricing Overrides", + "pricingOverrides": "Suprascrieri preturi", "@pricingOverrides": {}, - "currency": "Currency", + "currency": "Monedă", "@currency": {}, - "priceBreaks": "Price Breaks", + "priceBreaks": "Reduceri de preț", "@priceBreaks": {} } \ No newline at end of file diff --git a/lib/l10n/tr_TR/app_tr_TR.arb b/lib/l10n/tr_TR/app_tr_TR.arb index 464d3900..2281a9a3 100644 --- a/lib/l10n/tr_TR/app_tr_TR.arb +++ b/lib/l10n/tr_TR/app_tr_TR.arb @@ -10,7 +10,7 @@ }, "about": "Hakkında", "@about": {}, - "accountDetails": "Hesap Detayları", + "accountDetails": "Hesap Ayrıntıları", "@accountDetails": {}, "actions": "Eylemler", "@actions": { @@ -34,7 +34,7 @@ "@appCredits": {}, "appDetails": "Uygulama Ayrıntıları", "@appDetails": {}, - "allocated": "Tahsis edildi", + "allocated": "Tahsis Edildi", "@allocated": {}, "aspectRatio16x9": "16:9", "@aspectRatio16x9": {}, @@ -44,7 +44,7 @@ "@aspectRatio4x3": {}, "aspectRatioSquare": "Kare (1:1)", "@aspectRatioSquare": {}, - "allocateStock": "Tahsisli stok", + "allocateStock": "Stoku Tahsis Et", "@allocateStock": {}, "allocatedStock": "Tahsis Edilen Stok", "@allocatedStock": {}, @@ -60,7 +60,7 @@ "@assignedToMeDetail": {}, "attachments": "Ekler", "@attachments": {}, - "attachImage": "Resim ekle", + "attachImage": "Görsel Ekle", "@attachImage": { "description": "Attach an image" }, @@ -98,7 +98,7 @@ "@barcodeNotAssigned": {}, "barcodeScanPart": "Parça barkodnu tara", "@barcodeScanPart": {}, - "barcodeReceivePart": "Tesellüm barkodunu tara", + "barcodeReceivePart": "Parçayı teslim almak için barkodu tarayın", "@barcodeReceivePart": {}, "barcodeScanPaused": "Barkod tarama duraklatıldı", "@barodeScanPaused": {}, @@ -138,15 +138,15 @@ "@barcodeUnknown": {}, "batchCode": "Grup kodu", "@batchCode": {}, - "billOfMaterials": "Fatura materyalleri", + "billOfMaterials": "Ürün Ağacı", "@billOfMaterials": {}, "bom": "BOM", "@bom": {}, - "bomEnable": "Malzeme Listesini Görüntüle", + "bomEnable": "Ürün Ağacını Görüntüle", "@bomEnable": {}, - "build": "Yap", + "build": "Üret", "@build": {}, - "building": "Yapılıyor", + "building": "Üretiliyor", "@building": {}, "cameraCreationError": "Kamera Kontrolcüsü Açılamadı", "@cameraCreationError": {}, @@ -176,7 +176,7 @@ "@companyEdit": {}, "companyNoResults": "Sorguyla eşleşen şirket yok", "@companyNoResults": {}, - "companyUpdated": "Firma bilgileri güncellendi", + "companyUpdated": "Şirket bilgileri güncellendi", "@companyUpdated": {}, "companies": "Şirketler", "@companies": {}, @@ -206,7 +206,7 @@ "@credits": {}, "crop": "Kırp", "@crop": {}, - "cropImage": "Resmi Kırp", + "cropImage": "Görseli Kırp", "@cropImage": {}, "customer": "Müşteri", "@customer": {}, @@ -228,11 +228,11 @@ "@delete": {}, "deleteFailed": "Silme işlemi başarısız", "@deleteFailed": {}, - "deleteImageConfirmation": "Bu resmi silmek istediğinizden emin misiniz?", + "deleteImageConfirmation": "Bu görseli silmek istediğinize emin misiniz?", "@deleteImageConfirmation": {}, - "deleteImageTooltip": "Görüntüyü Sil", + "deleteImageTooltip": "Görseli Sil", "@deleteImageTooltip": {}, - "deleteImage": "Resmi sil", + "deleteImage": "Görseli sil", "@deleteImage": {}, "deletePart": "Parça Sil", "@deletePart": {}, @@ -244,11 +244,11 @@ "@deliveryDate": {}, "description": "Açıklama", "@description": {}, - "destination": "Varış Yeri", + "destination": "Hedef", "@destination": {}, "destroyed": "Yok edildi", "@destroyed": {}, - "details": "Detaylar", + "details": "Ayrıntılar", "@details": { "description": "details" }, @@ -280,7 +280,7 @@ }, "editItem": "Stok kalemi düzenle", "@editItem": {}, - "editLineItem": "Satır Ögesini Düzenle", + "editLineItem": "Satırı Düzenle", "@editLineItem": {}, "email": "E-posta", "@email": {}, @@ -316,9 +316,9 @@ "@expiryExpired": {}, "expiryStale": "Eskimiş", "@expiryStale": {}, - "extraLineItem": "Fazladan Satır Ögesi", + "extraLineItem": "Ek Kalem", "@extraLineItem": {}, - "extraLineItems": "Fazladan Satır Ögeleri", + "extraLineItems": "Ek Kalemler", "@extraLineItems": {}, "feedback": "Geri Bildirim", "@feedback": {}, @@ -392,9 +392,9 @@ "@homeShowSo": {}, "homeShowSoDescription": "Satış siparişleri tuşunu giriş ekranında göster", "@homeShowSoDescription": {}, - "homeShowSubscribed": "Parça bildirimlerine abone ol", + "homeShowSubscribed": "Takip Edilen Parçalar", "@homeShowSubscribed": {}, - "homeShowSubscribedDescription": "Abone olunan bölümleri ana ekranda göster", + "homeShowSubscribedDescription": "Takip edilen parçaları ana ekranda göster", "@homeShowSubscsribedDescription": {}, "homeShowSuppliers": "Tedarikçileri Göster", "@homeShowSuppliers": {}, @@ -408,13 +408,13 @@ "@homeShowCustomers": {}, "homeShowCustomersDescription": "Müşteri butonunu ana ekranda göster", "@homeShowCustomersDescription": {}, - "imageUploadFailure": "Fotoğraf yükleme başarısız", + "imageUploadFailure": "Görsel yükleme başarısız", "@imageUploadFailure": {}, - "imageUploadSuccess": "Resim yüklendi", + "imageUploadSuccess": "Görsel yüklendi", "@imageUploadSuccess": {}, "inactive": "Pasif", "@inactive": {}, - "inactiveCompany": "Bu şirket pasif olarak imlendi", + "inactiveCompany": "Bu şirket pasif olarak işaretlendi", "@inactiveCompany": {}, "inactiveDetail": "Bu parça pasif olarak işaretlendi", "@inactiveDetail": {}, @@ -432,7 +432,7 @@ "@internalPartNumber": {}, "info": "Bilgi", "@info": {}, - "inProduction": "Yapım Aşamasında", + "inProduction": "Üretimde", "@inProduction": {}, "inProductionDetail": "Bu stok kalemi üretimdedir", "@inProductionDetail": {}, @@ -462,7 +462,7 @@ "@issue": {}, "issueDate": "Sorun Tarihi", "@issueDate": {}, - "issueOrder": "Sipariş Ver", + "issueOrder": "Sipariş Düzenle", "@issueOrder": {}, "itemInLocation": "Parça zaten konumda", "@itemInLocation": {}, @@ -472,13 +472,13 @@ "@itemUpdated": {}, "keywords": "Anahtar kelimeler", "@keywords": {}, - "labelDriver": "Label Driver", + "labelDriver": "Etiket Sürücü", "@labelDriver": {}, "labelSelectDriver": "Etiket Yazıcı Sürücüsü Seçin", "@labelSelectDriver": {}, "labelPrinting": "Etiket Yazdırma", "@labelPrinting": {}, - "labelPrintingDetail": "Etiket yazdırmayı aktifleştir", + "labelPrintingDetail": "Etiket yazdırmayı etkinleştir", "@labelPrintingDetail": {}, "labelTemplate": "Etiket Şablonu", "@labelTemplate": {}, @@ -496,15 +496,15 @@ "@lastStocktake": {}, "lastUpdated": "Son güncelleme", "@lastUpdated": {}, - "level": "Düzey", + "level": "Seviye", "@level": {}, - "lineItemAdd": "Satır Ögesi Ekle", + "lineItemAdd": "Satır Ekle", "@lineItemAdd": {}, - "lineItem": "Parça Sırası", + "lineItem": "Satır", "@lineItem": {}, - "lineItems": "Parçalar Sırası", + "lineItems": "Satırlar", "@lineItems": {}, - "lineItemUpdated": "Satır ögesi güncellendi", + "lineItemUpdated": "Satır güncellendi", "@lineItemUpdated": {}, "locateItem": "Stok kalemi bul", "@locateItem": {}, @@ -562,7 +562,7 @@ "@noResponse": {}, "noResults": "Sonuç Yok", "@noResults": {}, - "noImageAvailable": "Kullanılabilir resim yok", + "noImageAvailable": "Görsel yok", "@noImageAvailable": {}, "noPricingAvailable": "Fiyatlandırma mevcut değil", "@noPricingAvailable": {}, @@ -588,9 +588,9 @@ "@orientationPortrait": {}, "orientationSystem": "Sistem", "@orientationSystem": {}, - "outstanding": "Beklemede", + "outstanding": "Açık", "@outstanding": {}, - "outstandingOrderDetail": "Bekleyen siparişleri göster", + "outstandingOrderDetail": "Açık siparişleri göster", "@outstandingOrderDetail": {}, "overdue": "Gecikmede", "@overdue": {}, @@ -624,7 +624,7 @@ "@parts": { "description": "Part (multiple)" }, - "partNotSalable": "Parça satılabilir olarak imlenmemiş", + "partNotSalable": "Parça satılabilir olarak işaretli değil", "@partNotSalable": {}, "partsNone": "Parça Yok", "@partsNone": {}, @@ -636,7 +636,7 @@ "@pricingSettingDetail": {}, "partSettings": "Parça Ayarları", "@partSettings": {}, - "partsStarred": "Sürekli Gelen parçalar", + "partsStarred": "Takip Edilen Parçalar", "@partsStarred": {}, "partsStarredNone": "Yıldızlı parça yok", "@partsStarredNone": {}, @@ -648,7 +648,7 @@ "@partCategoryTopLevel": {}, "partCategories": "Parça Kategorileri", "@partCategories": {}, - "partDetails": "Parça detayları", + "partDetails": "Parça Ayrıntıları", "@partDetails": {}, "partNotes": "Parça notları", "@partNotes": {}, @@ -710,7 +710,7 @@ "@projectCode": {}, "purchaseOrderConfirmScan": "Tarama Verisini Onayla", "@purchaseOrderConfirmScan": {}, - "purchaseOrderConfirmScanDetail": "Taranan Ürünlerin Detaylarını Onayla", + "purchaseOrderConfirmScanDetail": "Kalemleri tararken ayrıntıları onayla", "@purchaseOrderConfirmScanDetail": {}, "purchaseOrderEnable": "Satın Alma Siparişlerini Etkinleştir", "@purchaseOrderEnable": {}, @@ -718,7 +718,7 @@ "@purchaseOrderEnableDetail": {}, "purchaseOrderShowCamera": "Kamera Kısayolu", "@purchaseOrderShowCamera": {}, - "purchaseOrderShowCameraDetail": "Satın alma emirleri ekranında fotoğraf yükleme kısayolunu etkinleştir", + "purchaseOrderShowCameraDetail": "Satın alma siparişi ekranında görsel yükleme kısayolunu etkinleştir", "@purchaseOrderShowCameraDetail": {}, "purchaseOrder": "Satınalma Siparişi", "@purchaseOrder": {}, @@ -750,13 +750,13 @@ "@queryEmpty": {}, "queryNoResults": "Sorgu için sonuç yok", "@queryNoResults": {}, - "received": "Alınan", + "received": "Teslim Alındı", "@received": {}, - "receivedFilterDetail": "Alınan ögeleri göster", + "receivedFilterDetail": "Teslim alınan kalemleri göster", "@receivedFilterDetail": {}, - "receiveItem": "Alınan Öğeler", + "receiveItem": "Kalemi Teslim Al", "@receiveItem": {}, - "receivedItem": "Alınan stok kalemleri", + "receivedItem": "Teslim alınan stok kalemleri", "@receivedItem": {}, "reference": "Referans", "@reference": {}, @@ -844,7 +844,7 @@ "@salesOrderEnableDetail": {}, "salesOrderShowCamera": "Kamera Kısayolu", "@salesOrderShowCamera": {}, - "salesOrderShowCameraDetail": "Satış emirleri ekranında fotoğraf yükleme kısayolunu etkinleştir", + "salesOrderShowCameraDetail": "Satış siparişi ekranında görsel yükleme kısayolunu etkinleştir", "@salesOrderShowCameraDetail": {}, "salesOrderSettings": "Satış emirleri ayarları", "@salesOrderSettings": {}, @@ -870,7 +870,7 @@ "@scannerExternal": {}, "scannerExternalDetail": "Barkodları okumak için harici tarayıcı kullan (keyboard wedge modu)", "@scannerExternalDetail": {}, - "scanReceivedParts": "Alınan Parçaları Tara", + "scanReceivedParts": "Teslim Alınan Parçaları Tara", "@scanReceivedParts": {}, "search": "Ara", "@search": { @@ -888,7 +888,7 @@ "@select": {}, "selectFile": "Dosya Seç", "@selectFile": {}, - "selectImage": "Resim Seç", + "selectImage": "Görsel Seç", "@selectImage": {}, "selectLocation": "Bir yer seçin", "@selectLocation": {}, @@ -922,7 +922,7 @@ "@serverEmpty": {}, "serverError": "Sunucu Hatası", "@serverError": {}, - "serverDetails": "Sunucu Detayları", + "serverDetails": "Sunucu Ayrıntıları", "@serverDetails": {}, "serverMissingData": "Sunucu yanıtında gerekli alanlar eksik", "@serverMissingData": {}, @@ -948,11 +948,11 @@ "@shipmentsPending": {}, "shipmentAdd": "Gönderi Ekle", "@shipmentAdd": {}, - "shipmentCheck": "Teslimatı Kontrol Et", + "shipmentCheck": "Sevkiyatı Kontrol Et", "@shipmentCheck": {}, - "shipmentCheckDetail": "Bu teslimatı kontrol edildi olarak işaretle", + "shipmentCheckDetail": "Bu sevkiyatı kontrol edildi olarak işaretle", "@shipmentCheckDetail": {}, - "shipmentChecked": "Teslimat Kontrol Edildi", + "shipmentChecked": "Sevkiyat Kontrol Edildi", "@shipmentChecked": {}, "shipmentDate": "Teslimat Tarihi", "@shipmentDate": {}, @@ -962,7 +962,7 @@ "@shipmentReference": {}, "shipmentSend": "Teslimatı Gönder", "@shipmentSend": {}, - "shipmentUncheck": "Teslimat İşaretini Kaldır", + "shipmentUncheck": "Sevkiyat Kontrolünü Kaldır", "@shipmentUncheck": {}, "shipmentUncheckDetail": "Bu teslimatı kontrol edilmedi olarak işaretle", "@shipmentUncheckDetail": {}, @@ -1148,7 +1148,7 @@ "@uploadFailed": {}, "uploadSuccess": "Dosya yüklendi", "@uploadSuccess": {}, - "uploadImage": "Resim Yükleyin", + "uploadImage": "Görsel Yükle", "@uploadImage": {}, "usedIn": "Burada Kullanıldı", "@usedIn": {}, @@ -1202,6 +1202,6 @@ "@pricingOverrides": {}, "currency": "Para Birimi", "@currency": {}, - "priceBreaks": "Fiyat Aralığı", + "priceBreaks": "Fiyat Kademeleri", "@priceBreaks": {} } \ No newline at end of file diff --git a/lib/l10n/zh_CN/app_zh_CN.arb b/lib/l10n/zh_CN/app_zh_CN.arb index 876f122d..26cdce41 100644 --- a/lib/l10n/zh_CN/app_zh_CN.arb +++ b/lib/l10n/zh_CN/app_zh_CN.arb @@ -102,7 +102,7 @@ "@barcodeReceivePart": {}, "barcodeScanPaused": "条形码扫描已暂停", "@barodeScanPaused": {}, - "barcodeScanPause": "点击或按住以暂停扫描", + "barcodeScanPause": "点击以暂停扫描", "@barcodeScanPause": {}, "barcodeScanAssign": "扫描以分配条形码", "@barcodeScanAssign": {}, @@ -514,7 +514,7 @@ "@locationCreate": {}, "locationCreateDetail": "创建新库存地点", "@locationCreateDetail": {}, - "locationDefault": "默认库存地点", + "locationDefault": "默认位置", "@locationDefault": {}, "locationNotSet": "没有指定仓储位置", "@locationNotSet": {}, From 5f623c0594efcb6bc2fd99f3d05dbdde1c719250 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 9 Jan 2026 23:13:28 +0100 Subject: [PATCH 08/10] Add .envrc for Nix environment setup --- .envrc | 14 ++++++ .gitignore | 1 + NOTE.md | 40 +++++++++++++++++ flake.lock | 61 +++++++++++++++++++++++++ flake.nix | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 244 insertions(+) create mode 100644 .envrc create mode 100644 NOTE.md create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..0154438f --- /dev/null +++ b/.envrc @@ -0,0 +1,14 @@ +# Check if nix is available +if command -v nix &> /dev/null; then + use flake + + echo "✅ Nix development environment loaded" +else + # Nix is not available - show instructions for non-Nix users + echo "⚠️ Nix not detected. Please ensure the following are installed manually:" + echo " - Java JDK 17" + echo " - Python 3 with invoke package" + echo " - Android SDK" + echo " - FVM (Flutter Version Management)" + echo "💡 To use Nix: Install from https://nixos.org/download.html" +fi diff --git a/.gitignore b/.gitignore index 8effbf9a..3b84f8e6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ .buildlog/ .history .svn/ +.direnv coverage/* diff --git a/NOTE.md b/NOTE.md new file mode 100644 index 00000000..665c4b3c --- /dev/null +++ b/NOTE.md @@ -0,0 +1,40 @@ +## Codeänderung + +- android/app/build.gradle: compileSdkVersion/targetSdkVersion auf 36 angehoben, + weil mehrere Plugins SDK 36 voraussetzen. + +## Devbuild (out of the box) + +```sh +invoke translate +flutter build apk --debug +``` + +## Releasebuild (benötigt Signatur; interaktiv) + +Signatur erstellen; Passwörter merken!: + +```sh +keytool -genkey -v -keystore ~/inventree-release-key.jks \ + -keyalg RSA -keysize 2048 \ + -alias inventree +``` + +android/key.properties anlegen mit: + +```properties +storePassword=DEIN_STORE_PASSWORD +keyPassword=DEIN_KEY_PASSWORD +keyAlias=inventree +storeFile=/.../inventree-release-key.jks +``` + +```sh +invoke translate +fvm flutter build apk --release --no-tree-shake-icons +``` + +## Pipe + +1. nix installieren (für flake nutzung) (optional aber dann reproduzierbar) +2. flake anwenden diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..1805babf --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1767892417, + "narHash": "sha256-dhhvQY67aboBk8b0/u0XB6vwHdgbROZT3fJAjyNh5Ww=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..5038e85e --- /dev/null +++ b/flake.nix @@ -0,0 +1,128 @@ +{ + description = "InvenTree App Development Environment - CTBK"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = + { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = true; + android_sdk.accept_license = true; + }; + }; + + androidSdk = + (pkgs.androidenv.composeAndroidPackages { + platformVersions = [ + "36" + "35" + "34" + ]; + buildToolsVersions = [ + "36.0.0" + "34.0.0" + ]; + includeEmulator = true; + includeNDK = true; + ndkVersions = [ "26.1.10909125" ]; + cmakeVersions = [ + "3.31.6" + "3.22.1" + ]; + }).androidsdk; + + # FVM wrapper for NixOS - maps fvm commands to Nix-managed Flutter + fvm-wrapper = pkgs.writeShellScriptBin "fvm" '' + case "$1" in + use) + # 'fvm use' is a no-op on NixOS since Flutter is version-managed by Nix + echo "✓ Using Flutter from Nix ($(flutter --version | head -n1))" + exit 0 + ;; + flutter) + # 'fvm flutter ...' becomes 'flutter ...' + shift + exec flutter "$@" + ;; + *) + echo "fvm wrapper: command '$1' not implemented (using Nix-managed Flutter)" >&2 + exit 1 + ;; + esac + ''; + in + { + devShells.default = pkgs.mkShell { + buildInputs = + with pkgs; + [ + # Mobile development + flutter + fvm-wrapper + jdk17 + + # Build tools + android-tools + gradle + + # Python & task runner + python3 + python3Packages.invoke + + # System dependencies for Flutter on Linux + git + curl + unzip + which + ] + ++ lib.optionals stdenv.isLinux [ + gtk3 + glib + pcre + libepoxy + libxkbcommon + dbus + at-spi2-core + file + ]; + + shellHook = '' + export ANDROID_HOME="${androidSdk}/libexec/android-sdk" + export ANDROID_SDK_ROOT="$ANDROID_HOME" + export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools/bin:$PATH" + export JAVA_HOME="${pkgs.jdk17}" + export GRADLE_OPTS="-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_HOME/build-tools/34.0.0/aapt2" + + echo "🚀 InvenTree App Development Environment - CTBK" + echo "📦 Tools: Flutter, FVM, JDK17, Android SDK" + echo "📋 Run: invoke android # Build Android app" + ''; + + LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath ( + with pkgs; + [ + gtk3 + glib + pcre + libepoxy + libxkbcommon + dbus + at-spi2-core + ] + ); + }; + } + ); +} From 0546fba37f189ba80a8cc37c05a6e455d415b364 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Sat, 10 Jan 2026 00:37:58 +0100 Subject: [PATCH 09/10] Update NOTE.md to add troubleshooting section for Flutter Java version issues --- NOTE.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NOTE.md b/NOTE.md index 665c4b3c..71d3c6e7 100644 --- a/NOTE.md +++ b/NOTE.md @@ -38,3 +38,10 @@ fvm flutter build apk --release --no-tree-shake-icons 1. nix installieren (für flake nutzung) (optional aber dann reproduzierbar) 2. flake anwenden + +## Problems that occurred + +### Flutter Java Version Problem + +- unset flutter jdk-dir (`flutter config --jdk-dir=""`) +- a specified java version in the flutter config leads to a java From 96627adf7b8ca4cdd254b986e9e559ee0e1d7c9a Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Sat, 10 Jan 2026 14:16:05 +0100 Subject: [PATCH 10/10] Update .gitignore and add flake.nix patching script for Flutter version management --- .gitignore | 1 + flake.lock | 19 +++++++++++++- flake.nix | 11 +++++++- update-flutter-nix.sh | 60 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 update-flutter-nix.sh diff --git a/.gitignore b/.gitignore index 3b84f8e6..90020ffc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ .history .svn/ .direnv +flake.nix.bak coverage/* diff --git a/flake.lock b/flake.lock index 1805babf..bf891922 100644 --- a/flake.lock +++ b/flake.lock @@ -34,10 +34,27 @@ "type": "github" } }, + "nixpkgs-flutter": { + "locked": { + "lastModified": 1751285371, + "narHash": "sha256-/hDU+2AUeFFu5qGHO/UyFMc4UG/x5Cw5uXO36KGTk6c=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "nixpkgs-flutter": "nixpkgs-flutter" } }, "systems": { diff --git a/flake.nix b/flake.nix index 5038e85e..f9475faa 100644 --- a/flake.nix +++ b/flake.nix @@ -4,6 +4,7 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; + nixpkgs-flutter.url = "github:NixOS/nixpkgs/b9c03fbbaf84d85bb28eee530c7e9edc4021ca1b"; }; outputs = @@ -11,16 +12,23 @@ self, nixpkgs, flake-utils, + nixpkgs-flutter, }: flake-utils.lib.eachDefaultSystem ( system: let + pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; android_sdk.accept_license = true; }; + overlays = [ + (final: prev: { + flutter-pkg = import (self.inputs.nixpkgs-flutter) { inherit system; }; + }) + ]; }; androidSdk = @@ -69,7 +77,7 @@ with pkgs; [ # Mobile development - flutter + pkgs.flutter-pkg.flutter fvm-wrapper jdk17 @@ -80,6 +88,7 @@ # Python & task runner python3 python3Packages.invoke + jq # System dependencies for Flutter on Linux git diff --git a/update-flutter-nix.sh b/update-flutter-nix.sh new file mode 100644 index 00000000..5aad34d3 --- /dev/null +++ b/update-flutter-nix.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +set -e + +# 0. Abhängigkeiten prüfen +for cmd in jq curl sed nix; do + command -v $cmd >/dev/null 2>&1 || { echo "Fehler: $cmd nicht installiert!"; exit 1; } +done + +# 1. Version aus .fvmrc extrahieren +if [ ! -f .fvmrc ]; then + echo "Fehler: .fvmrc nicht gefunden!" + exit 1 +fi + +FLUTTER_VERSION=$(jq -r .flutter .fvmrc) +echo "Gesuchte Flutter Version: $FLUTTER_VERSION" + +# 2. Commit-Hash und Version aus Devbox-API holen +API_URL="https://search.devbox.sh/v2/pkg?name=flutter" +RELEASES_JSON=$(curl -s "$API_URL") + +# Alle Versionen extrahieren und sortieren +ALL_VERSIONS=$(echo "$RELEASES_JSON" | jq -r '.releases[].version' | sort -V) + +# Finde die gewünschte oder nächsthöhere Version +FOUND_VERSION=$(echo "$ALL_VERSIONS" | awk -v v="$FLUTTER_VERSION" '$0 >= v { print; exit }') + +if [ -z "$FOUND_VERSION" ]; then + echo "Fehler: Keine passende Flutter-Version gefunden." + exit 1 +fi + +if [ "$FOUND_VERSION" != "$FLUTTER_VERSION" ]; then + echo "Hinweis: Exakte Version nicht gefunden, benutze stattdessen Version $FOUND_VERSION." +fi + +# Commit-Hash für x86_64-linux extrahieren +COMMIT=$(echo "$RELEASES_JSON" | jq -r --arg v "$FOUND_VERSION" '.releases[] | select(.version==$v) | .platforms[] | select(.system=="x86_64-linux") | .commit_hash' | head -n 1) + +if [ -z "$COMMIT" ] || [ "$COMMIT" == "null" ]; then + echo "Fehler: Kein Commit-Hash für Version $FOUND_VERSION und Plattform x86_64-linux gefunden." + exit 1 +fi + +echo "Gefundener Commit: $COMMIT (Version: $FOUND_VERSION)" + + +# 3. Die flake.nix patchen (Backup anlegen) +sed -i.bak "s|nixpkgs-flutter.url = \"github:NixOS/nixpkgs/[a-f0-9]*\";|nixpkgs-flutter.url = \"github:NixOS/nixpkgs/$COMMIT\";|" flake.nix + +# 4. Den Flake-Lock aktualisieren +nix flake update nixpkgs-flutter + +# 5. Optional: direnv reload +if command -v direnv >/dev/null 2>&1; then + direnv reload +fi + +echo "Erfolgreich! Die flake.nix nutzt nun den Commit für Flutter $FLUTTER_VERSION (oder höher)."