feat: add localisation

This commit is contained in:
2026-07-31 21:46:05 +02:00
parent b58c9a8722
commit f5b2041612
30 changed files with 4099 additions and 326 deletions
+239
View File
@@ -0,0 +1,239 @@
{
"@@locale": "en",
"appTitle": "KoolTab",
"barTabs": "Bar Tabs",
"products": "Products",
"addProduct": "Add product",
"noProductsYet": "No products yet.",
"addFirstProduct": "Add your first product to start selling.",
"manageProducts": "Manage products",
"tabHistory": "Tab history",
"refresh": "Refresh",
"settings": "Settings",
"logout": "Logout",
"openOrSelectTab": "Open or select a tab first.",
"openNewTab": "Open new tab",
"customerGroupName": "Customer / group name",
"cancel": "Cancel",
"openTab": "Open tab",
"couldNotCreateTab": "Could not create tab: {error}",
"@couldNotCreateTab": {"placeholders": {"error": {"type": "String"}}},
"searchByName": "Search by name…",
"allCustomers": "All customers",
"customer": "Customer",
"noClosedTabs": "No closed tabs yet",
"settingsTitle": "Settings",
"security": "Security",
"pinRequired": "PIN Required",
"changePin": "Change PIN",
"appearance": "Appearance",
"language": "Language",
"languageSystem": "System default",
"languageEnglish": "English",
"languageDutch": "Dutch",
"theme": "Theme",
"system": "System",
"light": "Light",
"dark": "Dark",
"ugly": "Ugly",
"setPinCode": "Set PIN Code",
"enterPin": "Enter PIN",
"enterCurrentPin": "Enter Current PIN",
"enterNewPin": "Enter New PIN",
"fourDigits": "4 digits",
"enterPinFourDigits": "Enter PIN (4 digits)",
"confirm": "Confirm",
"confirmPin": "Confirm PIN",
"pinExactlyFour": "PIN must be exactly 4 digits",
"couldNotSavePin": "Could not save PIN setting.",
"editProduct": "Edit product",
"productName": "Product name",
"category": "Category",
"price": "Price",
"stock": "Stock",
"lowStockThreshold": "Low stock threshold",
"chooseProductImage": "Choose product image",
"changeImage": "Change image",
"deleteProduct": "Delete product?",
"deleteProductDescription": "This will remove the product from the product list.",
"delete": "Delete",
"productNotFound": "Product not found.",
"chooseImage": "Choose a product image.",
"selectCategory": "Please select a category.",
"enterProductName": "Enter a product name.",
"version": "Version {version}",
"@version": {"placeholders": {"version": {"type": "String"}}},
"selectTabToAddItems": "Select a tab to add items",
"openTabs": "Open tabs",
"selectOrOpenTab": "Select or open a tab",
"noOpenTabs": "No open tabs",
"edit": "Edit",
"close": "Close",
"tabItemSummary": "{count, plural, =1 {1 item - {total}} other {{count} items - {total}}}",
"@tabItemSummary": {"placeholders": {"count": {"type": "int"}, "total": {"type": "String"}}},
"tabItemCount": "{count, plural, =1 {1 item} other {{count} items}}",
"@tabItemCount": {"placeholders": {"count": {"type": "int"}}},
"tapProductsToAdd": "Tap products to add them",
"total": "Total",
"closeTab": "Close tab",
"productStockSummary": "{category} • {price} • Stock: {stock}",
"@productStockSummary": {"placeholders": {"category": {"type": "String"}, "price": {"type": "String"}, "stock": {"type": "int"}}},
"outOfStock": "OUT OF STOCK",
"tabsYouCloseAppearHere": "Tabs you close will show up here.",
"enterPinSubtitle": "Youll use this to unlock the app",
"confirmPinSubtitle": "Enter the same PIN again",
"createPin": "Create a PIN",
"pinsDidNotMatch": "PINs didnt match. Try again.",
"somethingWentWrong": "Something went wrong.",
"incorrectPin": "Incorrect PIN.",
"enterPrice": "Enter a price.",
"enterValidPrice": "Enter a valid price.",
"enterValidStock": "Enter a valid stock amount.",
"enterValidThreshold": "Enter a valid threshold.",
"couldNotLoadProduct": "Could not load product.",
"couldNotSaveProduct": "Could not save product.",
"couldNotDeleteProduct": "Could not delete product.",
"paymentMethod": "Payment method",
"cash": "Cash",
"payconiq": "Payconiq",
"closeTabForCustomer": "Close tab for {customerName}?",
"@closeTabForCustomer": {"placeholders": {"customerName": {"type": "String"}}},
"currentTotal": "Current total: {total}",
"@currentTotal": {"placeholders": {"total": {"type": "String"}}},
"couldNotCloseTab": "Could not close tab.",
"closingTab": "Closing tab…",
"slideToConfirmClosing": "Slide to confirm closing",
"errorScreen": "Error Screen",
"unexpectedError": "An unexpected error occurred.\nPlease try restarting the app.",
"goToBarScreen": "Go to bar screen",
"updates": "Updates",
"checkingForUpdates": "Checking for updates…",
"checkForUpdates": "Check for updates",
"latestVersion": "You are already on the latest version.",
"updateCheckFailed": "Update check failed.",
"updateAvailable": "Update available",
"versionAvailable": "Version {version} is available.",
"@versionAvailable": {"placeholders": {"version": {"type": "String"}}},
"later": "Later",
"update": "Update",
"updateReady": "Update ready",
"updateReadyDescription": "The update has been downloaded and installed. Restart the app now to apply the changes.",
"restartApp": "Restart app",
"updateFailed": "Update failed",
"retry": "Retry",
"updating": "Updating",
"installing": "Installing",
"doNotCloseDuringUpdate": "Do not close the app during the update",
"cancelUpdate": "Cancel update?",
"cancelUpdateDescription": "The update is in progress. If you leave now, the app may become unstable.",
"continueUpdate": "Continue update",
"cancelUpdateAction": "Cancel update",
"preparingDownload": "Preparing download…",
"simulatedDownloadError": "Simulated download error (network timeout)",
"downloadFailed": "Download failed",
"downloading": "Downloading {percent}%",
"@downloading": {"placeholders": {"percent": {"type": "String"}}},
"installingUpdate": "Installing update…",
"updateInstalledRestarting": "Update installed! Restarting…",
"installationFailed": "Installation failed",
"updateAlreadyInProgress": "Update already in progress",
"updateAlreadyRunning": "Update already running",
"genericError": "An unexpected error occurred.",
"couldNotLoadBar": "Could not load bar screen.",
"couldNotCreateTabMessage": "Could not create tab.",
"productOutOfStock": "Product is out of stock.",
"couldNotAddProductToTab": "Could not add product to tab.",
"couldNotUpdateQuantity": "Could not update item quantity.",
"couldNotReloadTabs": "Could not reload tabs.",
"couldNotLoadHistory": "Could not load tab history.",
"couldNotLoadMoreTabs": "Could not load more tabs.",
"couldNotLoadProducts": "Could not load products.",
"couldNotAddProduct": "Could not add product.",
"couldNotUpdateProduct": "Could not update product.",
"couldNotDeleteProductMessage": "Could not delete product.",
"couldNotCheckPinStatus": "Could not check PIN status.",
"couldNotVerifyPin": "Could not verify PIN.",
"currentPinIncorrect": "Current PIN is incorrect.",
"couldNotLoadSettings": "Could not load settings.",
"couldNotSaveSettings": "Could not save settings.",
"downloadFailedWithDetail": "Download failed.",
"installationFailedWithDetail": "Installation failed.",
"devMenu": "Dev Menu",
"dataManagement": "Data Management",
"clearOpenTabs": "Clear all open tabs",
"clearClosedHistory": "Clear closed tab history",
"seedDefaultProducts": "Seed default products",
"onlySeedsWhenEmpty": "Only seeds if table is empty",
"clearAndReseedProducts": "Clear & reseed products",
"wipesAndReseeds": "Wipes all products, then seeds defaults",
"clearAllProducts": "Clear all products",
"clearProductImages": "Clear product images",
"deletesProductImages": "Deletes images from product_images folder",
"debugging": "Debugging",
"resetPin": "Reset PIN",
"removePinLock": "Remove PIN lock",
"toggleDebugOverlay": "Toggle debug overlay",
"showFpsMemoryWidgets": "Show FPS, memory, widget count",
"errorScreenMenu": "Error screen",
"viewErrorScreen": "View the error screen UI",
"featureToggles": "Feature Toggles",
"simulateUpdateDownload": "Simulate update download",
"openDownloadProgress": "Open the download progress screen",
"testingHelpers": "Testing Helpers",
"createTestTab": "Create test tab",
"addRandomItems": "Add tab with random items",
"addTestProducts": "Add 100 test products",
"stressTestGrid": "Stress test product grid",
"simulateLowStock": "Simulate low stock",
"setProductsBelowThreshold": "Set all products below threshold",
"generateMockOrders": "Generate 100 mock orders",
"randomCustomersItemsAmounts": "Random customers, items, and amounts",
"performance": "Performance",
"clearImageCache": "Clear image cache",
"reloadProductImages": "Reload product images",
"debugOverlay": "Debug Overlay",
"debugOverlayDescription": "The debug overlay shows FPS, memory usage, and widget counts. Enable it via Flutter DevTools in debug mode.",
"ok": "OK",
"simulateUpdate": "Simulate update",
"chooseSimulationMode": "Choose a simulation mode:",
"successfulDownload": "Successful download",
"progressThenInstall": "Progress 0→100%, then install, then done",
"downloadError": "Download error",
"failsWithNetworkTimeout": "Fails at 50% with a network timeout",
"realDownloadWillFail": "Real download (will fail)",
"attemptsFakeUrl": "Attempts real OTA with fake URL",
"categoryBeer": "Beer",
"categoryWine": "Wine",
"categorySoftDrinks": "Soft drinks",
"categoryCocktails": "Cocktails",
"categorySnacks": "Snacks",
"categoryCoffee": "Coffee",
"categoryTea": "Tea",
"categoryOther": "Other",
"devActionClearedOpenTabs": "Cleared all open tabs",
"devActionClearedHistory": "Cleared closed tab history",
"devActionClearedProducts": "Cleared all products",
"devActionSeededProducts": "Seeded {count} products",
"@devActionSeededProducts": {"placeholders": {"count": {"type": "int"}}},
"devActionReseededProducts": "Cleared and reseeded {count} products",
"@devActionReseededProducts": {"placeholders": {"count": {"type": "int"}}},
"devActionImagesCleared": "Product images cleared",
"devActionResetPin": "PIN reset (no PIN required)",
"devActionNoProducts": "No products available",
"devActionImagesReloaded": "Product images reloaded",
"devActionCacheCleared": "Image cache cleared (no-op in debug mode)",
"devActionLowStock": "Simulated low stock for {count} products",
"@devActionLowStock": {"placeholders": {"count": {"type": "int"}}},
"devActionTestTab": "Created test tab with {count} items",
"@devActionTestTab": {"placeholders": {"count": {"type": "int"}}},
"devActionTestProducts": "Added {count} test products",
"@devActionTestProducts": {"placeholders": {"count": {"type": "int"}}},
"devActionMockOrders": "Generated {orders} mock orders across {customers} customers",
"@devActionMockOrders": {"placeholders": {"orders": {"type": "int"}, "customers": {"type": "int"}}},
"devActionFailedImages": "Failed to clear images.",
"devActionResetStock": "Reset stock for {count} products",
"@devActionResetStock": {"placeholders": {"count": {"type": "int"}}},
"paymentCash": "Cash",
"paymentPayconiq": "Payconiq",
"simulatedUpdateNotes": "Bug fixes and performance improvements."
}
File diff suppressed because it is too large Load Diff
+723
View File
@@ -0,0 +1,723 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get appTitle => 'KoolTab';
@override
String get barTabs => 'Bar Tabs';
@override
String get products => 'Products';
@override
String get addProduct => 'Add product';
@override
String get noProductsYet => 'No products yet.';
@override
String get addFirstProduct => 'Add your first product to start selling.';
@override
String get manageProducts => 'Manage products';
@override
String get tabHistory => 'Tab history';
@override
String get refresh => 'Refresh';
@override
String get settings => 'Settings';
@override
String get logout => 'Logout';
@override
String get openOrSelectTab => 'Open or select a tab first.';
@override
String get openNewTab => 'Open new tab';
@override
String get customerGroupName => 'Customer / group name';
@override
String get cancel => 'Cancel';
@override
String get openTab => 'Open tab';
@override
String couldNotCreateTab(String error) {
return 'Could not create tab: $error';
}
@override
String get searchByName => 'Search by name…';
@override
String get allCustomers => 'All customers';
@override
String get customer => 'Customer';
@override
String get noClosedTabs => 'No closed tabs yet';
@override
String get settingsTitle => 'Settings';
@override
String get security => 'Security';
@override
String get pinRequired => 'PIN Required';
@override
String get changePin => 'Change PIN';
@override
String get appearance => 'Appearance';
@override
String get language => 'Language';
@override
String get languageSystem => 'System default';
@override
String get languageEnglish => 'English';
@override
String get languageDutch => 'Dutch';
@override
String get theme => 'Theme';
@override
String get system => 'System';
@override
String get light => 'Light';
@override
String get dark => 'Dark';
@override
String get ugly => 'Ugly';
@override
String get setPinCode => 'Set PIN Code';
@override
String get enterPin => 'Enter PIN';
@override
String get enterCurrentPin => 'Enter Current PIN';
@override
String get enterNewPin => 'Enter New PIN';
@override
String get fourDigits => '4 digits';
@override
String get enterPinFourDigits => 'Enter PIN (4 digits)';
@override
String get confirm => 'Confirm';
@override
String get confirmPin => 'Confirm PIN';
@override
String get pinExactlyFour => 'PIN must be exactly 4 digits';
@override
String get couldNotSavePin => 'Could not save PIN setting.';
@override
String get editProduct => 'Edit product';
@override
String get productName => 'Product name';
@override
String get category => 'Category';
@override
String get price => 'Price';
@override
String get stock => 'Stock';
@override
String get lowStockThreshold => 'Low stock threshold';
@override
String get chooseProductImage => 'Choose product image';
@override
String get changeImage => 'Change image';
@override
String get deleteProduct => 'Delete product?';
@override
String get deleteProductDescription =>
'This will remove the product from the product list.';
@override
String get delete => 'Delete';
@override
String get productNotFound => 'Product not found.';
@override
String get chooseImage => 'Choose a product image.';
@override
String get selectCategory => 'Please select a category.';
@override
String get enterProductName => 'Enter a product name.';
@override
String version(String version) {
return 'Version $version';
}
@override
String get selectTabToAddItems => 'Select a tab to add items';
@override
String get openTabs => 'Open tabs';
@override
String get selectOrOpenTab => 'Select or open a tab';
@override
String get noOpenTabs => 'No open tabs';
@override
String get edit => 'Edit';
@override
String get close => 'Close';
@override
String tabItemSummary(int count, String total) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count items - $total',
one: '1 item - $total',
);
return '$_temp0';
}
@override
String tabItemCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count items',
one: '1 item',
);
return '$_temp0';
}
@override
String get tapProductsToAdd => 'Tap products to add them';
@override
String get total => 'Total';
@override
String get closeTab => 'Close tab';
@override
String productStockSummary(String category, String price, int stock) {
return '$category$price • Stock: $stock';
}
@override
String get outOfStock => 'OUT OF STOCK';
@override
String get tabsYouCloseAppearHere => 'Tabs you close will show up here.';
@override
String get enterPinSubtitle => 'Youll use this to unlock the app';
@override
String get confirmPinSubtitle => 'Enter the same PIN again';
@override
String get createPin => 'Create a PIN';
@override
String get pinsDidNotMatch => 'PINs didnt match. Try again.';
@override
String get somethingWentWrong => 'Something went wrong.';
@override
String get incorrectPin => 'Incorrect PIN.';
@override
String get enterPrice => 'Enter a price.';
@override
String get enterValidPrice => 'Enter a valid price.';
@override
String get enterValidStock => 'Enter a valid stock amount.';
@override
String get enterValidThreshold => 'Enter a valid threshold.';
@override
String get couldNotLoadProduct => 'Could not load product.';
@override
String get couldNotSaveProduct => 'Could not save product.';
@override
String get couldNotDeleteProduct => 'Could not delete product.';
@override
String get paymentMethod => 'Payment method';
@override
String get cash => 'Cash';
@override
String get payconiq => 'Payconiq';
@override
String closeTabForCustomer(String customerName) {
return 'Close tab for $customerName?';
}
@override
String currentTotal(String total) {
return 'Current total: $total';
}
@override
String get couldNotCloseTab => 'Could not close tab.';
@override
String get closingTab => 'Closing tab…';
@override
String get slideToConfirmClosing => 'Slide to confirm closing';
@override
String get errorScreen => 'Error Screen';
@override
String get unexpectedError =>
'An unexpected error occurred.\nPlease try restarting the app.';
@override
String get goToBarScreen => 'Go to bar screen';
@override
String get updates => 'Updates';
@override
String get checkingForUpdates => 'Checking for updates…';
@override
String get checkForUpdates => 'Check for updates';
@override
String get latestVersion => 'You are already on the latest version.';
@override
String get updateCheckFailed => 'Update check failed.';
@override
String get updateAvailable => 'Update available';
@override
String versionAvailable(String version) {
return 'Version $version is available.';
}
@override
String get later => 'Later';
@override
String get update => 'Update';
@override
String get updateReady => 'Update ready';
@override
String get updateReadyDescription =>
'The update has been downloaded and installed. Restart the app now to apply the changes.';
@override
String get restartApp => 'Restart app';
@override
String get updateFailed => 'Update failed';
@override
String get retry => 'Retry';
@override
String get updating => 'Updating';
@override
String get installing => 'Installing';
@override
String get doNotCloseDuringUpdate => 'Do not close the app during the update';
@override
String get cancelUpdate => 'Cancel update?';
@override
String get cancelUpdateDescription =>
'The update is in progress. If you leave now, the app may become unstable.';
@override
String get continueUpdate => 'Continue update';
@override
String get cancelUpdateAction => 'Cancel update';
@override
String get preparingDownload => 'Preparing download…';
@override
String get simulatedDownloadError =>
'Simulated download error (network timeout)';
@override
String get downloadFailed => 'Download failed';
@override
String downloading(String percent) {
return 'Downloading $percent%';
}
@override
String get installingUpdate => 'Installing update…';
@override
String get updateInstalledRestarting => 'Update installed! Restarting…';
@override
String get installationFailed => 'Installation failed';
@override
String get updateAlreadyInProgress => 'Update already in progress';
@override
String get updateAlreadyRunning => 'Update already running';
@override
String get genericError => 'An unexpected error occurred.';
@override
String get couldNotLoadBar => 'Could not load bar screen.';
@override
String get couldNotCreateTabMessage => 'Could not create tab.';
@override
String get productOutOfStock => 'Product is out of stock.';
@override
String get couldNotAddProductToTab => 'Could not add product to tab.';
@override
String get couldNotUpdateQuantity => 'Could not update item quantity.';
@override
String get couldNotReloadTabs => 'Could not reload tabs.';
@override
String get couldNotLoadHistory => 'Could not load tab history.';
@override
String get couldNotLoadMoreTabs => 'Could not load more tabs.';
@override
String get couldNotLoadProducts => 'Could not load products.';
@override
String get couldNotAddProduct => 'Could not add product.';
@override
String get couldNotUpdateProduct => 'Could not update product.';
@override
String get couldNotDeleteProductMessage => 'Could not delete product.';
@override
String get couldNotCheckPinStatus => 'Could not check PIN status.';
@override
String get couldNotVerifyPin => 'Could not verify PIN.';
@override
String get currentPinIncorrect => 'Current PIN is incorrect.';
@override
String get couldNotLoadSettings => 'Could not load settings.';
@override
String get couldNotSaveSettings => 'Could not save settings.';
@override
String get downloadFailedWithDetail => 'Download failed.';
@override
String get installationFailedWithDetail => 'Installation failed.';
@override
String get devMenu => 'Dev Menu';
@override
String get dataManagement => 'Data Management';
@override
String get clearOpenTabs => 'Clear all open tabs';
@override
String get clearClosedHistory => 'Clear closed tab history';
@override
String get seedDefaultProducts => 'Seed default products';
@override
String get onlySeedsWhenEmpty => 'Only seeds if table is empty';
@override
String get clearAndReseedProducts => 'Clear & reseed products';
@override
String get wipesAndReseeds => 'Wipes all products, then seeds defaults';
@override
String get clearAllProducts => 'Clear all products';
@override
String get clearProductImages => 'Clear product images';
@override
String get deletesProductImages =>
'Deletes images from product_images folder';
@override
String get debugging => 'Debugging';
@override
String get resetPin => 'Reset PIN';
@override
String get removePinLock => 'Remove PIN lock';
@override
String get toggleDebugOverlay => 'Toggle debug overlay';
@override
String get showFpsMemoryWidgets => 'Show FPS, memory, widget count';
@override
String get errorScreenMenu => 'Error screen';
@override
String get viewErrorScreen => 'View the error screen UI';
@override
String get featureToggles => 'Feature Toggles';
@override
String get simulateUpdateDownload => 'Simulate update download';
@override
String get openDownloadProgress => 'Open the download progress screen';
@override
String get testingHelpers => 'Testing Helpers';
@override
String get createTestTab => 'Create test tab';
@override
String get addRandomItems => 'Add tab with random items';
@override
String get addTestProducts => 'Add 100 test products';
@override
String get stressTestGrid => 'Stress test product grid';
@override
String get simulateLowStock => 'Simulate low stock';
@override
String get setProductsBelowThreshold => 'Set all products below threshold';
@override
String get generateMockOrders => 'Generate 100 mock orders';
@override
String get randomCustomersItemsAmounts =>
'Random customers, items, and amounts';
@override
String get performance => 'Performance';
@override
String get clearImageCache => 'Clear image cache';
@override
String get reloadProductImages => 'Reload product images';
@override
String get debugOverlay => 'Debug Overlay';
@override
String get debugOverlayDescription =>
'The debug overlay shows FPS, memory usage, and widget counts. Enable it via Flutter DevTools in debug mode.';
@override
String get ok => 'OK';
@override
String get simulateUpdate => 'Simulate update';
@override
String get chooseSimulationMode => 'Choose a simulation mode:';
@override
String get successfulDownload => 'Successful download';
@override
String get progressThenInstall => 'Progress 0→100%, then install, then done';
@override
String get downloadError => 'Download error';
@override
String get failsWithNetworkTimeout => 'Fails at 50% with a network timeout';
@override
String get realDownloadWillFail => 'Real download (will fail)';
@override
String get attemptsFakeUrl => 'Attempts real OTA with fake URL';
@override
String get categoryBeer => 'Beer';
@override
String get categoryWine => 'Wine';
@override
String get categorySoftDrinks => 'Soft drinks';
@override
String get categoryCocktails => 'Cocktails';
@override
String get categorySnacks => 'Snacks';
@override
String get categoryCoffee => 'Coffee';
@override
String get categoryTea => 'Tea';
@override
String get categoryOther => 'Other';
@override
String get devActionClearedOpenTabs => 'Cleared all open tabs';
@override
String get devActionClearedHistory => 'Cleared closed tab history';
@override
String get devActionClearedProducts => 'Cleared all products';
@override
String devActionSeededProducts(int count) {
return 'Seeded $count products';
}
@override
String devActionReseededProducts(int count) {
return 'Cleared and reseeded $count products';
}
@override
String get devActionImagesCleared => 'Product images cleared';
@override
String get devActionResetPin => 'PIN reset (no PIN required)';
@override
String get devActionNoProducts => 'No products available';
@override
String get devActionImagesReloaded => 'Product images reloaded';
@override
String get devActionCacheCleared =>
'Image cache cleared (no-op in debug mode)';
@override
String devActionLowStock(int count) {
return 'Simulated low stock for $count products';
}
@override
String devActionTestTab(int count) {
return 'Created test tab with $count items';
}
@override
String devActionTestProducts(int count) {
return 'Added $count test products';
}
@override
String devActionMockOrders(int orders, int customers) {
return 'Generated $orders mock orders across $customers customers';
}
@override
String get devActionFailedImages => 'Failed to clear images.';
@override
String devActionResetStock(int count) {
return 'Reset stock for $count products';
}
@override
String get paymentCash => 'Cash';
@override
String get paymentPayconiq => 'Payconiq';
@override
String get simulatedUpdateNotes => 'Bug fixes and performance improvements.';
}
+157
View File
@@ -0,0 +1,157 @@
import 'app_localizations.dart';
extension AppLocalizationsHelpers on AppLocalizations {
String categoryLabel(String category) {
return switch (category.trim().toLowerCase()) {
'bier' || 'beer' => categoryBeer,
'wijn' || 'wine' => categoryWine,
'frisdrank' || 'soft drinks' => categorySoftDrinks,
'cocktails' => categoryCocktails,
'snacks' => categorySnacks,
'coffee' || 'koffie' => categoryCoffee,
'thee' || 'tea' => categoryTea,
'other' || 'overig' => categoryOther,
_ => category,
};
}
String localizedError(String? message) {
return switch (message) {
'Could not load bar screen.' => couldNotLoadBar,
'Could not create tab.' => couldNotCreateTabMessage,
'Product is out of stock.' => productOutOfStock,
'Could not add product to tab.' => couldNotAddProductToTab,
'Could not update item quantity.' => couldNotUpdateQuantity,
'Could not close tab.' => couldNotCloseTab,
'Could not reload tabs.' => couldNotReloadTabs,
'Could not load tab history.' => couldNotLoadHistory,
'Could not load more tabs.' => couldNotLoadMoreTabs,
'Could not load products.' => couldNotLoadProducts,
'Could not add product.' => couldNotAddProduct,
'Could not update product.' => couldNotUpdateProduct,
'Could not check PIN status.' => couldNotCheckPinStatus,
'Could not save PIN.' => couldNotSavePin,
'Incorrect PIN.' => incorrectPin,
'Could not verify PIN.' => couldNotVerifyPin,
'Current PIN is incorrect.' => currentPinIncorrect,
'Could not load settings.' => couldNotLoadSettings,
'Could not save settings.' => couldNotSaveSettings,
'Could not load product.' => couldNotLoadProduct,
'Could not save product.' => couldNotSaveProduct,
'Could not delete product.' => couldNotDeleteProduct,
'Update failed' => updateFailed,
'Download failed' => downloadFailed,
'Installation failed' => installationFailed,
'Update already in progress' => updateAlreadyInProgress,
_ => message ?? genericError,
};
}
String updateStatus(String status) {
if (status.startsWith('Downloading ')) {
return downloading(status.substring('Downloading '.length));
}
return switch (status) {
'Preparing download…' => preparingDownload,
'Download failed' => downloadFailed,
'Installing update…' => installingUpdate,
'Update installed! Restarting…' => updateInstalledRestarting,
'Installation failed' => installationFailed,
'Update already running' => updateAlreadyRunning,
_ => status,
};
}
String updateError(String? message) {
if (message == null) return updateFailed;
if (message.startsWith('Download failed')) return downloadFailedWithDetail;
if (message.startsWith('Installation failed')) {
return installationFailedWithDetail;
}
if (message == 'Simulated download error (network timeout)') {
return simulatedDownloadError;
}
if (message == 'Update already in progress') return updateAlreadyInProgress;
return localizedError(message);
}
String devAction(String? message) {
if (message == null) return '';
final seeded = RegExp(
r'Seeded (?:default products )?\((\d+) total\)',
).firstMatch(message);
if (seeded != null) {
return devActionSeededProducts(int.parse(seeded.group(1)!));
}
final reseeded = RegExp(
r'Cleared and reseeded \((\d+) products\)',
).firstMatch(message);
if (reseeded != null) {
return devActionReseededProducts(int.parse(reseeded.group(1)!));
}
final resetStock = RegExp(
r'Reset stock for (\d+) products',
).firstMatch(message);
if (resetStock != null) {
return devActionResetStock(int.parse(resetStock.group(1)!));
}
final seededDemo = RegExp(
r'Seeded (\d+) demo products',
).firstMatch(message);
if (seededDemo != null) {
return devActionSeededProducts(int.parse(seededDemo.group(1)!));
}
final testTab = RegExp(
r'Created test tab with (\d+) items',
).firstMatch(message);
if (testTab != null) {
return devActionTestTab(int.parse(testTab.group(1)!));
}
final testProducts = RegExp(
r'Added (\d+) test products',
).firstMatch(message);
if (testProducts != null) {
return devActionTestProducts(int.parse(testProducts.group(1)!));
}
final lowStock = RegExp(
r'Simulated low stock for (\d+) products',
).firstMatch(message);
if (lowStock != null) {
return devActionLowStock(int.parse(lowStock.group(1)!));
}
final mockOrders = RegExp(
r'Generated (\d+) mock orders across (\d+) customers',
).firstMatch(message);
if (mockOrders != null) {
return devActionMockOrders(
int.parse(mockOrders.group(1)!),
int.parse(mockOrders.group(2)!),
);
}
return switch (message) {
'Cleared all open tabs' => devActionClearedOpenTabs,
'Cleared closed tab history' => devActionClearedHistory,
'Cleared all products' => devActionClearedProducts,
'Product images cleared' => devActionImagesCleared,
'PIN reset (no PIN required)' => devActionResetPin,
'No products to add to test tab' => devActionNoProducts,
'No products available — seed demo data first' => devActionNoProducts,
'Product images reloaded' => devActionImagesReloaded,
'Image cache cleared (no-op in debug mode)' => devActionCacheCleared,
_ when message.startsWith('Failed to clear images') =>
devActionFailedImages,
_ => message,
};
}
}
+734
View File
@@ -0,0 +1,734 @@
// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for Dutch Flemish (`nl`).
class AppLocalizationsNl extends AppLocalizations {
AppLocalizationsNl([String locale = 'nl']) : super(locale);
@override
String get appTitle => 'KoolTab';
@override
String get barTabs => 'Poefs';
@override
String get products => 'Producten';
@override
String get addProduct => 'Product toevoegen';
@override
String get noProductsYet => 'Nog geen producten.';
@override
String get addFirstProduct => 'Voeg je eerste product toe om te beginnen.';
@override
String get manageProducts => 'Producten beheren';
@override
String get tabHistory => 'Geschiedenis';
@override
String get refresh => 'Vernieuwen';
@override
String get settings => 'Instellingen';
@override
String get logout => 'Uitloggen';
@override
String get openOrSelectTab => 'Open of selecteer eerst een poef.';
@override
String get openNewTab => 'Nieuw poef openen';
@override
String get customerGroupName => 'Naam klant / groep';
@override
String get cancel => 'Annuleren';
@override
String get openTab => 'Poef openen';
@override
String couldNotCreateTab(String error) {
return 'Poef kon niet worden aangemaakt: $error';
}
@override
String get searchByName => 'Zoeken op naam…';
@override
String get allCustomers => 'Alle klanten';
@override
String get customer => 'Klant';
@override
String get noClosedTabs => 'Nog geen gesloten poefs';
@override
String get settingsTitle => 'Instellingen';
@override
String get security => 'Beveiliging';
@override
String get pinRequired => 'PIN vereist';
@override
String get changePin => 'PIN wijzigen';
@override
String get appearance => 'Uiterlijk';
@override
String get language => 'Taal';
@override
String get languageSystem => 'Systeemstandaard';
@override
String get languageEnglish => 'Engels';
@override
String get languageDutch => 'Nederlands';
@override
String get theme => 'Thema';
@override
String get system => 'Systeem';
@override
String get light => 'Licht';
@override
String get dark => 'Donker';
@override
String get ugly => 'Lelijk';
@override
String get setPinCode => 'PIN instellen';
@override
String get enterPin => 'PIN invoeren';
@override
String get enterCurrentPin => 'Huidige PIN invoeren';
@override
String get enterNewPin => 'Nieuwe PIN invoeren';
@override
String get fourDigits => '4 cijfers';
@override
String get enterPinFourDigits => 'PIN invoeren (4 cijfers)';
@override
String get confirm => 'Bevestigen';
@override
String get confirmPin => 'PIN bevestigen';
@override
String get pinExactlyFour => 'PIN moet precies 4 cijfers bevatten';
@override
String get couldNotSavePin => 'PIN-instelling kon niet worden opgeslagen.';
@override
String get editProduct => 'Product bewerken';
@override
String get productName => 'Productnaam';
@override
String get category => 'Categorie';
@override
String get price => 'Prijs';
@override
String get stock => 'Voorraad';
@override
String get lowStockThreshold => 'Drempel lage voorraad';
@override
String get chooseProductImage => 'Productafbeelding kiezen';
@override
String get changeImage => 'Afbeelding wijzigen';
@override
String get deleteProduct => 'Product verwijderen?';
@override
String get deleteProductDescription =>
'Dit verwijdert het product uit de productlijst.';
@override
String get delete => 'Verwijderen';
@override
String get productNotFound => 'Product niet gevonden.';
@override
String get chooseImage => 'Kies een productafbeelding.';
@override
String get selectCategory => 'Selecteer een categorie.';
@override
String get enterProductName => 'Voer een productnaam in.';
@override
String version(String version) {
return 'Versie $version';
}
@override
String get selectTabToAddItems => 'Selecteer een poef om items toe te voegen';
@override
String get openTabs => 'Open poefs';
@override
String get selectOrOpenTab => 'Selecteer of open een poef';
@override
String get noOpenTabs => 'Geen open poefs';
@override
String get edit => 'Bewerken';
@override
String get close => 'Sluiten';
@override
String tabItemSummary(int count, String total) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count items - $total',
one: '1 item - $total',
);
return '$_temp0';
}
@override
String tabItemCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count items',
one: '1 item',
);
return '$_temp0';
}
@override
String get tapProductsToAdd => 'Tik op producten om ze toe te voegen';
@override
String get total => 'Totaal';
@override
String get closeTab => 'Poef sluiten';
@override
String productStockSummary(String category, String price, int stock) {
return '$category$price • Voorraad: $stock';
}
@override
String get outOfStock => 'UITVERKOCHT';
@override
String get tabsYouCloseAppearHere => 'Gesloten poefs verschijnen hier.';
@override
String get enterPinSubtitle => 'Je gebruikt dit om de app te ontgrendelen';
@override
String get confirmPinSubtitle => 'Voer dezelfde PIN opnieuw in';
@override
String get createPin => 'PIN aanmaken';
@override
String get pinsDidNotMatch =>
'PINs kwamen niet overeen. Probeer het opnieuw.';
@override
String get somethingWentWrong => 'Er is iets misgegaan.';
@override
String get incorrectPin => 'Onjuiste PIN.';
@override
String get enterPrice => 'Voer een prijs in.';
@override
String get enterValidPrice => 'Voer een geldige prijs in.';
@override
String get enterValidStock => 'Voer een geldige voorraad in.';
@override
String get enterValidThreshold => 'Voer een geldige drempel in.';
@override
String get couldNotLoadProduct => 'Product kon niet worden geladen.';
@override
String get couldNotSaveProduct => 'Product kon niet worden opgeslagen.';
@override
String get couldNotDeleteProduct => 'Product kon niet worden verwijderd.';
@override
String get paymentMethod => 'Betaalmethode';
@override
String get cash => 'Contant';
@override
String get payconiq => 'Payconiq';
@override
String closeTabForCustomer(String customerName) {
return 'Poef van $customerName sluiten?';
}
@override
String currentTotal(String total) {
return 'Huidig totaal: $total';
}
@override
String get couldNotCloseTab => 'Poef kon niet worden gesloten.';
@override
String get closingTab => 'Poef sluiten…';
@override
String get slideToConfirmClosing => 'Schuif om het sluiten te bevestigen';
@override
String get errorScreen => 'Foutscherm';
@override
String get unexpectedError =>
'Er is een onverwachte fout opgetreden.\nProbeer de app opnieuw te starten.';
@override
String get goToBarScreen => 'Naar barkassa';
@override
String get updates => 'Updates';
@override
String get checkingForUpdates => 'Controleren op updates…';
@override
String get checkForUpdates => 'Controleren op updates';
@override
String get latestVersion => 'Je gebruikt al de nieuwste versie.';
@override
String get updateCheckFailed => 'Controleren op updates mislukt.';
@override
String get updateAvailable => 'Update beschikbaar';
@override
String versionAvailable(String version) {
return 'Versie $version is beschikbaar.';
}
@override
String get later => 'Later';
@override
String get update => 'Updaten';
@override
String get updateReady => 'Update klaar';
@override
String get updateReadyDescription =>
'De update is gedownload en geïnstalleerd. Start de app nu opnieuw om de wijzigingen toe te passen.';
@override
String get restartApp => 'App opnieuw starten';
@override
String get updateFailed => 'Update mislukt';
@override
String get retry => 'Opnieuw proberen';
@override
String get updating => 'Updaten';
@override
String get installing => 'Installeren';
@override
String get doNotCloseDuringUpdate => 'Sluit de app niet tijdens de update';
@override
String get cancelUpdate => 'Update annuleren?';
@override
String get cancelUpdateDescription =>
'De update is bezig. Als je nu weggaat, kan de app instabiel worden.';
@override
String get continueUpdate => 'Update voortzetten';
@override
String get cancelUpdateAction => 'Update annuleren';
@override
String get preparingDownload => 'Download voorbereiden…';
@override
String get simulatedDownloadError =>
'Gesimuleerde downloadfout (netwerktime-out)';
@override
String get downloadFailed => 'Download mislukt';
@override
String downloading(String percent) {
return 'Downloaden $percent%';
}
@override
String get installingUpdate => 'Update installeren…';
@override
String get updateInstalledRestarting =>
'Update geïnstalleerd! Opnieuw starten…';
@override
String get installationFailed => 'Installatie mislukt';
@override
String get updateAlreadyInProgress => 'Update is al bezig';
@override
String get updateAlreadyRunning => 'Update wordt al uitgevoerd';
@override
String get genericError => 'Er is een onverwachte fout opgetreden.';
@override
String get couldNotLoadBar => 'Barkassa kon niet worden geladen.';
@override
String get couldNotCreateTabMessage => 'Poef kon niet worden aangemaakt.';
@override
String get productOutOfStock => 'Product is niet op voorraad.';
@override
String get couldNotAddProductToTab =>
'Product kon niet aan de poef worden toegevoegd.';
@override
String get couldNotUpdateQuantity => 'Aantal kon niet worden bijgewerkt.';
@override
String get couldNotReloadTabs => 'Poefs konden niet opnieuw worden geladen.';
@override
String get couldNotLoadHistory => 'Geschiedenis kon niet worden geladen.';
@override
String get couldNotLoadMoreTabs => 'Meer poefs konden niet worden geladen.';
@override
String get couldNotLoadProducts => 'Producten konden niet worden geladen.';
@override
String get couldNotAddProduct => 'Product kon niet worden toegevoegd.';
@override
String get couldNotUpdateProduct => 'Product kon niet worden bijgewerkt.';
@override
String get couldNotDeleteProductMessage =>
'Product kon niet worden verwijderd.';
@override
String get couldNotCheckPinStatus =>
'PIN-status kon niet worden gecontroleerd.';
@override
String get couldNotVerifyPin => 'PIN kon niet worden gecontroleerd.';
@override
String get currentPinIncorrect => 'Huidige PIN is onjuist.';
@override
String get couldNotLoadSettings => 'Instellingen konden niet worden geladen.';
@override
String get couldNotSaveSettings =>
'Instellingen konden niet worden opgeslagen.';
@override
String get downloadFailedWithDetail => 'Download mislukt.';
@override
String get installationFailedWithDetail => 'Installatie mislukt.';
@override
String get devMenu => 'Ontwikkelaarsmenu';
@override
String get dataManagement => 'Databeheer';
@override
String get clearOpenTabs => 'Alle open poefs wissen';
@override
String get clearClosedHistory => 'Geschiedenis van gesloten poefs wissen';
@override
String get seedDefaultProducts => 'Standaardproducten vullen';
@override
String get onlySeedsWhenEmpty => 'Alleen vullen als de tabel leeg is';
@override
String get clearAndReseedProducts => 'Producten wissen en opnieuw vullen';
@override
String get wipesAndReseeds =>
'Wist alle producten en vult de standaardproducten opnieuw';
@override
String get clearAllProducts => 'Alle producten wissen';
@override
String get clearProductImages => 'Productafbeeldingen wissen';
@override
String get deletesProductImages =>
'Verwijdert afbeeldingen uit de map product_images';
@override
String get debugging => 'Debuggen';
@override
String get resetPin => 'PIN resetten';
@override
String get removePinLock => 'PIN-vergrendeling verwijderen';
@override
String get toggleDebugOverlay => 'Debug-overlay in-/uitschakelen';
@override
String get showFpsMemoryWidgets => 'FPS, geheugen en widgets tonen';
@override
String get errorScreenMenu => 'Foutscherm';
@override
String get viewErrorScreen => 'Het foutscherm bekijken';
@override
String get featureToggles => 'Functieschakelaars';
@override
String get simulateUpdateDownload => 'Updatedownload simuleren';
@override
String get openDownloadProgress => 'Downloadvoortgang openen';
@override
String get testingHelpers => 'Testhelpers';
@override
String get createTestTab => 'Testtabblad maken';
@override
String get addRandomItems => 'Tabblad met willekeurige items toevoegen';
@override
String get addTestProducts => '100 testproducten toevoegen';
@override
String get stressTestGrid => 'Productraster stresstesten';
@override
String get simulateLowStock => 'Lage voorraad simuleren';
@override
String get setProductsBelowThreshold =>
'Alle producten onder de drempel instellen';
@override
String get generateMockOrders => '100 testbestellingen genereren';
@override
String get randomCustomersItemsAmounts =>
'Willekeurige klanten, items en bedragen';
@override
String get performance => 'Prestaties';
@override
String get clearImageCache => 'Afbeeldingencache wissen';
@override
String get reloadProductImages => 'Productafbeeldingen opnieuw laden';
@override
String get debugOverlay => 'Debug-overlay';
@override
String get debugOverlayDescription =>
'De debug-overlay toont FPS, geheugengebruik en het aantal widgets. Schakel deze in via Flutter DevTools in debugmodus.';
@override
String get ok => 'OK';
@override
String get simulateUpdate => 'Update simuleren';
@override
String get chooseSimulationMode => 'Kies een simulatiemodus:';
@override
String get successfulDownload => 'Geslaagde download';
@override
String get progressThenInstall =>
'Voortgang 0→100%, daarna installeren en voltooien';
@override
String get downloadError => 'Downloadfout';
@override
String get failsWithNetworkTimeout =>
'Mislukt bij 50% door een netwerktime-out';
@override
String get realDownloadWillFail => 'Echte download (mislukt)';
@override
String get attemptsFakeUrl => 'Probeert OTA met een valse URL';
@override
String get categoryBeer => 'Bier';
@override
String get categoryWine => 'Wijn';
@override
String get categorySoftDrinks => 'Frisdrank';
@override
String get categoryCocktails => 'Cocktails';
@override
String get categorySnacks => 'Snacks';
@override
String get categoryCoffee => 'Koffie';
@override
String get categoryTea => 'Thee';
@override
String get categoryOther => 'Overig';
@override
String get devActionClearedOpenTabs => 'Alle open tabbladen gewist';
@override
String get devActionClearedHistory =>
'Geschiedenis van gesloten tabbladen gewist';
@override
String get devActionClearedProducts => 'Alle producten gewist';
@override
String devActionSeededProducts(int count) {
return '$count producten toegevoegd';
}
@override
String devActionReseededProducts(int count) {
return '$count producten gewist en opnieuw toegevoegd';
}
@override
String get devActionImagesCleared => 'Productafbeeldingen gewist';
@override
String get devActionResetPin => 'PIN gereset (geen PIN vereist)';
@override
String get devActionNoProducts => 'Geen producten beschikbaar';
@override
String get devActionImagesReloaded => 'Productafbeeldingen opnieuw geladen';
@override
String get devActionCacheCleared =>
'Afbeeldingencache gewist (geen actie in debugmodus)';
@override
String devActionLowStock(int count) {
return 'Lage voorraad gesimuleerd voor $count producten';
}
@override
String devActionTestTab(int count) {
return 'Testtabblad gemaakt met $count items';
}
@override
String devActionTestProducts(int count) {
return '$count testproducten toegevoegd';
}
@override
String devActionMockOrders(int orders, int customers) {
return '$orders testbestellingen gegenereerd voor $customers klanten';
}
@override
String get devActionFailedImages => 'Afbeeldingen konden niet worden gewist.';
@override
String devActionResetStock(int count) {
return 'Voorraad gereset voor $count producten';
}
@override
String get paymentCash => 'Contant';
@override
String get paymentPayconiq => 'Payconiq';
@override
String get simulatedUpdateNotes => 'Bugfixes en prestatieverbeteringen.';
}
+239
View File
@@ -0,0 +1,239 @@
{
"@@locale": "nl",
"appTitle": "KoolTab",
"barTabs": "Poefs",
"products": "Producten",
"addProduct": "Product toevoegen",
"noProductsYet": "Nog geen producten.",
"addFirstProduct": "Voeg je eerste product toe om te beginnen.",
"manageProducts": "Producten beheren",
"tabHistory": "Geschiedenis",
"refresh": "Vernieuwen",
"settings": "Instellingen",
"logout": "Uitloggen",
"openOrSelectTab": "Open of selecteer eerst een poef.",
"openNewTab": "Nieuw poef openen",
"customerGroupName": "Naam klant / groep",
"cancel": "Annuleren",
"openTab": "Poef openen",
"couldNotCreateTab": "Poef kon niet worden aangemaakt: {error}",
"@couldNotCreateTab": {"placeholders": {"error": {"type": "String"}}},
"searchByName": "Zoeken op naam…",
"allCustomers": "Alle klanten",
"customer": "Klant",
"noClosedTabs": "Nog geen gesloten poefs",
"settingsTitle": "Instellingen",
"security": "Beveiliging",
"pinRequired": "PIN vereist",
"changePin": "PIN wijzigen",
"appearance": "Uiterlijk",
"language": "Taal",
"languageSystem": "Systeemstandaard",
"languageEnglish": "Engels",
"languageDutch": "Nederlands",
"theme": "Thema",
"system": "Systeem",
"light": "Licht",
"dark": "Donker",
"ugly": "Lelijk",
"setPinCode": "PIN instellen",
"enterPin": "PIN invoeren",
"enterCurrentPin": "Huidige PIN invoeren",
"enterNewPin": "Nieuwe PIN invoeren",
"fourDigits": "4 cijfers",
"enterPinFourDigits": "PIN invoeren (4 cijfers)",
"confirm": "Bevestigen",
"confirmPin": "PIN bevestigen",
"pinExactlyFour": "PIN moet precies 4 cijfers bevatten",
"couldNotSavePin": "PIN-instelling kon niet worden opgeslagen.",
"editProduct": "Product bewerken",
"productName": "Productnaam",
"category": "Categorie",
"price": "Prijs",
"stock": "Voorraad",
"lowStockThreshold": "Drempel lage voorraad",
"chooseProductImage": "Productafbeelding kiezen",
"changeImage": "Afbeelding wijzigen",
"deleteProduct": "Product verwijderen?",
"deleteProductDescription": "Dit verwijdert het product uit de productlijst.",
"delete": "Verwijderen",
"productNotFound": "Product niet gevonden.",
"chooseImage": "Kies een productafbeelding.",
"selectCategory": "Selecteer een categorie.",
"enterProductName": "Voer een productnaam in.",
"version": "Versie {version}",
"@version": {"placeholders": {"version": {"type": "String"}}},
"selectTabToAddItems": "Selecteer een poef om items toe te voegen",
"openTabs": "Open poefs",
"selectOrOpenTab": "Selecteer of open een poef",
"noOpenTabs": "Geen open poefs",
"edit": "Bewerken",
"close": "Sluiten",
"tabItemSummary": "{count, plural, =1 {1 item - {total}} other {{count} items - {total}}}",
"@tabItemSummary": {"placeholders": {"count": {"type": "int"}, "total": {"type": "String"}}},
"tabItemCount": "{count, plural, =1 {1 item} other {{count} items}}",
"@tabItemCount": {"placeholders": {"count": {"type": "int"}}},
"tapProductsToAdd": "Tik op producten om ze toe te voegen",
"total": "Totaal",
"closeTab": "Poef sluiten",
"productStockSummary": "{category} • {price} • Voorraad: {stock}",
"@productStockSummary": {"placeholders": {"category": {"type": "String"}, "price": {"type": "String"}, "stock": {"type": "int"}}},
"outOfStock": "UITVERKOCHT",
"tabsYouCloseAppearHere": "Gesloten poefs verschijnen hier.",
"enterPinSubtitle": "Je gebruikt dit om de app te ontgrendelen",
"confirmPinSubtitle": "Voer dezelfde PIN opnieuw in",
"createPin": "PIN aanmaken",
"pinsDidNotMatch": "PINs kwamen niet overeen. Probeer het opnieuw.",
"somethingWentWrong": "Er is iets misgegaan.",
"incorrectPin": "Onjuiste PIN.",
"enterPrice": "Voer een prijs in.",
"enterValidPrice": "Voer een geldige prijs in.",
"enterValidStock": "Voer een geldige voorraad in.",
"enterValidThreshold": "Voer een geldige drempel in.",
"couldNotLoadProduct": "Product kon niet worden geladen.",
"couldNotSaveProduct": "Product kon niet worden opgeslagen.",
"couldNotDeleteProduct": "Product kon niet worden verwijderd.",
"paymentMethod": "Betaalmethode",
"cash": "Contant",
"payconiq": "Payconiq",
"closeTabForCustomer": "Poef van {customerName} sluiten?",
"@closeTabForCustomer": {"placeholders": {"customerName": {"type": "String"}}},
"currentTotal": "Huidig totaal: {total}",
"@currentTotal": {"placeholders": {"total": {"type": "String"}}},
"couldNotCloseTab": "Poef kon niet worden gesloten.",
"closingTab": "Poef sluiten…",
"slideToConfirmClosing": "Schuif om het sluiten te bevestigen",
"errorScreen": "Foutscherm",
"unexpectedError": "Er is een onverwachte fout opgetreden.\nProbeer de app opnieuw te starten.",
"goToBarScreen": "Naar barkassa",
"updates": "Updates",
"checkingForUpdates": "Controleren op updates…",
"checkForUpdates": "Controleren op updates",
"latestVersion": "Je gebruikt al de nieuwste versie.",
"updateCheckFailed": "Controleren op updates mislukt.",
"updateAvailable": "Update beschikbaar",
"versionAvailable": "Versie {version} is beschikbaar.",
"@versionAvailable": {"placeholders": {"version": {"type": "String"}}},
"later": "Later",
"update": "Updaten",
"updateReady": "Update klaar",
"updateReadyDescription": "De update is gedownload en geïnstalleerd. Start de app nu opnieuw om de wijzigingen toe te passen.",
"restartApp": "App opnieuw starten",
"updateFailed": "Update mislukt",
"retry": "Opnieuw proberen",
"updating": "Updaten",
"installing": "Installeren",
"doNotCloseDuringUpdate": "Sluit de app niet tijdens de update",
"cancelUpdate": "Update annuleren?",
"cancelUpdateDescription": "De update is bezig. Als je nu weggaat, kan de app instabiel worden.",
"continueUpdate": "Update voortzetten",
"cancelUpdateAction": "Update annuleren",
"preparingDownload": "Download voorbereiden…",
"simulatedDownloadError": "Gesimuleerde downloadfout (netwerktime-out)",
"downloadFailed": "Download mislukt",
"downloading": "Downloaden {percent}%",
"@downloading": {"placeholders": {"percent": {"type": "String"}}},
"installingUpdate": "Update installeren…",
"updateInstalledRestarting": "Update geïnstalleerd! Opnieuw starten…",
"installationFailed": "Installatie mislukt",
"updateAlreadyInProgress": "Update is al bezig",
"updateAlreadyRunning": "Update wordt al uitgevoerd",
"genericError": "Er is een onverwachte fout opgetreden.",
"couldNotLoadBar": "Barkassa kon niet worden geladen.",
"couldNotCreateTabMessage": "Poef kon niet worden aangemaakt.",
"productOutOfStock": "Product is niet op voorraad.",
"couldNotAddProductToTab": "Product kon niet aan de poef worden toegevoegd.",
"couldNotUpdateQuantity": "Aantal kon niet worden bijgewerkt.",
"couldNotReloadTabs": "Poefs konden niet opnieuw worden geladen.",
"couldNotLoadHistory": "Geschiedenis kon niet worden geladen.",
"couldNotLoadMoreTabs": "Meer poefs konden niet worden geladen.",
"couldNotLoadProducts": "Producten konden niet worden geladen.",
"couldNotAddProduct": "Product kon niet worden toegevoegd.",
"couldNotUpdateProduct": "Product kon niet worden bijgewerkt.",
"couldNotDeleteProductMessage": "Product kon niet worden verwijderd.",
"couldNotCheckPinStatus": "PIN-status kon niet worden gecontroleerd.",
"couldNotVerifyPin": "PIN kon niet worden gecontroleerd.",
"currentPinIncorrect": "Huidige PIN is onjuist.",
"couldNotLoadSettings": "Instellingen konden niet worden geladen.",
"couldNotSaveSettings": "Instellingen konden niet worden opgeslagen.",
"downloadFailedWithDetail": "Download mislukt.",
"installationFailedWithDetail": "Installatie mislukt.",
"devMenu": "Ontwikkelaarsmenu",
"dataManagement": "Databeheer",
"clearOpenTabs": "Alle open poefs wissen",
"clearClosedHistory": "Geschiedenis van gesloten poefs wissen",
"seedDefaultProducts": "Standaardproducten vullen",
"onlySeedsWhenEmpty": "Alleen vullen als de tabel leeg is",
"clearAndReseedProducts": "Producten wissen en opnieuw vullen",
"wipesAndReseeds": "Wist alle producten en vult de standaardproducten opnieuw",
"clearAllProducts": "Alle producten wissen",
"clearProductImages": "Productafbeeldingen wissen",
"deletesProductImages": "Verwijdert afbeeldingen uit de map product_images",
"debugging": "Debuggen",
"resetPin": "PIN resetten",
"removePinLock": "PIN-vergrendeling verwijderen",
"toggleDebugOverlay": "Debug-overlay in-/uitschakelen",
"showFpsMemoryWidgets": "FPS, geheugen en widgets tonen",
"errorScreenMenu": "Foutscherm",
"viewErrorScreen": "Het foutscherm bekijken",
"featureToggles": "Functieschakelaars",
"simulateUpdateDownload": "Updatedownload simuleren",
"openDownloadProgress": "Downloadvoortgang openen",
"testingHelpers": "Testhelpers",
"createTestTab": "Testtabblad maken",
"addRandomItems": "Tabblad met willekeurige items toevoegen",
"addTestProducts": "100 testproducten toevoegen",
"stressTestGrid": "Productraster stresstesten",
"simulateLowStock": "Lage voorraad simuleren",
"setProductsBelowThreshold": "Alle producten onder de drempel instellen",
"generateMockOrders": "100 testbestellingen genereren",
"randomCustomersItemsAmounts": "Willekeurige klanten, items en bedragen",
"performance": "Prestaties",
"clearImageCache": "Afbeeldingencache wissen",
"reloadProductImages": "Productafbeeldingen opnieuw laden",
"debugOverlay": "Debug-overlay",
"debugOverlayDescription": "De debug-overlay toont FPS, geheugengebruik en het aantal widgets. Schakel deze in via Flutter DevTools in debugmodus.",
"ok": "OK",
"simulateUpdate": "Update simuleren",
"chooseSimulationMode": "Kies een simulatiemodus:",
"successfulDownload": "Geslaagde download",
"progressThenInstall": "Voortgang 0→100%, daarna installeren en voltooien",
"downloadError": "Downloadfout",
"failsWithNetworkTimeout": "Mislukt bij 50% door een netwerktime-out",
"realDownloadWillFail": "Echte download (mislukt)",
"attemptsFakeUrl": "Probeert OTA met een valse URL",
"categoryBeer": "Bier",
"categoryWine": "Wijn",
"categorySoftDrinks": "Frisdrank",
"categoryCocktails": "Cocktails",
"categorySnacks": "Snacks",
"categoryCoffee": "Koffie",
"categoryTea": "Thee",
"categoryOther": "Overig",
"devActionClearedOpenTabs": "Alle open tabbladen gewist",
"devActionClearedHistory": "Geschiedenis van gesloten tabbladen gewist",
"devActionClearedProducts": "Alle producten gewist",
"devActionSeededProducts": "{count} producten toegevoegd",
"@devActionSeededProducts": {"placeholders": {"count": {"type": "int"}}},
"devActionReseededProducts": "{count} producten gewist en opnieuw toegevoegd",
"@devActionReseededProducts": {"placeholders": {"count": {"type": "int"}}},
"devActionImagesCleared": "Productafbeeldingen gewist",
"devActionResetPin": "PIN gereset (geen PIN vereist)",
"devActionNoProducts": "Geen producten beschikbaar",
"devActionImagesReloaded": "Productafbeeldingen opnieuw geladen",
"devActionCacheCleared": "Afbeeldingencache gewist (geen actie in debugmodus)",
"devActionLowStock": "Lage voorraad gesimuleerd voor {count} producten",
"@devActionLowStock": {"placeholders": {"count": {"type": "int"}}},
"devActionTestTab": "Testtabblad gemaakt met {count} items",
"@devActionTestTab": {"placeholders": {"count": {"type": "int"}}},
"devActionTestProducts": "{count} testproducten toegevoegd",
"@devActionTestProducts": {"placeholders": {"count": {"type": "int"}}},
"devActionMockOrders": "{orders} testbestellingen gegenereerd voor {customers} klanten",
"@devActionMockOrders": {"placeholders": {"orders": {"type": "int"}, "customers": {"type": "int"}}},
"devActionFailedImages": "Afbeeldingen konden niet worden gewist.",
"devActionResetStock": "Voorraad gereset voor {count} producten",
"@devActionResetStock": {"placeholders": {"count": {"type": "int"}}},
"paymentCash": "Contant",
"paymentPayconiq": "Payconiq",
"simulatedUpdateNotes": "Bugfixes en prestatieverbeteringen."
}